bool ApexRenderMeshAsset::createFromParameters(RenderMeshAssetParameters* params)
{
	mParams = params;

	NxParameterized::Handle handle(*mParams);
	physx::PxU32 size;

	// submeshes
	mParams->getParameterHandle("submeshes", handle);
	mParams->getArraySize(handle, (physx::PxI32&)size);
	setSubmeshCount(size);
	for (physx::PxU32 i = 0; i < size; ++i)
	{
		NxParameterized::Handle elementHandle(*mParams);
		handle.getChildHandle((physx::PxI32)i, elementHandle);
		NxParameterized::Interface* submeshParams = NULL;
		mParams->getParamRef(elementHandle, submeshParams);

		mSubmeshes[i]->setParams(static_cast<SubmeshParameters*>(submeshParams), NULL);
	}

	createLocalData();

	return true;
}
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();
			}
		}
	}
}