Example #1
0
iMesh*
iResLoader::loadMesh(dString* filePath) {
	CL_THROW_IF_NIL(filePath);
	
	dData* meshData = dData::dataWithContentsOfFile(filePath);
	const dByte* meshBytes = (const dByte*)meshData->bytes();
	
	iSMeshHeader* h = (iSMeshHeader*)meshBytes;
	assert(dSwapLittleIntToHost(h->tag) == kiMeshSignature);
	assert(dSwapLittleIntToHost(h->headerLength) +
		   dSwapLittleIntToHost(h->ibDataSize) +
		   dSwapLittleIntToHost(h->vbDataSize) +
		   dSwapLittleIntToHost(h->meshPartsDataSize) == meshData->length());
	
	meshBytes += dSwapLittleIntToHost(h->headerLength);
	dobj_ptr<dData> ibData(dData::alloc()->initWithBytes(meshBytes, h->ibDataSize));
	dobj_ptr<iIndexBuffer> ib(iIndexBuffer::alloc()->initWithDataAndType(ibData.get(), kiEDataType_UnsignedShort));
	
	meshBytes += dSwapLittleIntToHost(h->ibDataSize);
	dobj_ptr<dData> vbData(dData::alloc()->initWithBytes(meshBytes, h->vbDataSize));
	dobj_ptr<iVertexBuffer> vb(iVertexBuffer::alloc()->initWithDataAndFVF(vbData.get(), (iEFVF)dSwapLittleIntToHost(h->fvf)));
	
	meshBytes += dSwapLittleIntToHost(h->vbDataSize);
	dobj_ptr<dData> mpData(dData::alloc()->initWithBytes(meshBytes, h->meshPartsDataSize));
	const dByte* mpPtr = (const dByte*)mpData->bytes();
	dUInteger dataLength = 0;
	
	dobj_ptr<dDictT<iMeshPart*, dString*> > parts((dDictT<iMeshPart*, dString*>*)
													dDictT<iMeshPart*, dString*>::alloc()->init()); 
	
	while (dataLength < h->meshPartsDataSize) {
		iSMeshPartInfo* partInfo = (iSMeshPartInfo*)mpPtr;
		dobj_ptr<iMeshPart> part(iMeshPart::alloc()->initWithParams(ib.get(), kiEDrawMode_Triangles, partInfo->first, partInfo->count));
		mpPtr += sizeof(iSMeshPartInfo);
		dataLength += sizeof(iSMeshPartInfo);
		
		dobj_ptr<dString> name(dString::alloc()->initWithCharacters((TCHAR*)mpPtr, partInfo->nameLength));
		mpPtr += partInfo->nameLength * sizeof(TCHAR);
		dataLength += partInfo->nameLength * sizeof(TCHAR);
		
		parts->setObjectForKey(part.get(), name.get());
	}
	
	return iMesh::meshWithVertexBufferAndParts(vb.get(), parts.get());
}
void ColladaMeshFactory::DecodeInstance(RevModel** aModel,FCDGeometry* aGeometry,FCDGeometryInstance* aGeometryInstance,FCDocument* aColladaDocument,bool aHasBoneWeightsFlag,FCDController* aController,FCDControllerInstance* aControllerInstance)
{
	FCDGeometryMesh* mesh=aGeometry->GetMesh();
	if (!mesh->IsTriangles()) FCDGeometryPolygonsTools::Triangulate(mesh);

	FCDGeometrySource* positionSource=mesh->FindSourceByType(FUDaeGeometryInput::POSITION);
	FCDGeometrySource* normalSource=mesh->FindSourceByType(FUDaeGeometryInput::NORMAL);
	FCDGeometrySource* geoTangentSource=mesh->FindSourceByType(FUDaeGeometryInput::GEOTANGENT);
	FCDGeometrySource* texTangentSource=mesh->FindSourceByType(FUDaeGeometryInput::TEXTANGENT);
	FCDGeometrySource* colorSource=mesh->FindSourceByType(FUDaeGeometryInput::COLOR);
	FCDGeometrySource* textureCordinatesSource=mesh->FindSourceByType(FUDaeGeometryInput::TEXCOORD);
	FCDGeometrySource* geoBiNormalSource=mesh->FindSourceByType(FUDaeGeometryInput::GEOBINORMAL);
	FCDGeometrySource* texBiNormalSource=mesh->FindSourceByType(FUDaeGeometryInput::TEXBINORMAL);

	assert(positionSource);


	int elementCount=0;
	int totalStride;
	int positionStride;
	int normalStride;
	int colorStride;
	int textureCordinatesStride;
	int tangentStride;


	RevInputData data;

	if(positionSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "POSITION",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		//(*aModel)->AddModelInputElement(element);
		positionStride=elementCount;
		data.myElements.push_back( element );

		elementCount+=12;
	}

	if(aHasBoneWeightsFlag)
	{
		D3D11_INPUT_ELEMENT_DESC element={ "WEIGHTS", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0,      elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		elementCount+=4;
		D3D11_INPUT_ELEMENT_DESC element2={ "BONES", 0, DXGI_FORMAT_R8G8B8A8_UINT, 0,         elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element2 );
		elementCount+=4;
	}

	if(normalSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "NORMAL",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		normalStride=elementCount;
		elementCount+=12;
	}
	if(colorSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "COLOR",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		colorStride=elementCount;

		elementCount+=16;
	}
	if(textureCordinatesSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "TEXCOORD",  0, DXGI_FORMAT_R32G32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		textureCordinatesStride=elementCount;
		elementCount+=8;
	}

	//assert(((geoTangentSource!=NULL) && (texTangentSource!=NULL))==false);

	if(geoTangentSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "TANGENT",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		tangentStride=elementCount;
		elementCount+=12;
	}
	if(texTangentSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "TANGENT",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		tangentStride=elementCount;
		elementCount+=12;
	}

	if(geoBiNormalSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "BINORMAL",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		tangentStride=elementCount;
		elementCount+=12;
	}
	if(texBiNormalSource!=NULL)
	{
		D3D11_INPUT_ELEMENT_DESC element= { "BINORMAL",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, elementCount, D3D11_INPUT_PER_VERTEX_DATA, 0 };
		data.myElements.push_back( element );
		tangentStride=elementCount;
		elementCount+=12;
	}

	for( auto element : data.myElements )
	{
		data.m_instancedElements.push_back( element );
	}

	D3D11_INPUT_ELEMENT_DESC elementOne		= { "WORLD",		0,	DXGI_FORMAT_R32G32B32A32_FLOAT,	1,		0,		D3D11_INPUT_PER_INSTANCE_DATA, 1	};
	D3D11_INPUT_ELEMENT_DESC elementTwo		= { "WORLD",		1,	DXGI_FORMAT_R32G32B32A32_FLOAT,	1,		16,		D3D11_INPUT_PER_INSTANCE_DATA, 1	};
	D3D11_INPUT_ELEMENT_DESC elementThree	= { "WORLD",		2,	DXGI_FORMAT_R32G32B32A32_FLOAT,	1,		32,		D3D11_INPUT_PER_INSTANCE_DATA, 1	};
	
	data.m_instancedElements.push_back( elementOne );
	data.m_instancedElements.push_back( elementTwo );
	data.m_instancedElements.push_back( elementThree );

	totalStride=elementCount;
		
	RevVertexDataNormal vbData( 0 );
	DetermineVertexType( vbData, data );

//	vbData.mySize = vbData.myStride * vbData.myNrOfVertexes;
//	vbData.myVertexData = new char[ vbData.mySize ];

	RevIndexData indexData;

	GenerateMeshDatafromPolygonsFull(aModel,indexData,vbData,data,aGeometryInstance,mesh, aColladaDocument, aHasBoneWeightsFlag, aController, aControllerInstance );
	
}
Example #3
0
RevModel* RevModelFactory::CreateBox(float width, float height, float depth, const CU::Vector4f& color)
{
	//
	// Create the vertices.
	//

	RevVertexDataNormal vbData(24);
	vbData.myStride = sizeof( RevVertexPosCol );
	vbData.mySize = vbData.myStride * vbData.myNrOfVertexes;
	vbData.myVertexData = new char[ vbData.mySize ];

	float w2 = 0.5f*width;
	float h2 = 0.5f*height;
	float d2 = 0.5f*depth;
		
	RevVertexPosCol vP[24];

	// Fill in the front face vertex data.
	vP[0].myPos = CU::Vector3f(-w2, -h2, -d2);
	vP[1].myPos = CU::Vector3f(-w2, +h2, -d2);
	vP[2].myPos = CU::Vector3f(+w2, +h2, -d2);
	vP[3].myPos= CU::Vector3f(+w2, -h2, -d2);

	// Fill in the back face vertex data.
	vP[4].myPos = CU::Vector3f(-w2, -h2, +d2);
	vP[5].myPos = CU::Vector3f(+w2, -h2, +d2);
	vP[6].myPos = CU::Vector3f(+w2, +h2, +d2);
	vP[7].myPos = CU::Vector3f(-w2, +h2, +d2);

	// Fill in the top face vertex data.
	vP[8].myPos  = CU::Vector3f(-w2, +h2, -d2);
	vP[9].myPos  = CU::Vector3f(-w2, +h2, +d2);
	vP[10].myPos = CU::Vector3f(+w2, +h2, +d2);
	vP[11].myPos = CU::Vector3f(+w2, +h2, -d2);

	// Fill in the bottom face vertex data.
	vP[12].myPos = CU::Vector3f(-w2, -h2, -d2);
	vP[13].myPos = CU::Vector3f(+w2, -h2, -d2);
	vP[14].myPos = CU::Vector3f(+w2, -h2, +d2);
	vP[15].myPos = CU::Vector3f(-w2, -h2, +d2);

	// Fill in the left face vertex data.
	vP[16].myPos = CU::Vector3f(-w2, -h2, +d2);
	vP[17].myPos = CU::Vector3f(-w2, +h2, +d2);
	vP[18].myPos = CU::Vector3f(-w2, +h2, -d2);
	vP[19].myPos = CU::Vector3f(-w2, -h2, -d2);

	// Fill in the right face vertex data.
	vP[20].myPos = CU::Vector3f(+w2, -h2, -d2);
	vP[21].myPos = CU::Vector3f(+w2, +h2, -d2);
	vP[22].myPos = CU::Vector3f(+w2, +h2, +d2);
	vP[23].myPos = CU::Vector3f(+w2, -h2, +d2);

	for (auto vIndex = 0; vIndex < 24; vIndex++)
	{
		vP[vIndex].myColor = color;
	}

	memcpy(vbData.myVertexData, &vP[0], sizeof(RevVertexPosCol)* 24);

	//
	// Create the indices.
	//

	RevIndexData ibData;
	ibData.myNrOfIndexes =  36;
	ibData.mySize = sizeof( UINT ) * ibData.myNrOfIndexes;
	ibData.myFormat = DXGI_FORMAT_R32_UINT;
	UINT* indexData = new UINT[ ibData.myNrOfIndexes ];
	ibData.myIndexData = new char[ ibData.mySize ];


	// Fill in the front face index data
	indexData[0] = 0; indexData[1] = 1; indexData[2] = 2;
	indexData[3] = 0; indexData[4] = 2; indexData[5] = 3;

	// FindexDatall indexDatan the back face indexDatandex data
	indexData[6] = 4; indexData[7]  = 5; indexData[8]  = 6;
	indexData[9] = 4; indexData[10] = 6; indexData[11] = 7;

	// FindexDatall indexDatan the top face indexDatandex data
	indexData[12] = 8; indexData[13] =  9; indexData[14] = 10;
	indexData[15] = 8; indexData[16] = 10; indexData[17] = 11;

	// FindexDatall indexDatan the bottom face indexDatandex data
	indexData[18] = 12; indexData[19] = 13; indexData[20] = 14;
	indexData[21] = 12; indexData[22] = 14; indexData[23] = 15;

	// FindexDatall indexDatan the left face indexDatandex data
	indexData[24] = 16; indexData[25] = 17; indexData[26] = 18;
	indexData[27] = 16; indexData[28] = 18; indexData[29] = 19;

	// FindexDatall indexDatan the rindexDataght face indexDatandex data
	indexData[30] = 20; indexData[31] = 21; indexData[32] = 22;
	indexData[33] = 20; indexData[34] = 22; indexData[35] = 23;

	memcpy( &ibData.myIndexData, &indexData[0], ibData.mySize );

	RevInputData data;
	for(int i = 0; i < ARRAYSIZE( VertexPosColLayout ); i++ )
	{
		data.myElements.push_back( VertexPosColLayout[i] );
	}

	RevModelRenderEssentials essentials( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP );
	essentials.myVertexStart = 0;
	essentials.myIndexStart = 0;
	essentials.myIndexCount = ibData.myNrOfIndexes;


	RevModel* model = new RevModel( );
	model->InitShader( "Shaders\\Object_PosCol.txt" );
	model->Init( vbData, ibData, data, essentials );
	m_createdModels.push_back(model);
	return model;
}
Example #4
0
RevModel* RevModelFactory::GetSphereSliceDefered( )
{
	RevModel* model = new RevModel();
	model->InitShader( "Shaders\\Fullscreen.txt" );
	model->SetIsNullObjectFlag(false); 
	
	const int VertexSize=12;
	const int PolygonSize = VertexSize-1;

	float theta = -90.0f * (3.14157f / 180.0f);
	float phi = 0.0f;

	std::vector< RevVertexPos > vertexes;
	for (int i = 0; i < VertexSize; i++)
	{
		phi = 0;
		for (int j = 0; j < VertexSize; j++)
		{
			RevVertexPos vertex;
				vertex.myPos =  CU::Vector3f(
				(float)cos(theta) * (float)cos(phi),
				(float)cos(theta) * (float)sin(phi),
				(float)sin(theta) );
			vertexes.push_back( vertex );
			phi +=((360.0f) / (float)PolygonSize) * (DirectX::XM_PI / 180.0f);
		}
		theta += ((180.0f / (float)PolygonSize)* (DirectX::XM_PI / 180.0f));
	}

	RevVertexDataNormal vbData( vertexes.size() );
	vbData.myStride = sizeof( RevVertexPos );
	vbData.mySize = vbData.myStride * vbData.myNrOfVertexes;
	vbData.myVertexData = new char[ vbData.mySize ];

	std::vector< UINT> indicies;
	indicies.reserve(PolygonSize * PolygonSize * 6);
	int indiceCount=0;
	for (int i = 0; i < PolygonSize; i++)
	{
		for (int j = 0; j < PolygonSize; j++)
		{
			indicies.push_back((UINT)((i + 1) * VertexSize + j));
			indicies.push_back((UINT)(i *		VertexSize + j + 1));
			indicies.push_back((UINT)(i *		VertexSize + j));
			indicies.push_back((UINT)((i + 1) * VertexSize + (j))) ;
			indicies.push_back((UINT)((i + 1) * VertexSize + (j + 1)));
			indicies.push_back((UINT)(i *		VertexSize + (j + 1)));
			indiceCount += 6;
		}
	}

// 	for(int i = 0; i < vertexes.size(); i++)
// 	{ 
// 		RevVertexPos v;
// 		memcpy( &v, &vertexes[i], vbData.myStride );
// 		memcpy( &vbData.myVertexData[ offset ], &v, vbData.myStride );
// 		offset += vbData.myStride;
// 	}

	memcpy(&vbData.myVertexData[0], &vertexes[0], vbData.mySize);

	RevIndexData ibData;
	ibData.myNrOfIndexes = indicies.size();
	ibData.mySize = sizeof(UINT) * indicies.size();
	ibData.myFormat = DXGI_FORMAT_R32_UINT; 
	ibData.myIndexData = new char[ibData.mySize];
	
	memcpy(&ibData.myIndexData[0], &indicies[0], ibData.mySize);

	RevInputData data;
	const int nElements = ARRAYSIZE( VertexPosLayout );
	for(int i = 0; i < nElements; i++ )
	{
		data.myElements.push_back( VertexPosLayout[i] );
	}

	data.m_effectTech = RevEffect::_PBL_POINT_LIGHT;

	RevModelRenderEssentials essentials( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
	essentials.myVertexStart = 0;
	essentials.myIndexStart = 0;
	essentials.myIndexCount = ibData.myNrOfIndexes;
	essentials.myIndexCount = indicies.size();


	model->Init( vbData, ibData, data, essentials );

	m_createdModels.push_back(model);
	return model;
}