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);
 }
Exemplo n.º 2
0
 /**
  * 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);
     }
 }
Exemplo n.º 3
0
 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);
     }
 }
Exemplo n.º 4
0
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;
            }