diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/include/UserRenderSpriteBufferDesc.h | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'APEX_1.4/include/UserRenderSpriteBufferDesc.h')
| -rw-r--r-- | APEX_1.4/include/UserRenderSpriteBufferDesc.h | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/APEX_1.4/include/UserRenderSpriteBufferDesc.h b/APEX_1.4/include/UserRenderSpriteBufferDesc.h new file mode 100644 index 00000000..b734d975 --- /dev/null +++ b/APEX_1.4/include/UserRenderSpriteBufferDesc.h @@ -0,0 +1,364 @@ +/* + * 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. + */ + + +#ifndef USER_RENDER_SPRITE_BUFFER_DESC_H +#define USER_RENDER_SPRITE_BUFFER_DESC_H + +/*! +\file +\brief class UserRenderSpriteBufferDesc, structs RenderDataFormat and RenderSpriteSemantic +*/ + +#include "ApexUsingNamespace.h" +#include "RenderDataFormat.h" +#include "UserRenderResourceManager.h" + +namespace physx +{ + class PxCudaContextManager; +}; + +namespace nvidia +{ +namespace apex +{ + +PX_PUSH_PACK_DEFAULT + +#if !PX_PS4 + #pragma warning(push) + #pragma warning(disable:4121) +#endif //!PX_PS4 + +/** +\brief potential semantics of a sprite buffer +*/ +struct RenderSpriteSemantic +{ + /** + \brief Enum of sprite buffer semantics types + */ + enum Enum + { + POSITION = 0, //!< Position of sprite + COLOR, //!< Color of sprite + VELOCITY, //!< Linear velocity of sprite + SCALE, //!< Scale of sprite + LIFE_REMAIN, //!< 1.0 (new) .. 0.0 (dead) + DENSITY, //!< Particle density at sprite location + SUBTEXTURE, //!< Sub-texture index of sprite + ORIENTATION, //!< 2D sprite orientation (angle in radians, CCW in screen plane) + + USER_DATA, //!< User data - 32 bits (passed from Emitter) + + NUM_SEMANTICS //!< Count of semantics, not a valid semantic. + }; +}; + +/** +\brief potential semantics of a sprite buffer +*/ +struct RenderSpriteLayoutElement +{ + /** + \brief Enum of sprite buffer semantics types + */ + enum Enum + { + POSITION_FLOAT3, + COLOR_RGBA8, + COLOR_BGRA8, + COLOR_FLOAT4, + VELOCITY_FLOAT3, + SCALE_FLOAT2, + LIFE_REMAIN_FLOAT1, + DENSITY_FLOAT1, + SUBTEXTURE_FLOAT1, + ORIENTATION_FLOAT1, + USER_DATA_UINT1, + + NUM_SEMANTICS + }; + + /** + \brief Get semantic format + */ + static PX_INLINE RenderDataFormat::Enum getSemanticFormat(Enum semantic) + { + switch (semantic) + { + case POSITION_FLOAT3: + return RenderDataFormat::FLOAT3; + case COLOR_RGBA8: + return RenderDataFormat::R8G8B8A8; + case COLOR_BGRA8: + return RenderDataFormat::B8G8R8A8; + case COLOR_FLOAT4: + return RenderDataFormat::FLOAT4; + case VELOCITY_FLOAT3: + return RenderDataFormat::FLOAT3; + case SCALE_FLOAT2: + return RenderDataFormat::FLOAT2; + case LIFE_REMAIN_FLOAT1: + return RenderDataFormat::FLOAT1; + case DENSITY_FLOAT1: + return RenderDataFormat::FLOAT1; + case SUBTEXTURE_FLOAT1: + return RenderDataFormat::FLOAT1; + case ORIENTATION_FLOAT1: + return RenderDataFormat::FLOAT1; + case USER_DATA_UINT1: + return RenderDataFormat::UINT1; + default: + PX_ALWAYS_ASSERT(); + return RenderDataFormat::NUM_FORMATS; + } + } +/** + \brief Get semantic from layout element format + */ + static PX_INLINE RenderSpriteSemantic::Enum getSemantic(Enum semantic) + { + switch (semantic) + { + case POSITION_FLOAT3: + return RenderSpriteSemantic::POSITION; + case COLOR_RGBA8: + case COLOR_BGRA8: + case COLOR_FLOAT4: + return RenderSpriteSemantic::COLOR; + case VELOCITY_FLOAT3: + return RenderSpriteSemantic::VELOCITY; + case SCALE_FLOAT2: + return RenderSpriteSemantic::SCALE; + case LIFE_REMAIN_FLOAT1: + return RenderSpriteSemantic::LIFE_REMAIN; + case DENSITY_FLOAT1: + return RenderSpriteSemantic::DENSITY; + case SUBTEXTURE_FLOAT1: + return RenderSpriteSemantic::SUBTEXTURE; + case ORIENTATION_FLOAT1: + return RenderSpriteSemantic::ORIENTATION; + case USER_DATA_UINT1: + return RenderSpriteSemantic::USER_DATA; + default: + PX_ALWAYS_ASSERT(); + return RenderSpriteSemantic::NUM_SEMANTICS; + } + } +}; + +/** +\brief Struct for sprite texture layout info +*/ +struct RenderSpriteTextureLayout +{ + /** + \brief Enum of sprite texture layout info + */ + enum Enum + { + NONE = 0, + POSITION_FLOAT4, //float4(POSITION.x, POSITION.y, POSITION.z, 1) + SCALE_ORIENT_SUBTEX_FLOAT4, //float4(SCALE.x, SCALE.y, ORIENTATION, SUBTEXTURE) + COLOR_RGBA8, + COLOR_BGRA8, + COLOR_FLOAT4, + NUM_LAYOUTS + }; + + /** + \brief Get layout format + */ + static PX_INLINE RenderDataFormat::Enum getLayoutFormat(Enum layout) + { + switch (layout) + { + case NONE: + return RenderDataFormat::UNSPECIFIED; + case POSITION_FLOAT4: + return RenderDataFormat::FLOAT4; + case SCALE_ORIENT_SUBTEX_FLOAT4: + return RenderDataFormat::FLOAT4; + case COLOR_RGBA8: + return RenderDataFormat::R8G8B8A8; + case COLOR_BGRA8: + return RenderDataFormat::B8G8R8A8; + case COLOR_FLOAT4: + return RenderDataFormat::R32G32B32A32_FLOAT; + default: + PX_ALWAYS_ASSERT(); + return RenderDataFormat::NUM_FORMATS; + } + } + +}; + +/** +\brief Class for storing sprite texture render data +*/ +class UserRenderSpriteTextureDesc +{ +public: + RenderSpriteTextureLayout::Enum layout; //!< texture layout + uint32_t width; //!< texture width + uint32_t height; //!< texture height + uint32_t pitchBytes; //!< texture pitch bytes + uint32_t arrayIndex; //!< array index for array textures or cubemap face index + uint32_t mipLevel; //!< mipmap level + +public: + PX_INLINE UserRenderSpriteTextureDesc(void) + { + layout = RenderSpriteTextureLayout::NONE; + width = 0; + height = 0; + pitchBytes = 0; + + arrayIndex = 0; + mipLevel = 0; + } + + /** + \brief Check if this object is the same as other + */ + bool isTheSameAs(const UserRenderSpriteTextureDesc& other) const + { + if (layout != other.layout) return false; + if (width != other.width) return false; + if (height != other.height) return false; + if (pitchBytes != other.pitchBytes) return false; + if (arrayIndex != other.arrayIndex) return false; + if (mipLevel != other.mipLevel) return false; + return true; + } +}; + +/** +\brief describes the semantics and layout of a sprite buffer +*/ +class UserRenderSpriteBufferDesc +{ +public: + /** + \brief Max number of sprite textures + */ + static const uint32_t MAX_SPRITE_TEXTURES = 4; + + UserRenderSpriteBufferDesc(void) + { + setDefaults(); + } + + /** + \brief Default values + */ + void setDefaults() + { + maxSprites = 0; + hint = RenderBufferHint::STATIC; + registerInCUDA = false; + interopContext = 0; + + for (uint32_t i = 0; i < RenderSpriteLayoutElement::NUM_SEMANTICS; i++) + { + semanticOffsets[i] = static_cast<uint32_t>(-1); + } + stride = 0; + + textureCount = 0; + } + + /** + \brief Checks if data is correct + */ + bool isValid(void) const + { + uint32_t numFailed = 0; + + numFailed += (maxSprites == 0); + numFailed += (textureCount == 0) && (stride == 0); + numFailed += (textureCount == 0) && (semanticOffsets[RenderSpriteLayoutElement::POSITION_FLOAT3] == uint32_t(-1)); + numFailed += registerInCUDA && (interopContext == 0); + + numFailed += ((stride & 0x03) != 0); + for (uint32_t i = 0; i < RenderSpriteLayoutElement::NUM_SEMANTICS; i++) + { + if (semanticOffsets[i] != static_cast<uint32_t>(-1)) + { + numFailed += (semanticOffsets[i] >= stride); + numFailed += ((semanticOffsets[i] & 0x03) != 0); + } + } + + return (numFailed == 0); + } + + /** + \brief Check if this object is the same as other + */ + bool isTheSameAs(const UserRenderSpriteBufferDesc& other) const + { + if (registerInCUDA != other.registerInCUDA) return false; + if (maxSprites != other.maxSprites) return false; + if (hint != other.hint) return false; + if (textureCount != other.textureCount) return false; + if (textureCount == 0) + { + if (stride != other.stride) return false; + for (uint32_t i = 0; i < RenderSpriteLayoutElement::NUM_SEMANTICS; i++) + { + if (semanticOffsets[i] != other.semanticOffsets[i]) return false; + } + } + else + { + for (uint32_t i = 0; i < textureCount; i++) + { + if (textureDescs[i].isTheSameAs(other.textureDescs[i]) == false) return false; + } + } + return true; + } + +public: + uint32_t maxSprites; //!< The maximum number of sprites that APEX will store in this buffer + RenderBufferHint::Enum hint; //!< A hint about the update frequency of this buffer + + /** + \brief Array of the corresponding offsets (in bytes) for each semantic. + */ + uint32_t semanticOffsets[RenderSpriteLayoutElement::NUM_SEMANTICS]; + + uint32_t stride; //!< The stride between sprites of this buffer. Required when CUDA interop is used! + + bool registerInCUDA; //!< Declare if the resource must be registered in CUDA upon creation + + /** + This context must be used to register and unregister the resource every time the + device is lost and recreated. + */ + PxCudaContextManager* interopContext; + + uint32_t textureCount; //!< the number of textures + UserRenderSpriteTextureDesc textureDescs[MAX_SPRITE_TEXTURES]; //!< an array of texture descriptors +}; + +#if !PX_PS4 + #pragma warning(pop) +#endif //!PX_PS4 + +PX_POP_PACK + +} +} // end namespace nvidia::apex + +#endif // USER_RENDER_SPRITE_BUFFER_DESC_H |