void FBXModel::load(const GraphicsDevice& device, const std::string& filename, unsigned keyframes) { if (effect.resource == 0) effect = Effect::createFromFile<FBXEffect>(device, Config::getValue(ConfigKeys::fbxEffectPath)); defaultTexture = Texture::createFromFile(device, defaultTexturePath); vertexDeclaration = device.createVertexDeclaration(FBXInstance::vertexElements); KFbxSdkManager* sdkManager = KFbxSdkManager::Create(); KFbxIOSettings* ios = KFbxIOSettings::Create(sdkManager, IOSROOT); sdkManager->SetIOSettings(ios); // Create an importer using our sdk manager. KFbxImporter* importer = KFbxImporter::Create(sdkManager, ""); importer->Initialize(filename.c_str(), -1, sdkManager->GetIOSettings()); // Create a new scene so it can be populated by the imported file. KFbxScene* scene = KFbxScene::Create(sdkManager, ""); // Import the contents of the file into the scene. importer->Import(scene); KFbxNode* rootBone = 0; KFbxNode* rootNode = scene->GetRootNode(); KFbxAnimStack* animStack = KFbxCast<KFbxAnimStack>(scene->GetSrcObject(FBX_TYPE(KFbxAnimStack), 0)); KFbxAnimLayer* animLayer = 0; if (animStack) { animLayer = animStack->GetMember(FBX_TYPE(KFbxAnimLayer), 0); scene->GetEvaluator()->SetContext(animStack); } loadBones(rootNode, &rootBone, animLayer); loadMeshes(rootNode, device, KFbxGeometryConverter(sdkManager)); if (animLayer) { for (unsigned i = 0; i <= keyframes; ++i) boneMatricesMap[i] = traverseBones(i, rootBone, Matrix::identity, MatrixCollection(bones.size())); } sdkManager->Destroy(); loaded = true; }
void TerrainTessellator::init(const GraphicsDevice& device, unsigned size, unsigned numPatches, unsigned stripeSize) { this->size = size; this->stripeSize = stripeSize; this->numPatches = numPatches; numVertices = (size + 3) * (size + 3); unsigned lod = (unsigned)MathHelper::log2(size) + 1; patchIndexBuffers = IndexBufferCollection(lod); skirtIndexBuffers = IndexBufferCollection(lod); for (unsigned i = 0; i < lod; ++i) { patchIndexBuffers[i] = createPatchIndexBuffer(device, i); skirtIndexBuffers[i] = createSkirtIndexBuffer(device, i); } VertexCollection vertices(numVertices); for (int row = -1; row <= (int)size + 1; ++row) for (int col = -1; col <= (int)size + 1; ++col) { int r = MathHelper::clamp(row, 0, (int)size); int c = MathHelper::clamp(col, 0, (int)size); float y = (r == row && c == col) ? 0.0f : -1.0f; vertices[getIndex(row, col)].position = Vector3((float)c, y, (float)r); } vertexBuffer = device.createVertexBuffer(sizeof(TerrainVertex) * numVertices, TerrainVertex::fvf, D3DUSAGE_WRITEONLY); vertexBuffer.setData(vertices); instanceVertexDeclaration = device.createVertexDeclaration(TerrainGeometry::vertexElements); }