diff options
Diffstat (limited to 'APEX_1.4/module/iofx/src/IofxRenderDataSprite.cpp')
| -rw-r--r-- | APEX_1.4/module/iofx/src/IofxRenderDataSprite.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/APEX_1.4/module/iofx/src/IofxRenderDataSprite.cpp b/APEX_1.4/module/iofx/src/IofxRenderDataSprite.cpp new file mode 100644 index 00000000..c2fb9318 --- /dev/null +++ b/APEX_1.4/module/iofx/src/IofxRenderDataSprite.cpp @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + + +#include "Apex.h" +#include "IofxSceneCPU.h" +#include "IofxSceneGPU.h" +#include "IosObjectData.h" +#include "IofxRenderData.h" +#include "IofxActorImpl.h" + +namespace nvidia +{ +namespace iofx +{ + +bool IofxSharedRenderDataSpriteImpl::createRenderLayout(IofxScene& iofxScene, uint32_t semantics, uint32_t maxObjectCount, RenderLayout_t& renderLayout) +{ + bool bIsUserDefinedLayout = false; + IofxRenderCallback* renderCallback = iofxScene.getIofxRenderCallback(); + if (renderCallback) + { + if (renderCallback->getIofxSpriteRenderLayout(renderLayout, maxObjectCount, semantics, mInteropFlags)) + { + bIsUserDefinedLayout = renderLayout.isValid(); + } + } + if (!bIsUserDefinedLayout) + { + uint32_t offset = 0; + if (semantics & (1 << IofxRenderSemantic::POSITION)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::POSITION_FLOAT3; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::COLOR)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::COLOR_FLOAT4; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::VELOCITY)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::VELOCITY_FLOAT3; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::SCALE)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::SCALE_FLOAT2; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::LIFE_REMAIN)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::LIFE_REMAIN_FLOAT1; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::DENSITY)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::DENSITY_FLOAT1; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::SUBTEXTURE)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::SUBTEXTURE_FLOAT1; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::ORIENTATION)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::ORIENTATION_FLOAT1; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + if (semantics & (1 << IofxRenderSemantic::USER_DATA)) + { + IofxSpriteRenderLayoutElement::Enum element = IofxSpriteRenderLayoutElement::USER_DATA_UINT1; + renderLayout.offsets[element] = offset; + offset += RenderDataFormat::getFormatDataSize(IofxSpriteRenderLayoutElement::getFormat(element)); + } + renderLayout.stride = offset; + renderLayout.surfaceCount = 0; + + renderLayout.bufferDesc.setDefaults(); + renderLayout.bufferDesc.size = maxObjectCount * renderLayout.stride; + renderLayout.bufferDesc.interopFlags = mInteropFlags; + } + PX_ASSERT((renderLayout.stride & 0x03) == 0); + return bIsUserDefinedLayout; +} + +void IofxSharedRenderDataSpriteImpl::freeAllRenderStorage() +{ + if (mSharedRenderData.spriteRenderBuffer != NULL) + { + mSharedRenderData.spriteRenderBuffer->release(); + mSharedRenderData.spriteRenderBuffer = NULL; + } + + for (uint32_t i = 0; i < IofxSpriteRenderLayout::MAX_SURFACE_COUNT; ++i) + { + if (mSharedRenderData.spriteRenderSurfaces[i] != NULL) + { + mSharedRenderData.spriteRenderSurfaces[i]->release(); + mSharedRenderData.spriteRenderSurfaces[i] = NULL; + } + } +} + +bool IofxSharedRenderDataSpriteImpl::allocAllRenderStorage(const RenderLayout_t& newRenderLayout, IofxRenderCallback* iofxRenderCallback) +{ + bool result = false; + if (newRenderLayout.surfaceCount > 0) + { + result = true; + for (uint32_t i = 0; result && i < newRenderLayout.surfaceCount; ++i) + { + mSharedRenderData.spriteRenderSurfaces[i] = iofxRenderCallback->createRenderSurface(newRenderLayout.surfaceDescs[i]); + result &= (mSharedRenderData.spriteRenderSurfaces[i] != NULL); + } + if (!result) + { + for (uint32_t i = 0; i < newRenderLayout.surfaceCount; ++i) + { + if (mSharedRenderData.spriteRenderSurfaces[i] != NULL) + { + mSharedRenderData.spriteRenderSurfaces[i]->release(); + mSharedRenderData.spriteRenderSurfaces[i] = NULL; + } + } + } + } + else + { + mSharedRenderData.spriteRenderBuffer = iofxRenderCallback->createRenderBuffer(newRenderLayout.bufferDesc); + result = (mSharedRenderData.spriteRenderBuffer != NULL); + } + return result; +} + +} +} // namespace nvidia |