//---------------------------------------------------------------------------- TriMesh* SkinnedBiped::GetMesh (const std::string& name, Node* biped) { // Load the triangle indices and material. std::string filename = name + ".triangle.raw"; std::string path = Environment::GetPathR(filename); FileIO inFile(path, FileIO::FM_DEFAULT_READ); int numTriangles; inFile.Read(sizeof(int), &numTriangles); int numIndices = 3*numTriangles; IndexBuffer* ibuffer = new0 IndexBuffer(numIndices, sizeof(int)); int* indices = (int*)ibuffer->GetData(); inFile.Read(sizeof(int), numIndices, indices); Material* material = new0 Material(); Float4 emissive, ambient, diffuse, specular; inFile.Read(sizeof(float), 3, &material->Emissive); material->Emissive[3] = 1.0f; inFile.Read(sizeof(float), 3, &material->Ambient); material->Ambient[3] = 1.0f; inFile.Read(sizeof(float), 3, &material->Diffuse); material->Diffuse[3] = 1.0f; inFile.Read(sizeof(float), 3, &material->Specular); material->Specular[3] = 0.0f; inFile.Close(); // Load the skin controller. filename = name + ".skin.raw"; path = Environment::GetPathR(filename); inFile.Open(path, FileIO::FM_DEFAULT_READ); int repeat; float minTime, maxTime, phase, frequency; inFile.Read(sizeof(float), &repeat); inFile.Read(sizeof(float), &minTime); inFile.Read(sizeof(float), &maxTime); inFile.Read(sizeof(float), &phase); inFile.Read(sizeof(float), &frequency); int numVertices, numBones; inFile.Read(sizeof(int), &numVertices); inFile.Read(sizeof(int), &numBones); SkinController* ctrl = new0 SkinController(numVertices, numBones); ctrl->Repeat = (Controller::RepeatType)repeat; ctrl->MinTime = (double)minTime; ctrl->MaxTime = (double)maxTime; ctrl->Phase = (double)phase; ctrl->Frequency = (double)frequency; Node** bones = ctrl->GetBones(); int i; for (i = 0; i < numBones; ++i) { int length; inFile.Read(sizeof(int), &length); char* boneName = new1<char>(length + 1); inFile.Read(sizeof(char), length, boneName); boneName[length] = 0; bones[i] = (Node*)biped->GetObjectByName(boneName); assertion(bones[i] != 0, "Failed to find bone.\n"); delete1(boneName); } float** weights = ctrl->GetWeights(); APoint** offsets = ctrl->GetOffsets(); for (int j = 0; j < numVertices; ++j) { for (i = 0; i < numBones; ++i) { inFile.Read(sizeof(float), &weights[j][i]); inFile.Read(sizeof(float), 3, &offsets[j][i]); } } inFile.Close(); int vstride = mVFormat->GetStride(); VertexBuffer* vbuffer = new0 VertexBuffer(numVertices, vstride); // Set positions and normals to zero for now. The controller update // will set the initial values. memset(vbuffer->GetData(), 0, numVertices*vstride); TriMesh* mesh = new0 TriMesh(mVFormat, vbuffer, ibuffer); mesh->SetName(name); mesh->AttachController(ctrl); mesh->SetEffectInstance(LightDirPerVerEffect::CreateUniqueInstance( mLight, material)); return mesh; }