ISceneNode* SceneCreator::CreateSmallBox() { MeshPtr box = MeshCreator::CreateCube(3, 1, Vector<3,float>(1.0f, 1.0f, 1.0f)); IDataBlockPtr color = Float4DataBlockPtr(new DataBlock<4, float>(box->GetGeometrySet()->GetSize())); for (unsigned int i = 0; i < color->GetSize(); ++i) color->SetElement(i, Vector<4, float>(1.0, 1.0, 1.0, 1.0)); box->GetGeometrySet()->AddAttributeList("color", color); return new MeshNode(box); }
/** * Adds a data block to the reloader. */ void Add(IDataBlockPtr block, ReloadPolicy policy) { // Remember to detach the listener first to make sure we // don't listen twice. if (policy == RELOAD_IMMEDIATE) { block->ChangedEvent().Detach(*this); block->ChangedEvent().Attach(*this); } else if (policy == RELOAD_QUEUED) { block->ChangedEvent().Detach(queue); block->ChangedEvent().Attach(queue); } }
void DataBlockBinder::Bind(IDataBlockPtr block, ReloadPolicy policy){ policy = (policy == RELOAD_DEFAULT) ? defaultpolicy : policy; if (IRenderer::RENDERER_UNINITIALIZE == r.GetCurrentStage()){ initbinder->Add(block, policy); }else{ // If the texture has not already been loaded if (block->GetID() == 0) r.BindDataBlock(block.get()); // Listen for reload events (based on policy) reloader->Add(block, policy); } }
IDataBlockPtr DataStore::find(std::string name){ vector<std::string> dividedName; vector<std::string>::iterator itName; boost::split(dividedName, name, boost::is_any_of("/"), boost::token_compress_on); DataStore* current = (0==name.find("/"))?m_root.get():this; IDataBlockPtr db; for(itName=dividedName.begin(); itName !=dividedName.end(); itName++){ if(0==(*itName).size()) continue; db = current->retrieveObject(*itName); current = dynamic_cast<DataStore*>(db.get()); if(not current)return db; } return db; }
MeshNode* SceneCreator::CreateCornellBox() { MeshPtr box = MeshCreator::CreateCube(10, 1, Vector<3,float>(1.0f, 1.0f, 1.0f), true); IDataBlockPtr color = Float4DataBlockPtr(new DataBlock<4, float>(box->GetGeometrySet()->GetSize())); for (unsigned int i = 0; i < color->GetSize(); ++i) color->SetElement(i, Vector<4, float>(1.0, 1.0, 1.0, 1.0)); box->GetGeometrySet()->AddAttributeList("color", color); IDataBlockPtr colors = box->GetGeometrySet()->GetColors(); Vector<4,float> red(1.0f, 0.0f, 0.0f, 1.0f); colors->SetElement(8, red); colors->SetElement(9, red); colors->SetElement(10, red); colors->SetElement(11, red); Vector<4,float> blue(0.0f, 0.0f, 0.8f, 1.0f); colors->SetElement(12, blue); colors->SetElement(13, blue); colors->SetElement(14, blue); colors->SetElement(15, blue); // Vector<4,float> transparent(0.0f, 0.0f, 0.8f, 0.0f); // colors->SetElement(16, transparent); // colors->SetElement(17, transparent); // colors->SetElement(18, transparent); // colors->SetElement(19, transparent); return new MeshNode(box); }
ISceneNode* SceneCreator::LoadDragon() { IModelResourcePtr duckRes = ResourceManager<IModelResource>::Create("dragon/dragon_vrip_res2.ply"); duckRes->Load(); MeshNode* dragon = (MeshNode*) duckRes->GetSceneNode()->GetNode(0)->GetNode(0)->GetNode(0); const Vector<4, float> jadeGreen(0.0f, 0.647, 0.396f, 0.5f); GeometrySetPtr geom = dragon->GetMesh()->GetGeometrySet(); IDataBlockPtr color = Float4DataBlockPtr(new DataBlock<4, float>(geom->GetSize())); for (unsigned int i = 0; i < color->GetSize(); ++i) color->SetElement(i, jadeGreen); geom->AddAttributeList("color", color); return duckRes->GetSceneNode(); }
ISceneNode* SceneCreator::LoadBunny() { IModelResourcePtr duckRes = ResourceManager<IModelResource>::Create("bunny/bun_zipper_res2.ply"); duckRes->Load(); MeshNode* bunny = (MeshNode*) duckRes->GetSceneNode()->GetNode(0)->GetNode(0)->GetNode(0); const Vector<4, float> bakersChocolate(0.36f, 0.2, 0.09f, 0.7f); const Vector<4, float> lightChocolate(0.667f, 0.49f, 0.361f, 1.0f); GeometrySetPtr geom = bunny->GetMesh()->GetGeometrySet(); IDataBlockPtr color = Float4DataBlockPtr(new DataBlock<4, float>(geom->GetSize())); for (unsigned int i = 0; i < color->GetSize(); ++i) color->SetElement(i, bakersChocolate); geom->AddAttributeList("color", color); return duckRes->GetSceneNode(); }
GeometrySetPtr Rotate(GeometrySetPtr geom, Quaternion<float> rotate) { GeometrySetPtr clone = geom->Clone(); IDataBlockPtr verts = clone->GetVertices(); if (verts != NULL) for (unsigned int i = 0; i < verts->GetSize(); ++i){ Vector<3, float> elem; verts->GetElement(i, elem); elem = rotate.RotateVector(elem); verts->SetElement(i, elem); } IDataBlockPtr norms = clone->GetNormals(); if (norms != NULL) for (unsigned int i = 0; i < norms->GetSize(); ++i){ Vector<3, float> elem; norms->GetElement(i, elem); elem = rotate.RotateVector(elem); norms->SetElement(i, elem); } IDataBlockPtr binorms = clone->GetAttributeList("binormal"); if (norms != NULL) for (unsigned int i = 0; i < norms->GetSize(); ++i){ Vector<3, float> elem; binorms->GetElement(i, elem); elem = rotate.RotateVector(elem); binorms->SetElement(i, elem); } IDataBlockPtr tangent = clone->GetAttributeList("tangent"); if (norms != NULL) for (unsigned int i = 0; i < norms->GetSize(); ++i){ Vector<3, float> elem; tangent->GetElement(i, elem); elem = rotate.RotateVector(elem); tangent->SetElement(i, elem); } IDataBlockPtr bitangent = clone->GetAttributeList("bitangent"); if (norms != NULL) for (unsigned int i = 0; i < norms->GetSize(); ++i){ Vector<3, float> elem; bitangent->GetElement(i, elem); elem = rotate.RotateVector(elem); bitangent->SetElement(i, elem); } return clone; }