void ApexVertexBuffer::build(const VertexFormat& format, uint32_t vertexCount)
{
	const ApexVertexFormat* apexVertexFormat = DYNAMIC_CAST(const ApexVertexFormat*)(&format);
	if (apexVertexFormat)
	{
		mFormat.copy(*apexVertexFormat);
	}

	NvParameterized::Handle handle(*mParams);
	VERIFY_PARAM(mParams->getParameterHandle("buffers", handle));
	VERIFY_PARAM(mParams->resizeArray(handle, mFormat.mParams->bufferFormats.arraySizes[0]));

	resize(vertexCount);
}
LTRESULT CLTRealConsoleMgr::GetErrorDescription(HRESULT hrError, char* szBuffer, uint32* pSizeOfBuffer)
{
	// Sanity checks...

	VERIFY_PARAM(szBuffer);
	VERIFY_PARAM(pSizeOfBuffer);


	// Get the console error description...

	HRESULT hr = RNGetErrorDescriptionA(m_pConsole, hrError, szBuffer, (unsigned long*)pSizeOfBuffer);
	if (hr == RNGC_BUFFERTOOSMALL) HANDLE_FAILURE_RESULT(hr, LT_BUFFERTOOSMALL);


	// If we didn't get an error description from the console, do our own...

	if (hr != S_OK)
	{
		switch (hr)
		{
			COPY_ERROR_DESC(RNGC_NOCONSOLE, "RNGC_NOCONSOLE");
			COPY_ERROR_DESC(RNGC_INVALID_IID, "RNGC_INVALID_IID");
			COPY_ERROR_DESC(RNGC_INVALID_LAUNCH, "RNGC_INVALID_LAUNCH");
			COPY_ERROR_DESC(RNGC_TOURNEY_OVER, "RNGC_TOURNEY_OVER");
			COPY_ERROR_DESC(RNGC_SERVER_UNREACHABLE, "RNGC_SERVER_UNREACHABLE");
			COPY_ERROR_DESC(RNGC_RESULTS_INVALID, "RNGC_RESULTS_INVALID");
			COPY_ERROR_DESC(RNGC_RESULTS_TOO_LATE, "RNGC_RESULTS_TOO_LATE");
			COPY_ERROR_DESC(RNGC_IGNORE, "RNGC_IGNORE");
			COPY_ERROR_DESC(RNGC_BUFFERTOOSMALL, "RNGC_BUFFERTOOSMALL");
			COPY_ERROR_DESC(RNGC_NOTFOUND, "RNGC_NOTFOUND");
			COPY_ERROR_DESC(RNGC_QUEUE_EMPTY, "RNGC_QUEUE_EMPTY");
			COPY_ERROR_DESC(RNGC_TIMED_OUT, "RNGC_TIMED_OUT");
			COPY_ERROR_DESC(RNGC_NOTINITIALIZED, "RNGC_NOTINITIALIZED");
			COPY_ERROR_DESC(S_OK, "S_OK");
		}
	}

	HANDLE_FAILURE_RESULT(hr, LT_ERROR);


	// All done...

	return(LT_OK);
}
LTRESULT CLTRealConsoleMgr::GetMessageDescription(RNGC_MESSAGE_TYPE nType, IRNGCMessage* pMessage, char* szBuffer, uint32* pSizeOfBuffer)
{
	// Sanity checks...

	VERIFY_PARAM(szBuffer);
	VERIFY_PARAM(pSizeOfBuffer);


	// Get the console message description...

	HRESULT hr = RNGetMessageDescriptionA(m_pConsole, nType, pMessage, szBuffer, (unsigned long*)pSizeOfBuffer);
	if (hr == RNGC_BUFFERTOOSMALL) HANDLE_FAILURE_RESULT(hr, LT_BUFFERTOOSMALL);
	HANDLE_FAILURE_RESULT(hr, LT_ERROR);


	// All done...

	return(LT_OK);
}
LTRESULT CLTRealConsoleMgr::ReleaseMessage(IRNGCMessage* pMessage)
{
	// Sanity checks...

	VERIFY_PARAM(pMessage);


	// Release the message object...

	pMessage->Release();


	// All done...

	return(LT_OK);
}
LTRESULT CLTRealConsoleMgr::IsInitialized(bool* pInited)
{
	// Sanity checks...

	VERIFY_PARAM(pInited);


	// Set whether or not we are initialized...

	*pInited = m_bInited;


	// All done...

	return(LT_OK);
}
LTRESULT CLTRealConsoleMgr::GetLastErrorResult(HRESULT* pErrorResult)
{
	// Sanity checks...

	VERIFY_INIT;
	VERIFY_PARAM(pErrorResult);


	// Get the last error...

	*pErrorResult = m_hrLastError;


	// All done...

	return(LT_OK);
}
LTRESULT CLTRealConsoleMgr::CreateMessage(IRNGCMessage** ppMessage)
{
	// Sanity checks...

	VERIFY_INIT;
	VERIFY_PARAM(ppMessage);


	// Create a new message object...

	HRESULT hr = RNCreateMessage(ppMessage);
	HANDLE_FAILURE_RESULT(hr, LT_ERROR);


	// All done...

	return(LT_OK);
}
void ApexVertexBuffer::resize(uint32_t vertexCount)
{
	mParams->vertexCount = vertexCount;

	NvParameterized::Handle handle(*mParams);

	VERIFY_PARAM(mParams->getParameterHandle("buffers", handle));
	int32_t buffersSize = 0;
	VERIFY_PARAM(mParams->getArraySize(handle, buffersSize));

	for (int32_t i = 0; i < buffersSize; i++)
	{
		RenderDataFormat::Enum outFormat = mFormat.getBufferFormat((uint32_t)i);

		NvParameterized::Handle elementHandle(*mParams);
		VERIFY_PARAM(handle.getChildHandle(i, elementHandle));

		NvParameterized::Interface* currentReference = NULL;
		VERIFY_PARAM(mParams->getParamRef(elementHandle, currentReference));

		// BUFFER_FORMAT_ADD This is just a bookmark for places where to add buffer formats
		if (currentReference == NULL && vertexCount > 0)
		{
			const char* className = NULL;

			switch (outFormat)
			{
			case RenderDataFormat::UBYTE1:
			case RenderDataFormat::BYTE_UNORM1:
			case RenderDataFormat::BYTE_SNORM1:
				className = BufferU8x1::staticClassName();
				break;
			case RenderDataFormat::UBYTE2:
			case RenderDataFormat::BYTE_UNORM2:
			case RenderDataFormat::BYTE_SNORM2:
				className = BufferU8x2::staticClassName();
				break;
			case RenderDataFormat::UBYTE3:
			case RenderDataFormat::BYTE_UNORM3:
			case RenderDataFormat::BYTE_SNORM3:
				className = BufferU8x3::staticClassName();
				break;
			case RenderDataFormat::UBYTE4:
			case RenderDataFormat::BYTE_UNORM4:
			case RenderDataFormat::BYTE_SNORM4:
			case RenderDataFormat::R8G8B8A8:
			case RenderDataFormat::B8G8R8A8:
				className = BufferU8x4::staticClassName();
				break;
			case RenderDataFormat::SHORT1:
			case RenderDataFormat::USHORT1:
			case RenderDataFormat::SHORT_UNORM1:
			case RenderDataFormat::SHORT_SNORM1:
			case RenderDataFormat::HALF1:
				className = BufferU16x1::staticClassName();
				break;
			case RenderDataFormat::SHORT2:
			case RenderDataFormat::USHORT2:
			case RenderDataFormat::SHORT_UNORM2:
			case RenderDataFormat::SHORT_SNORM2:
			case RenderDataFormat::HALF2:
				className = BufferU16x2::staticClassName();
				break;
			case RenderDataFormat::SHORT3:
			case RenderDataFormat::USHORT3:
			case RenderDataFormat::SHORT_UNORM3:
			case RenderDataFormat::SHORT_SNORM3:
			case RenderDataFormat::HALF3:
				className = BufferU16x3::staticClassName();
				break;
			case RenderDataFormat::SHORT4:
			case RenderDataFormat::USHORT4:
			case RenderDataFormat::SHORT_UNORM4:
			case RenderDataFormat::SHORT_SNORM4:
			case RenderDataFormat::HALF4:
				className = BufferU16x4::staticClassName();
				break;
			case RenderDataFormat::UINT1:
				className = BufferU32x1::staticClassName();
				break;
			case RenderDataFormat::UINT2:
				className = BufferU32x2::staticClassName();
				break;
			case RenderDataFormat::UINT3:
				className = BufferU32x3::staticClassName();
				break;
			case RenderDataFormat::UINT4:
				className = BufferU32x4::staticClassName();
				break;
			case RenderDataFormat::FLOAT1:
				className = BufferF32x1::staticClassName();
				break;
			case RenderDataFormat::FLOAT2:
				className = BufferF32x2::staticClassName();
				break;
			case RenderDataFormat::FLOAT3:
				className = BufferF32x3::staticClassName();
				break;
			case RenderDataFormat::FLOAT4:
			case RenderDataFormat::R32G32B32A32_FLOAT:
			case RenderDataFormat::B32G32R32A32_FLOAT:
				className = BufferF32x4::staticClassName();
				break;
			default:
				PX_ALWAYS_ASSERT();
				break;
			}

			if (className != NULL)
			{
				currentReference = GetInternalApexSDK()->getParameterizedTraits()->createNvParameterized(className);
			}

			if (currentReference != NULL)
			{
				NvParameterized::Handle arrayHandle(*currentReference);
				VERIFY_PARAM(currentReference->getParameterHandle("data", arrayHandle));
				PX_ASSERT(arrayHandle.isValid());
				VERIFY_PARAM(arrayHandle.resizeArray((int32_t)vertexCount));

				mParams->setParamRef(elementHandle, currentReference);
			}
		}
		else if (vertexCount > 0)
		{
			NvParameterized::Interface* oldReference = currentReference;
			PX_ASSERT(oldReference != NULL);
			currentReference = GetInternalApexSDK()->getParameterizedTraits()->createNvParameterized(oldReference->className());
			if (currentReference != NULL)
			{
				VERIFY_PARAM(currentReference->copy(*oldReference));

				NvParameterized::Handle arrayHandle(*currentReference);
				VERIFY_PARAM(currentReference->getParameterHandle("data", arrayHandle));
				VERIFY_PARAM(arrayHandle.resizeArray((int32_t)vertexCount));
			}
			VERIFY_PARAM(mParams->setParamRef(elementHandle, currentReference));
			oldReference->destroy();
		}
		else if (vertexCount == 0)
		{
			VERIFY_PARAM(mParams->setParamRef(elementHandle, NULL));

			if (currentReference != NULL)
			{
				currentReference->destroy();
			}
		}
	}
}