/** Overlay constructor * * Operation: * -# Create a surface for the overlay's texture * -# Initialise the mesh base class to hold 4 vertices * -# Initialise the surface to hold 6 indicies (3 for each triangle, 2 triangles for one rectangle) * -# Assign the default vertex data for the rectangle * -# Assign the default normal data for the rectangle * -# Assign the triangle indices * -# Set the surfaces vertex/normal/index data * -# Generate a white material and update the surface with it */ Overlay::Overlay() { IVertexBuffer *v = AddVertexBuffer(); Initialise(4); v->Initialise(GetNumVertex(),6,3,2); int *index = v->GetIndex(); // Assign all the m_position data m_position[0].x = 0; m_position[0].y = 0; m_position[0].z = 0; m_position[1].x = 0; m_position[1].y = 1; m_position[1].z = 0; m_position[2].x = 1; m_position[2].y = 1; m_position[2].z = 0; m_position[3].x = 1; m_position[3].y = 0; m_position[3].z = 0; // Assign all the m_normal data m_normal[0].x = 0; m_normal[0].y = 0; m_normal[0].z = 1; m_normal[1].x = 0; m_normal[1].y = 0; m_normal[1].z = 1; m_normal[2].x = 0; m_normal[2].y = 0; m_normal[2].z = 1; m_normal[3].x = 0; m_normal[3].y = 0; m_normal[3].z = 1; // Assign all the polygon indices index[0] = 0; index[1] = 1; index[2] = 2; index[3] = 0; index[4] = 3; index[5] = 2; v->SetPosition((float *)m_position); v->SetNormal((float *)m_normal); v->SetIndex(index); Material *m = v->GetMaterial(); m->colour.r = 1; m->colour.g = 1; m->colour.b = 1; m->colour.a = 1; v->SetMaterial(m); }
CVertexBuffer9::CVertexBuffer9(CDevice9* device, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, HANDLE* pSharedHandle) : mReferenceCount(1), mDevice(device), mLength(Length), mUsage(Usage), mFVF(FVF), mPool(Pool), mSharedHandle(pSharedHandle), mIsDirty(true), mLockCount(0) { AddStagingBuffer(); AddVertexBuffer(); mCurrentVertexBuffer = mVertexBuffers[mDevice->mFrameIndex][0].get(); mCurrentVertexBufferMemory = mVertexBufferMemories[mDevice->mFrameIndex][0].get(); }
HRESULT STDMETHODCALLTYPE CVertexBuffer9::Lock(UINT OffsetToLock, UINT SizeToLock, VOID** ppbData, DWORD Flags) { InterlockedIncrement(&mLockCount); if (mPool == D3DPOOL_MANAGED) { if (!(Flags & D3DLOCK_READONLY)) { //If the lock allows write mark the buffer as dirty. mIsDirty = true; } } mOffsetToLock = OffsetToLock; mSizeToLock = SizeToLock; if (mLastFrameIndex != mDevice->mFrameIndex) { mIndex = 0; mLastFrameIndex = mDevice->mFrameIndex; } else { if ((Flags & D3DLOCK_NOOVERWRITE) != D3DLOCK_NOOVERWRITE && (Flags & D3DLOCK_READONLY) != D3DLOCK_READONLY) { mIndex++; } } if (mIndex > (int32_t)mVertexBuffers[mDevice->mFrameIndex].size() - 1) { AddVertexBuffer(); } mCurrentVertexBuffer = mVertexBuffers[mDevice->mFrameIndex][mIndex].get(); mCurrentVertexBufferMemory = mVertexBufferMemories[mDevice->mFrameIndex][mIndex].get(); (*ppbData) = mDevice->mDevice->mapMemory(mStagingBufferMemory.get(), OffsetToLock, VK_WHOLE_SIZE); return D3D_OK; }
HRESULT CModelContent::LoadFromFile(LPCWSTR filePath) { HRESULT hr = S_OK; DWORD cbRead = 0; IStream* pStream = NULL; MODELCONTENTFILEHEADER header = {0}; hr = FileStream::OpenFile(filePath, &pStream, false); GOTO_EXIT_IF_FAILED_MESSAGE(hr, "Failed to load model content file"); // Read file header hr = pStream->Read(&header, sizeof(header), &cbRead); // Read vertices buffers for (UINT i = 0; i < header.numVertexBuffers; i++) { // Read header MODELCONTENTBUFFERHEADER bufHeader = {0}; hr = pStream->Read(&bufHeader, sizeof(bufHeader), &cbRead); // Read data BYTE* pBuffer = new BYTE[bufHeader.numElements * bufHeader.stride]; hr = pStream->Read(pBuffer, bufHeader.numElements * bufHeader.stride, &cbRead); // Add vertex buffer AddVertexBuffer(pBuffer, bufHeader.numElements, bufHeader.stride); SAFE_DELETE_ARRAY(pBuffer); } // Read indices buffers for (UINT i = 0; i < header.numIndexBuffers; i++) { MODELCONTENTBUFFERHEADER bufHeader = {0}; hr = pStream->Read(&bufHeader, sizeof(bufHeader), &cbRead); // Read data BYTE* pBuffer = new BYTE[bufHeader.numElements * bufHeader.stride]; hr = pStream->Read(pBuffer, bufHeader.numElements * bufHeader.stride, &cbRead); // Add index buffer AddIndexBuffer(pBuffer, bufHeader.numElements, bufHeader.stride); SAFE_DELETE_ARRAY(pBuffer); } // Read materials for (UINT i = 0; i < header.numMaterials; i++) { MODELCONTENTMATERIALHEADER materialheader = {0}; hr = pStream->Read(&materialheader, sizeof(materialheader), &cbRead); // Add material AddMaterial(materialheader.diffuse, materialheader.specular, materialheader.normal); } // Read meshes for (UINT i = 0; i < header.numMeshes; i++) { MODELCONTENTMESHHEADER meshHeader = {0}; hr = pStream->Read(&meshHeader, sizeof(meshHeader), &cbRead); // Add mesh //AddMesh(meshHeader.name, meshHeader.info.vertexBufferId, meshHeader.info.indexBufferId, meshHeader.info.materialId); m_meshMap.insert(std::pair<std::string,MeshInfo>(std::string(meshHeader.name), meshHeader.info)); } Exit: SAFE_RELEASE(pStream); return hr; }