Esempio n. 1
0
/**	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);
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
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;
}