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); }
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; }
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); }
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(); }