static void SubEntity_tintColour( SubEntity* self, const String& groupName, const String& materialName, const Ogre::ColourValue& colour ) { Ogre::MaterialPtr baseMaterial = Ogre::MaterialManager::getSingleton().getByName(materialName); Ogre::MaterialPtr materialPtr = baseMaterial->clone(groupName); materialPtr->compile(); Ogre::TextureUnitState* ptus = materialPtr->getTechnique(0)->getPass(0)->getTextureUnitState(0); ptus->setColourOperationEx(Ogre::LBX_MODULATE, Ogre::LBS_MANUAL, Ogre::LBS_TEXTURE, colour); self->setMaterial(materialPtr); }
Ogre::MaterialPtr OgrePlanarReflectionMaterial::createMaterial(const Ogre::TexturePtr& texture, const Ogre::Camera& projectionCamera) { using namespace::Ogre; Ogre::MaterialPtr matPtr = MaterialManager::getSingleton().create(this->getName(),"General"); Ogre::TextureUnitState* t; if(! textureFilename.getValue().empty() ) { t = matPtr->getTechnique(0)->getPass(0)->createTextureUnitState(textureFilename.getValue()); } t = matPtr->getTechnique(0)->getPass(0)->createTextureUnitState(texture->getName() ); t->setColourOperationEx(Ogre::LBX_BLEND_MANUAL, Ogre::LBS_TEXTURE, Ogre::LBS_CURRENT, Ogre::ColourValue::White, Ogre::ColourValue::White, blendingFactor.getValue()); t->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); t->setProjectiveTexturing(true,&projectionCamera); matPtr->compile(); return matPtr; }
void ReloadMaterial(const std::string& materialName, const std::string& groupName, const std::string& filename, bool parseMaterialScript) { if (materialName.empty()) { Ogre::LogManager::getSingleton().logMessage("Material name is empty."); return; } if (groupName.empty()) { Ogre::LogManager::getSingleton().logMessage("Group name is empty."); return; } if (filename.empty()) { Ogre::LogManager::getSingleton().logMessage("Filename is empty."); return; } UnloadMaterials(filename); UnloadVertexPrograms(filename); UnloadFragmentPrograms(filename); if (parseMaterialScript) { Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(filename); if(!stream.isNull()) { try { Ogre::MaterialManager::getSingleton().parseScript(stream, groupName); Ogre::MaterialPtr materialPtr = Ogre::MaterialManager::getSingleton().getByName(materialName); if (!materialPtr.isNull()) { materialPtr->compile(); materialPtr->load(); } } catch (Ogre::Exception &e) { StringUtil::StrStreamType msg; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } stream->close(); /// /// RELOAD MATERIAL SCRIPT CONTENTS /// stream = Ogre::ResourceGroupManager::getSingleton().openResource(filename); if(!stream.isNull()) { try { /// /// RELOAD ALL MATERIAL CONTENTS IN FILE /// while(!stream->eof()) { std::string line = stream->getLine(); StringUtil::trim(line); /// /// RELOAD MATERIALS /// if (StringUtil::startsWith(line, "material")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t:"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { LoadResource(Ogre::MaterialManager::getSingletonPtr(), match, groupName); break; } } } /// /// RELOAD VERTEX PROGRAMS /// if (StringUtil::startsWith(line, "vertex_program") && !StringUtil::startsWith(line, "vertex_program_ref")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { LoadResource(Ogre::HighLevelGpuProgramManager::getSingletonPtr(), match, groupName); break; } } } /// /// RELOAD FRAGMENT PROGRAMS /// if (StringUtil::startsWith(line, "fragment_program") && !StringUtil::startsWith(line, "fragment_program_ref")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { LoadResource(Ogre::HighLevelGpuProgramManager::getSingletonPtr(), match, groupName); break; } } } } } catch (Ogre::Exception &e) { StringUtil::StrStreamType msg; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } stream->close(); try { // Do a render test if it fails, leave materials unloaded Ogre::Root::getSingleton().renderOneFrame(); return; } catch (Ogre::Exception &e) { UnloadVertexPrograms(filename); StringUtil::StrStreamType msg; msg << "Render test failed. Unloading vertex programs." << std::endl; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } try { // Do a render test if it fails, leave materials unloaded Ogre::Root::getSingleton().renderOneFrame(); } catch (Ogre::Exception &e) { // Don't load the script this time ReloadMaterial(materialName, groupName, filename, false); StringUtil::StrStreamType msg; msg << "Render test failed. Unloading materials." << std::endl; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } }
//-------------------------------------------------------------------------------------------------- bool DiscoApplication::frameStarted( const Ogre::FrameEvent& evt ) { static Ogre::Timer a; static uint32_t lastTimeMS; static uint32_t curTimeMS; curTimeMS = a.getMilliseconds(); uint32_t timeDiffMS = curTimeMS - lastTimeMS; if ( timeDiffMS > 0 ) { //printf( "FPS = %f\n", 1000.0/(float)timeDiffMS );//1.0/((float)timeDiffMS/1000.0) ); } lastTimeMS = curTimeMS; const int32_t MAX_DEPTH_MM = 10000; const float FOCAL_LENGTH = 0.525f; // Focal length in metres const float FADE_START_XZ_DISTANCE = 0.5f; const float FADE_MAX_XZ_DISTANCE = 6.0f; xn::SceneMetaData sceneMD; xn::DepthMetaData depthMD; mpKinectController->getContext().WaitAndUpdateAll(); mpKinectController->getDepthGenerator().GetMetaData( depthMD ); mpKinectController->getUserGenerator().GetUserPixels( 0, sceneMD ); XnUserID userIdx[15]; XnUInt16 numUsers = 15; mpKinectController->getUserGenerator().GetUsers( userIdx, numUsers ); if ( 0 == numUsers ) { // Restart the time if there are no users to record mRecordingGapTimer.reset(); } else { for ( uint32_t i = 0; i < numUsers; i++ ) { if ( tryToAttachParticleToUser( userIdx[ i ] ) ) { break; } } } // Start recording if we see a person if ( numUsers > 0 && !mbRecording && mRecordingGapTimer.getMilliseconds() > TIME_BETWEEN_RECORDINGS_MS ) { mbRecording = true; memset( mpImageData, 0, RECORDED_DATA_SIZE ); mRecordingFrameIdx = 0; } // Build an accumulative histogram to work out the colour for each point uint32_t depthHist[ MAX_DEPTH_MM ]; memset( depthHist, 0, sizeof( depthHist ) ); uint32_t numPoints = 0; const XnDepthPixel* pDepth = depthMD.Data(); int32_t recordingPixelStepX = depthMD.XRes() / SMALL_FRAME_WIDTH; int32_t recordingPixelStepY = depthMD.YRes() / SMALL_FRAME_HEIGHT; if ( recordingPixelStepX <= 0 ) recordingPixelStepX = 1; if ( recordingPixelStepY <= 0 ) recordingPixelStepY = 1; for ( uint32_t y = 0; y < depthMD.YRes(); y++ ) { for ( uint32_t x = 0; x < depthMD.XRes(); x++ ) { XnUInt16 value = *pDepth; if ( 0 != value ) { depthHist[ value ]++; numPoints++; } pDepth++; } } for ( uint32_t i = 1; i < MAX_DEPTH_MM; i++ ) { depthHist[ i ] += depthHist[ i - 1 ]; } if ( numPoints > 0 ) { for ( uint32_t i = 1; i < MAX_DEPTH_MM; i++ ) { depthHist[ i ] = (unsigned int)(256 * (1.0f - ((float)depthHist[ i ] / numPoints))); } } // Update the point cloud to reflect the depth data const float COLOURS[][3] = { {0,1,1}, {0,0,1}, {0,1,0}, {1,1,0}, {1,0,0}, {1,.5,0}, {.5,1,0}, {0,.5,1}, {.5,0,1}, {1,1,.5}, {1,1,1} }; const uint32_t NUM_COLOURS = 10; pDepth = depthMD.Data(); const XnLabel* pLabels = sceneMD.Data(); mpRosPointCloud->clear(); ogre_tools::PointCloud::Point* pPoints = new ogre_tools::PointCloud::Point[ numPoints ]; int32_t pointIdx = 0; int32_t width = depthMD.XRes(); int32_t height = depthMD.YRes(); int32_t halfWidth = width / 2; int32_t halfHeight = height / 2; for ( int32_t y = 0; y < height; y++ ) { for ( int32_t x = 0; x < width; x++ ) { XnUInt16 value = *pDepth; XnLabel label = *pLabels; XnUInt32 colorId = label % NUM_COLOURS; float fade = 1.0; if (label == 0) { // Ignore background colorId = NUM_COLOURS; } { float worldZ = (float)(*pDepth)/1000.0; // Convert from mm to m float worldX = (((float)(x-halfWidth)/1000.0)*worldZ) / FOCAL_LENGTH; float distanceXZ = sqrtf( worldX*worldX + worldZ*worldZ ); if ( distanceXZ > FADE_MAX_XZ_DISTANCE ) { fade = 0.0f; } else if ( distanceXZ > FADE_START_XZ_DISTANCE ) { fade = 1.0 - (distanceXZ - FADE_START_XZ_DISTANCE)/(FADE_MAX_XZ_DISTANCE - FADE_START_XZ_DISTANCE); } } if ( //mbRecording 0 != value && fade > 0.0 && ( SHOW_BACKGROUND || label != 0 ) ) { float worldZ = (float)(*pDepth)/1000.0; // Convert from mm to m float worldX = (((float)(x-halfWidth)/1000.0)*worldZ) / FOCAL_LENGTH; float worldY = (((float)(y-halfHeight)/1000.0)*worldZ) / FOCAL_LENGTH; //float worldY = (((float)(((height-1)-y)-halfHeight)/1000.0)*worldZ) / FOCAL_LENGTH; float histValue = (float)depthHist[ value ]/255.0; pPoints[ pointIdx ].setColor( fade * histValue * COLOURS[ colorId ][ 0 ], fade * histValue * COLOURS[ colorId ][ 1 ], fade * histValue * COLOURS[ colorId ][ 2 ] ); pPoints[ pointIdx ].x = worldX; pPoints[ pointIdx ].y = worldY; pPoints[ pointIdx ].z = worldZ; pointIdx++; if ( mbRecording && label != 0 && x%recordingPixelStepX == 0 && y%recordingPixelStepY == 0 ) { int32_t smallFrameX = x / recordingPixelStepX; int32_t smallFrameY = y / recordingPixelStepY; int32_t smallPixelIdx = mRecordingFrameIdx*SMALL_FRAME_WIDTH*SMALL_FRAME_HEIGHT + smallFrameY*SMALL_FRAME_WIDTH + smallFrameX; //((uint16_t*)mpImageData)[ smallPixelIdx ] = 0xFFFF; //((uint32_t*)mpImageData)[ smallPixelIdx ] = 0xFFFFFFFF; mpImageData[ smallPixelIdx ] = 0xFF; // 255; //(uint8_t)(fade * histValue * 255.0); //printf( "recorded %i to pixel %i\n", mpImageData[ smallPixelIdx ], smallPixelIdx ); } } pDepth++; pLabels++; } } mpRosPointCloud->addPoints( pPoints, pointIdx ); //printf( "Added %i points\n", pointIdx ); delete [] pPoints; // Draw the crowd uint32_t numCrowdMembers = mCrowdMembers.size(); mpCrowdObject->clear(); mpCrowdObject->estimateVertexCount( numCrowdMembers*4 ); mpCrowdObject->estimateIndexCount( numCrowdMembers*12 ); for ( uint32_t personIdx = 0; personIdx < numCrowdMembers; personIdx++ ) { CrowdMember& crowdMember = mCrowdMembers[ personIdx ]; float startV = (float)crowdMember.mFrameIdx/(float)NUM_FRAMES_TO_RECORD; float endV = (float)(crowdMember.mFrameIdx+1)/(float)NUM_FRAMES_TO_RECORD; mpCrowdObject->begin( crowdMember.mMaterialName, Ogre::RenderOperation::OT_TRIANGLE_LIST ); //float startV = 0.0; //(float)crowdMember.mFrameIdx/(float)NUM_FRAMES_TO_RECORD; //float endV = 1.0;// (float)(crowdMember.mFrameIdx+1)/(float)NUM_FRAMES_TO_RECORD; //mpCrowdObject->begin( "Template/CutOut", Ogre::RenderOperation::OT_TRIANGLE_LIST ); mpCrowdObject->position( crowdMember.mPos + Ogre::Vector3( -0.5f, -0.375f, 0.0f ) ); mpCrowdObject->textureCoord( 0.0, startV ); mpCrowdObject->colour( COLOURS[ crowdMember.mColourIdx ][ 0 ], COLOURS[ crowdMember.mColourIdx ][ 1 ], COLOURS[ crowdMember.mColourIdx ][ 2 ], 1.0 ); mpCrowdObject->position( crowdMember.mPos + Ogre::Vector3( 0.5f, -0.375f, 0.0f ) ); mpCrowdObject->textureCoord( 1.0, startV ); mpCrowdObject->position( crowdMember.mPos + Ogre::Vector3( 0.5f, 0.375f, 0.0f ) ); mpCrowdObject->textureCoord( 1.0, endV ); mpCrowdObject->position( crowdMember.mPos + Ogre::Vector3( -0.5f, 0.375f, 0.0f ) ); mpCrowdObject->textureCoord( 0.0, endV ); //mpCrowdObject->quad( 0, 1, 2, 3 ); mpCrowdObject->quad( 3, 2, 1, 0 ); mpCrowdObject->end(); // Move to the next frame if ( crowdMember.mbReversing ) { crowdMember.mFrameIdx--; if ( crowdMember.mFrameIdx < 0 ) { crowdMember.mFrameIdx = 1; crowdMember.mbReversing = false; } } else { crowdMember.mFrameIdx++; if ( crowdMember.mFrameIdx >= NUM_FRAMES_TO_RECORD ) { crowdMember.mFrameIdx = NUM_FRAMES_TO_RECORD-1; crowdMember.mbReversing = true; } } } // Check to see if we can stop recording if ( mbRecording ) { mRecordingFrameIdx++; if ( mRecordingFrameIdx >= NUM_FRAMES_TO_RECORD ) { // Create a new crowd member Ogre::Image image; image.loadDynamicImage( mpImageData, SMALL_FRAME_WIDTH, NUM_FRAMES_TO_RECORD*SMALL_FRAME_HEIGHT, 1, Ogre::PF_A4L4 ); std::stringstream ss; ss << "RecordedSequenceTex_" << numCrowdMembers; Ogre::String texName = ss.str(); Ogre::TextureManager* pTextureMgr = Ogre::TextureManager::getSingletonPtr(); Ogre::TexturePtr pTexture = pTextureMgr->loadImage( texName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, image ); ss.clear(); ss << "RecordedSequenceMat_" << numCrowdMembers; Ogre::String matName = ss.str(); Ogre::MaterialManager* pMatMgr = Ogre::MaterialManager::getSingletonPtr(); Ogre::MaterialPtr pSrcMat = (Ogre::MaterialPtr)pMatMgr->getByName( "Template/CutOut", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); Ogre::MaterialPtr pMat = pSrcMat->clone( matName ); // (Ogre::MaterialPtr)pMatMgr->create( matName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); pMat->getTechnique( 0 )->getPass( 0 )->removeAllTextureUnitStates(); Ogre::TextureUnitState* pTex = pMat->getTechnique( 0 )->getPass( 0 )->createTextureUnitState( texName, 0 ); pMat->getTechnique( 0 )->getPass( 0 )->addTextureUnitState( pTex ); /*Ogre::Technique* pTech = pMat->getTechnique( 0 ); pTech->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA ); Ogre::Pass *pPass = pTech->createPass(); pPass->setLightingEnabled( false ); pPass->setAmbient( 1.0, 1.0, 1.0 ); pPass->setDiffuse( 1.0, 1.0, 1.0, 1.0 ); pPass->setSpecular( 0.0, 0.0, 0.0, 0.0 ); Ogre::ColourValue val(0.0f, 0.0f, 0.0f, 1.0f); pPass->setSelfIllumination(val); //pPass->setE ( 0.0, 0.0, 0.0, 0.0 ); pPass->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA ); pPass->setDepthWriteEnabled( false ); Ogre::TextureUnitState* pTex = pPass->createTextureUnitState( texName, 0 ); pPass->addTextureUnitState( pTex ); pTex->setColourOperation( Ogre::LBO_MODULATE );*/ pMat->setCullingMode( Ogre::CULL_NONE ); pMat->compile(); CrowdMember crowdMember; crowdMember.mMaterialName = matName; crowdMember.mFrameIdx = 0; crowdMember.mColourIdx = rand()%NUM_COLOURS; crowdMember.mbReversing = false; int32_t rowIdx = rand()%NUM_ROWS; float angle = MIN_CROWD_ANGLE + ((float)rand()/(float)RAND_MAX)*(MAX_CROWD_ANGLE-MIN_CROWD_ANGLE); float x = ROW_DEPTHS[ rowIdx ]*sin( angle ); float z = ROW_DEPTHS[ rowIdx ]*cos( angle ); crowdMember.mPos = Ogre::Vector3( x, ROW_HEIGHTS[ rowIdx ], z ); mCrowdMembers.push_back( crowdMember ); mbRecording = false; mRecordingGapTimer.reset(); // Reset time so that there's a gap between recording printf( "Got frame\n" ); } } return true; }
//----------------------------------------------------------------------- void MaterialTab::OnLoadTexture(wxCommandEvent& event) { // Add a new directory and parse all resources in that directory wxFileDialog loadDialog(this, _("Load a texture"), wxT(""), wxT(""), _("Textures (*.*)|*.*"), wxFD_OPEN, wxDefaultPosition, wxDefaultSize, _("Load")); if (loadDialog.ShowModal() == wxID_OK) { SetCursor(*wxHOURGLASS_CURSOR); Ogre::TextureUnitState* tut = 0; // User has pressed ok, so load the texture Ogre::String fileName = wx2ogre(loadDialog.GetFilename()); Ogre::String path = wx2ogre(loadDialog.GetPath()); Ogre::String baseName; // should be the same as fileName Ogre::String extension; Ogre::String dir; Ogre::StringUtil::splitFullFilename(path, baseName, extension, dir); // Validate the extension Ogre::String types = "bmp,ico,jpg,jif,jpeg,jpe,jng,koa,iff,lbm,mng,pbm,pbm,pcd,pcx,pgm,pgm,png,ppm,ppm,ras,tga,targa,tif,tiff,wap,wbmp,wbm,psd,cut,xbm,xpm,gif,hdr,g3,sgi,exr,j2k,j2c,jp2,pfm,pct,pict,pic,bay,bmq,cr2,crw,cs1,dc2,dcr,dng,erf,fff,hdr,k25,kdc,mdc,mos,mrw,nef,orf,pef,pxn,raf,raw,rdc,sr2,srf,arw,3fr,cine,ia,kc2,mef,nrw,qtk,rw2,sti,drf,dsc,ptx,cap,iiq,rwz,dds"; Ogre::StringUtil::toLowerCase(extension); if (types.find(extension) == Ogre::String::npos) return; // Unsupported format // Load the resource Ogre::ResourceGroupManager::getSingletonPtr()->removeResourceLocation(dir, TEMP_TEXTURE_GROUP); Ogre::ResourceGroupManager::getSingletonPtr()->addResourceLocation(dir, "FileSystem", TEMP_TEXTURE_GROUP); Ogre::ResourceGroupManager::getSingletonPtr()->clearResourceGroup(TEMP_TEXTURE_GROUP); Ogre::ResourceGroupManager::getSingletonPtr()->initialiseResourceGroup(TEMP_TEXTURE_GROUP); Ogre::TextureManager::getSingleton().prepare(fileName, TEMP_TEXTURE_GROUP); Ogre::TextureManager::getSingleton().load(fileName, TEMP_TEXTURE_GROUP); Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().getByName(fileName, TEMP_TEXTURE_GROUP); if (!texture.isNull()) { // Set the texture name tut = forceCreateFirstTexture(fileName); // Return texture unit state if (tut) { tut->setName(fileName); mTxtTextureLoad->SetValue(loadDialog.GetFilename()); } // Compile the material wxString materialName = mMaterialListBox->GetStringSelection(); Ogre::String name = wx2ogre(materialName); Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().getByName(name); if (!material.isNull()) { material->compile(); } mResourceLocationTexture = ogre2wx(dir); } // Display image viewTexture(tut); // Clear the old texture if no TextureUnitState SetCursor(wxNullCursor); } }
void OgreCPP::createNewCrowdMember( float animationTime ) { char buffer[ 512 ]; uint32_t numCrowdMembers = mCrowdMembers.size(); // Create a new crowd member Ogre::TextureManager* pTextureMgr = Ogre::TextureManager::getSingletonPtr(); Ogre::String frameTexNames[ 2*NUM_FRAMES_TO_RECORD ]; Ogre::String lowResFrameTexNames[ 2*NUM_FRAMES_TO_RECORD ]; for ( uint32_t frameIdx = 0; frameIdx < NUM_FRAMES_TO_RECORD; frameIdx++ ) { Ogre::Image image; image.loadDynamicImage( mpImageData + frameIdx*SMALL_FRAME_WIDTH*SMALL_FRAME_HEIGHT, SMALL_FRAME_WIDTH, SMALL_FRAME_HEIGHT, 1, Ogre::PF_A4L4 ); sprintf( buffer, "RecordedSequenceTex_%i_%i", numCrowdMembers, frameIdx ); frameTexNames[ frameIdx ] = buffer; Ogre::TexturePtr pTexture = pTextureMgr->loadImage( frameTexNames[ frameIdx ], Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, image ); sprintf( buffer, "LowResRecordedSequenceTex_%i_%i", numCrowdMembers, frameIdx ); lowResFrameTexNames[ frameIdx ] = buffer; Ogre::Image lowResImage; lowResImage.loadDynamicImage( mpLowResImageData + frameIdx*LOW_RES_SMALL_FRAME_WIDTH*LOW_RES_SMALL_FRAME_HEIGHT, LOW_RES_SMALL_FRAME_WIDTH, LOW_RES_SMALL_FRAME_HEIGHT, 1, Ogre::PF_A4L4 ); pTextureMgr->loadImage( lowResFrameTexNames[ frameIdx ], Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, lowResImage ); } for ( uint32_t frameIdx = 0; frameIdx < NUM_FRAMES_TO_RECORD; frameIdx++ ) { frameTexNames[ (2*NUM_FRAMES_TO_RECORD - 1) - frameIdx ] = frameTexNames[ frameIdx ]; lowResFrameTexNames[ (2*NUM_FRAMES_TO_RECORD - 1) - frameIdx ] = lowResFrameTexNames[ frameIdx ]; } // Create materials for the crowd member sprintf( buffer, "RecordedSequenceMat_%i", numCrowdMembers ); Ogre::String matName = buffer; Ogre::MaterialManager* pMatMgr = Ogre::MaterialManager::getSingletonPtr(); Ogre::MaterialPtr pSrcMat = (Ogre::MaterialPtr)pMatMgr->getByName( "Template/CutOut", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); Ogre::MaterialPtr pMat = pSrcMat->clone( matName ); pMat->getTechnique( 0 )->getPass( 0 )->removeAllTextureUnitStates(); Ogre::TextureUnitState* pTex = pMat->getTechnique( 0 )->getPass( 0 )->createTextureUnitState(); pMat->getTechnique( 0 )->getPass( 0 )->addTextureUnitState( pTex ); pTex->setAnimatedTextureName( frameTexNames, 2*NUM_FRAMES_TO_RECORD, 2.0*animationTime ); pMat->setCullingMode( Ogre::CULL_NONE ); pMat->compile(); sprintf( buffer, "LowResRecordedSequenceMat_%i", numCrowdMembers ); Ogre::String lowResMatName = buffer; pMat = pSrcMat->clone( lowResMatName ); pMat->getTechnique( 0 )->getPass( 0 )->removeAllTextureUnitStates(); pTex = pMat->getTechnique( 0 )->getPass( 0 )->createTextureUnitState(); pMat->getTechnique( 0 )->getPass( 0 )->addTextureUnitState( pTex ); pTex->setAnimatedTextureName( lowResFrameTexNames, 2*NUM_FRAMES_TO_RECORD, 2.0*animationTime ); pMat->setCullingMode( Ogre::CULL_NONE ); pMat->compile(); CrowdMember newCrowdMember; newCrowdMember.mMaterialName = matName; newCrowdMember.mLowResMaterialName = lowResMatName; newCrowdMember.mFrameIdx = 0; newCrowdMember.mColourIdx = rand()%NUM_COLOURS; newCrowdMember.mbReversing = false; num = mCrowdMembers.size()%11; /** POSITION CROWD MEMBER HERE **/ float x = (num*(5.0/11.0))-2.25; float y = 1.5; /* centre is 0,0, extremes are -3,+3 */ newCrowdMember.mPos = Ogre::Vector3( x, y, 5.0 ); newCrowdMember.mRow = 0; newCrowdMember.mpBillboard = OGRE_NEW PersonBillboard(); newCrowdMember.mpBillboard->setMaterial( newCrowdMember.mMaterialName ); newCrowdMember.mpBillboard->setCorners( Ogre::Vector3( -0.5f, -0.375f, 0.0f ), Ogre::Vector3( 0.5f, -0.375f, 0.0f ), Ogre::Vector3( -0.5f, 0.375f, 0.0f ), Ogre::Vector3( 0.5f, 0.375f, 0.0f ) ); // Make sure that the front row is drawn in front of everything else newCrowdMember.mpBillboard->setRenderQueueGroup( CROWD_FRONT_RENDER_QUEUE ); newCrowdMember.mpSceneNode = mpDiscoNode->createChildSceneNode( newCrowdMember.mPos, Ogre::Quaternion::IDENTITY ); newCrowdMember.mpSceneNode->attachObject( newCrowdMember.mpBillboard ); mCrowdMembers.push_back( newCrowdMember ); /* PLACING RT USER IN CROWD HERE */ if(USER_IN_CROWD){ float userX = (((num+1)%CROWD_WIDTH)*(12.0/(float)CROWD_WIDTH))-5.5; mUserNode->setPosition(userX,3.45,9.5); } /** PUSH ROW UP **/ if (num >= CROWD_WIDTH-1) { // push last row up for(int j = 0; j < mCrowdMembers.size(); j++) { mCrowdMembers[j].mPos.z += CROWD_PUSH_BACK; mCrowdMembers[j].mPos.y += CROWD_PUSH_UP; mCrowdMembers[j].mpSceneNode->setPosition( mCrowdMembers[j].mPos ); mCrowdMembers[j].mRow++; if ( FIRST_LOW_RES_ROW_IDX == mCrowdMembers[j].mRow ) { mCrowdMembers[j].mpBillboard->setMaterial( mCrowdMembers[j].mLowResMaterialName ); } if ( mCrowdMembers[j].mRow > MAX_VISIBLE_ROW_IDX ) { mCrowdMembers[j].mpBillboard->setVisible( false ); mCrowdMembers[j].mpBillboard->setMaterial( "BaseWhiteNoLighting" ); } else { mCrowdMembers[j].mpBillboard->setRenderQueueGroup( CROWD_FRONT_RENDER_QUEUE - mCrowdMembers[j].mRow ); } } } }
/**************************************************************************** ** ** Copyright (C) 2014 ** ** This file is generated by the Magus toolkit ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ****************************************************************************/ // Include #include "mainwindow.h" #include "Editor_dockwidget.h" #include "constants.h" #include "sme_asset_material.h" #include "sme_node_material.h" #include "sme_asset_technique.h" #include "sme_node_technique.h" #include "sme_asset_pass.h" #include "sme_node_pass.h" #include "sme_asset_texture_unit.h" #include "sme_node_texture_unit.h" //****************************************************************************/ EditorDockWidget::EditorDockWidget(QString title, MainWindow* parent, Qt::WindowFlags flags) : QDockWidget (title, parent, flags), mParent(parent) { mInnerMain = new QMainWindow(); setWidget(mInnerMain); // Perform standard functions createActions(); createMenus(); createToolBars(); // Create the node editor widget. mNodeEditor = new Magus::QtNodeEditor(this); mNodeEditor->setMenuSelectionToCompoundEnabled(false); // Enabling this makes it a bit more complicated mNodeEditor->setMenuExpandCompoundsEnabled(false); // No compounds are used connect(mNodeEditor, SIGNAL(nodeRemoved(QtNode*)), this, SLOT(nodeDeleted())); connect(mNodeEditor, SIGNAL(nodeSelected(QtNode*)), this, SLOT(nodeSelected(QtNode*))); mInnerMain->setCentralWidget(mNodeEditor); mMaterialNode = 0; } //****************************************************************************/ EditorDockWidget::~EditorDockWidget(void) { } //****************************************************************************/ void EditorDockWidget::createActions(void) { mMaterialHToolbarAction = new QAction(QIcon(ICON_MATERIAL), QString("Add a material node to the editor"), this); connect(mMaterialHToolbarAction, SIGNAL(triggered()), this, SLOT(doMaterialHToolbarAction())); mTechniqueHToolbarAction = new QAction(QIcon(ICON_TECHNIQUE), QString("Add a technique node to the editor"), this); connect(mTechniqueHToolbarAction, SIGNAL(triggered()), this, SLOT(doTechniqueHToolbarAction())); mPassHToolbarAction = new QAction(QIcon(ICON_PASS), QString("Add a pass node to the editor"), this); connect(mPassHToolbarAction, SIGNAL(triggered()), this, SLOT(doPassHToolbarAction())); mTextureHToolbarAction = new QAction(QIcon(ICON_TEXTURE), QString("Add a texture unit node to the editor"), this); connect(mTextureHToolbarAction, SIGNAL(triggered()), this, SLOT(doTextureHToolbarAction())); mCogHToolbarAction = new QAction(QIcon(ICON_COG), QString("Generate material"), this); connect(mCogHToolbarAction, SIGNAL(triggered()), this, SLOT(doCogHToolbarAction())); } //****************************************************************************/ void EditorDockWidget::createMenus(void) { } //****************************************************************************/ void EditorDockWidget::createToolBars(void) { mHToolBar = new QToolBar(); mInnerMain->addToolBar(Qt::TopToolBarArea, mHToolBar); mHToolBar->setMinimumHeight(TB_ICON_AND_SPACING); mHToolBar->setMinimumWidth(1200); mHToolBar->addAction(mMaterialHToolbarAction); mHToolBar->addAction(mTechniqueHToolbarAction); mHToolBar->addAction(mPassHToolbarAction); mHToolBar->addAction(mTextureHToolbarAction); mHToolBar->addAction(mCogHToolbarAction); } //****************************************************************************/ void EditorDockWidget::doMaterialHToolbarAction(void) { // Add a material node; only 1 is allowed if (!mMaterialNode) { mMaterialNode = new Magus::QtNodeMaterial(NODE_TITLE_MATERIAL); mNodeEditor->addNode(mMaterialNode); } } //****************************************************************************/ void EditorDockWidget::doTechniqueHToolbarAction(void) { // Add a technique node Magus::QtNodeTechnique* techniqueNode = new Magus::QtNodeTechnique(NODE_TITLE_TECHNIQUE); mNodeEditor->addNode(techniqueNode); } //****************************************************************************/ void EditorDockWidget::doPassHToolbarAction(void) { // Add a pass node Magus::QtNodePass* passNode = new Magus::QtNodePass(NODE_TITLE_PASS); mNodeEditor->addNode(passNode); } //****************************************************************************/ void EditorDockWidget::doTextureHToolbarAction(void) { // Add a texture unit node Magus::QtNodeTextureUnit* textureUnitNode = new Magus::QtNodeTextureUnit(NODE_TITLE_TEXTURE_UNIT); mNodeEditor->addNode(textureUnitNode); } //****************************************************************************/ void EditorDockWidget::doCogHToolbarAction(void) { if (!mMaterialNode) return; if (mMaterialNode->getMaterialName().isEmpty()) return; // ---------------------------------------- Create a material ---------------------------------------- Ogre::LogManager* logManager = Ogre::LogManager::getSingletonPtr(); Ogre::MaterialManager* materialManager = Ogre::MaterialManager::getSingletonPtr(); Ogre::String materialName = mMaterialNode->getMaterialName().toStdString(); // Convert to std format logManager->logMessage("SME: create Ogre material: " + materialName); Ogre::MaterialPtr material = materialManager->create(materialName, "General"); // Remark: Sceneblending is done for each pass individually, although it is defined on material level // ---------------------------------------- Add the technique ---------------------------------------- Magus::QtNode* node = mMaterialNode->getNodeConnectedToPort(PORT_TECHNIQUE_OUT); if (!node) { logManager->logMessage("SME: No technique node available"); return; } Magus::QtNodeTechnique* techniqueNode = static_cast<Magus::QtNodeTechnique*>(node); material->removeAllTechniques(); Ogre::Technique* technique = material->createTechnique(); technique->removeAllPasses(); logManager->logMessage("SME: Technique created" + Ogre::StringConverter::toString(material->getNumTechniques())); // ---------------------------------------- Add the passes ---------------------------------------- Magus::QtNodePass* passNode; Magus::QtNodeTextureUnit* textureUnitNode; Ogre::Pass* pass; Ogre::TextureUnitState* textureUnit; for (unsigned int i = 1; i < 5; ++i) { node = techniqueNode->getNodeConnectedToPort(PORT_PASS_OUT, i); // node with the same name if (node) { passNode = static_cast<Magus::QtNodePass*>(node); pass = technique->createPass(); pass->removeAllTextureUnitStates(); logManager->logMessage("SME: Pass on port nr. " + Ogre::StringConverter::toString(i) + " created"); propagatePassNodeData(passNode, pass); // ---------------------------------------- Add the texture units ---------------------------------------- for (unsigned int j = 1; j < 9; ++j) { node = passNode->getNodeConnectedToPort(PORT_TEXTURE_OUT, j); if (node) { logManager->logMessage("SME: Texture unit on port nr. " + Ogre::StringConverter::toString(j) + " of Pass port nr. " + Ogre::StringConverter::toString(i) + " created"); textureUnitNode = static_cast<Magus::QtNodeTextureUnit*>(node); textureUnit = pass->createTextureUnitState(); propagateTextureUnitNodeData(textureUnitNode, textureUnit); } } } } // Assign the material to the ogrehead material->compile(); material->load(); mParent->getOgreManager()->getOgreWidget(1)->mEntity->setMaterial(material); }