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