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