예제 #1
0
SkyVolume::SkyVolume(PE::GameContext &context, PE::MemoryArena arena, Handle hMyself, int &threadOwnershipMask) : Mesh(context, arena, hMyself)
{
	MeshCPU m(context, arena);
	m.ReadMesh("skyvolumemesh_mesh.mesha", "Default", "");
	loadFromMeshCPU_needsRC(m, threadOwnershipMask);
}
예제 #2
0
  //********************//
 //** INITIALIZATION **//
//********************//
	void ParticleMesh::loadFromFile_needsRC(Particle& particle, int &threadOwnershipMask)
	{
		const char* FileName = particle.GetFilename();//"EnergyParticle.dds";//particle.Filename;
		const char* Package = particle.GetPackage();//"Default";//particle.Package;
		PrimitiveTypes::Float32 Width = particle.Width;
		PrimitiveTypes::Float32 Height = particle.Height;

		const char* techName = 0;
		//if (drawType == Overlay2D_3DPos || drawType == Overlay2D)
		//	tech = "StdMesh_2D_Diffuse_A_RGBIntensity_Tech";
		//if (drawType == InWorldFacingCamera)
		techName = "StdMesh_Diffuse_Tech"; //HARDCODED!"StdMesh_2D_Diffuse_A_RGBIntensity_Tech";//
		

		if (!m_meshCPU.isValid())
		{
			m_meshCPU = Handle("MeshCPU ParticleMesh", sizeof(MeshCPU));
			new (m_meshCPU) MeshCPU(*m_pContext, m_arena);
		}
		MeshCPU &mcpu = *m_meshCPU.getObject<MeshCPU>();

		if (!m_loaded)
		{
			mcpu.createBillboardMeshWithColorTexture(FileName, Package, Width, Height, SamplerState_NotNeeded); //HardCoded sampler state, needs to change for mip-map particles
		}
	
		// this will cause not using the vertex buffer manager
		//so that engine always creates a new vertex buffer gpu and doesn't try to find and
		//existing one
		mcpu.m_manualBufferManagement = true;

		//Get the various buffers for the mesh
		PositionBufferCPU *pVB = mcpu.m_hPositionBufferCPU.getObject<PositionBufferCPU>();
		TexCoordBufferCPU *pTCB = mcpu.m_hTexCoordBufferCPU.getObject<TexCoordBufferCPU>();
		NormalBufferCPU *pNB = mcpu.m_hNormalBufferCPU.getObject<NormalBufferCPU>();
		IndexBufferCPU *pIB = mcpu.m_hIndexBufferCPU.getObject<IndexBufferCPU>();
		//reset values
		pVB->m_values.reset(4 * 3); // 4 verts * (x,y,z)
		pTCB->m_values.reset(4 * 2);
		pNB->m_values.reset(4 * 3);
		pIB->m_values.reset(6); // 2 tris

		pIB->m_indexRanges[0].m_start = 0;	//0
		pIB->m_indexRanges[0].m_end = 5;	//(len*6) * 2
		pIB->m_indexRanges[0].m_minVertIndex = 0;	//0
		pIB->m_indexRanges[0].m_maxVertIndex = 3;	// (len*4) - 1

		pIB->m_minVertexIndex = pIB->m_indexRanges[0].m_minVertIndex;
		pIB->m_maxVertexIndex = pIB->m_indexRanges[0].m_maxVertIndex;

		// Member variables for this mesh
		m_Width = (float) Width;
		m_Height = (float) Height;

		// time to fill in the buffers
		float XExtent = Width/2.f;
		float YExtent = Height/2.f;

		//Mesh Vertices
		pVB->m_values.add(-3, 3, 0);	//-XExtent, YExtent, 0);	// top left
		pVB->m_values.add( 3, 3, 0);	//XExtent, YExtent, 0);	// top right
		pVB->m_values.add( 3,-3, 0);	//XExtent,-YExtent, 0);	// bot right
		pVB->m_values.add(-3,-3, 0);	//-XExtent,-YExtent, 0);	// bot left

		//Mesh vertex buffers
		pIB->m_values.add(0, 1, 2); //first tri tex-coord buffer
		pIB->m_values.add(2, 3, 0); //second tri tex-coord buffer

		//Texture Co-ord buffer
		pTCB->m_values.add(0.6f, 0.4f); // top left
		pTCB->m_values.add(0.4f, 0.4f); // top right
		pTCB->m_values.add(0.4f, 0.6f); // bot right
		pTCB->m_values.add(0.6f, 0.6f); // bot left
		
		//Normal buffers
		pNB->m_values.add(0, 0, 0);
		pNB->m_values.add(0, 0, 0);
		pNB->m_values.add(0, 0, 0);
		pNB->m_values.add(0, 0, 0);

		if (!m_loaded)
		{
			// first time creating gpu mesh
			loadFromMeshCPU_needsRC(mcpu, threadOwnershipMask);

			// Not sure how this part works, but I think it takes care of itself through inheritance
			if (techName)
			{
				Handle hEffect = EffectManager::Instance()->getEffectHandle(techName);

				for (unsigned int imat = 0; imat < m_effects.m_size; imat++)
				{
					if (m_effects[imat].m_size)
						m_effects[imat][0] = hEffect;
				}
			}
			m_loaded = true;
		}
		else
		{
			//just need to update vertex buffers gpu
			updateGeoFromMeshCPU_needsRC(mcpu, threadOwnershipMask);
		}
	}