Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef RENDER_MESH_ASSET_H
00013 #define RENDER_MESH_ASSET_H
00014
00020 #include "ApexUsingNamespace.h"
00021 #include "VertexFormat.h"
00022 #include "Asset.h"
00023 #include "RenderBufferData.h"
00024 #include "RenderMesh.h"
00025
00026 namespace nvidia
00027 {
00028 namespace apex
00029 {
00030
00031 PX_PUSH_PACK_DEFAULT
00032
00033 class RenderMeshActor;
00034 class RenderMeshActorDesc;
00035 class CustomBufferIterator;
00036
00038 #define RENDER_MESH_AUTHORING_TYPE_NAME "ApexRenderMesh"
00039
00043 struct RenderMeshAssetStats
00044 {
00045 uint32_t totalBytes;
00046 uint32_t submeshCount;
00047 uint32_t partCount;
00048 uint32_t vertexCount;
00049 uint32_t indexCount;
00050 uint32_t vertexBufferBytes;
00051 uint32_t indexBufferBytes;
00052 };
00053
00057 struct RenderMeshAssetInstanceMode
00058 {
00062 enum Enum
00063 {
00064 POSE_SCALE = 0,
00065 POS_VEL_LIFE,
00066
00067 NUM_MODES
00068 };
00069 };
00070
00071
00075 struct VertexColor
00076 {
00077 public:
00078
00079 PX_INLINE VertexColor() {}
00080
00084 PX_INLINE VertexColor(const ColorRGBA c)
00085 {
00086 const float recip255 = 1 / (float)255;
00087 set((float)c.r * recip255, (float)c.g * recip255, (float)c.b * recip255, (float)c.a * recip255);
00088 }
00089
00093 PX_INLINE VertexColor& operator = (const VertexColor& c)
00094 {
00095 r = c.r;
00096 g = c.g;
00097 b = c.b;
00098 a = c.a;
00099 return *this;
00100 }
00101
00103 PX_INLINE void set(float _r, float _g, float _b, float _a)
00104 {
00105 r = _r;
00106 g = _g;
00107 b = _b;
00108 a = _a;
00109 }
00110
00112 PX_INLINE ColorRGBA toColorRGBA() const
00113 {
00114 return ColorRGBA((uint8_t)(255 * r + (float)0.5),
00115 (uint8_t)(255 * g + (float)0.5),
00116 (uint8_t)(255 * b + (float)0.5),
00117 (uint8_t)(255 * a + (float)0.5));
00118 }
00119
00120 float r;
00121 float g;
00122 float b;
00123 float a;
00124 };
00125
00126
00130 struct VertexUV
00131 {
00132 VertexUV() {}
00133
00137 VertexUV(float _u, float _v)
00138 {
00139 set(_u, _v);
00140 }
00141
00145 VertexUV(const float uv[])
00146 {
00147 set(uv);
00148 }
00149
00153 void set(float _u, float _v)
00154 {
00155 u = _u;
00156 v = _v;
00157 }
00158
00162 void set(const float uv[])
00163 {
00164 u = uv[0];
00165 v = uv[1];
00166 }
00167
00171 float& operator [](int i)
00172 {
00173 PX_ASSERT(i >= 0 && i <= 1);
00174 return (&u)[i];
00175 }
00176
00180 const float& operator [](int i) const
00181 {
00182 PX_ASSERT(i >= 0 && i <= 1);
00183 return (&u)[i];
00184 }
00185
00187 float u;
00189 float v;
00190 };
00191
00192
00196 struct Vertex
00197 {
00198 PxVec3 position;
00199 PxVec3 normal;
00200 PxVec3 tangent;
00201 PxVec3 binormal;
00202 VertexUV uv[VertexFormat::MAX_UV_COUNT];
00203 VertexColor color;
00204 uint16_t boneIndices[VertexFormat::MAX_BONE_PER_VERTEX_COUNT];
00205 float boneWeights[VertexFormat::MAX_BONE_PER_VERTEX_COUNT];
00206 uint16_t displacementFlags;
00207
00211 Vertex()
00212 {
00213 memset(this, 0, sizeof(Vertex));
00214 }
00215 };
00216
00217
00221 struct ExplicitRenderTriangle
00222 {
00223 Vertex vertices[3];
00224 int32_t submeshIndex;
00225 uint32_t smoothingMask;
00226 uint32_t extraDataIndex;
00227
00231 PxVec3 calculateNormal() const
00232 {
00233 return (vertices[1].position - vertices[0].position).cross(vertices[2].position - vertices[0].position);
00234 }
00235 };
00236
00237
00238
00242 struct RenderMeshPartData
00243 {
00244 RenderMeshPartData() : triangleCount(0), userData(NULL) {}
00245
00249 RenderMeshPartData(uint32_t _triCount, void* _data) : triangleCount(_triCount), userData(_data) {}
00250
00251 uint32_t triangleCount;
00252 void* userData;
00253 };
00254
00255
00259 class RenderMeshAssetAuthoring : public AssetAuthoring
00260 {
00261 public:
00263 class VertexBuffer : public RenderBufferData<RenderVertexSemantic, RenderVertexSemantic::Enum> {};
00264
00266 struct Primitive
00267 {
00271 enum Enum
00272 {
00273 TRIANGLE_LIST,
00274
00275
00276
00277 COUNT
00278 };
00279 };
00280
00282 struct IndexType
00283 {
00287 enum Enum
00288 {
00289 UINT,
00290 USHORT,
00291
00292 COUNT
00293 };
00294 };
00295
00298 class SubmeshDesc
00299 {
00300 public:
00302 const char* m_materialName;
00303
00305 const VertexBuffer* m_vertexBuffers;
00306
00308 uint32_t m_numVertexBuffers;
00309
00311 uint32_t m_numVertices;
00312
00314 Primitive::Enum m_primitive;
00315
00317 IndexType::Enum m_indexType;
00318
00320 const void* m_vertexIndices;
00321
00323 uint32_t m_numIndices;
00324
00329 uint32_t* m_smoothingGroups;
00330
00332 uint32_t m_firstVertex;
00333
00335 const void* m_partIndices;
00336
00338 uint32_t m_numParts;
00339
00341 RenderCullMode::Enum m_cullMode;
00342
00344 SubmeshDesc()
00345 {
00346 memset(this, 0, sizeof(SubmeshDesc));
00347 }
00348
00350 bool isValid() const
00351 {
00352 return m_materialName != NULL &&
00353 m_vertexBuffers != NULL &&
00354 m_numVertexBuffers > 0 &&
00355 m_numVertices > 0 &&
00356 m_primitive >= (Primitive::Enum)0 && m_primitive < Primitive::COUNT &&
00357 m_indexType >= (IndexType::Enum)0 && m_indexType < IndexType::COUNT &&
00358 m_numIndices > 0 &&
00359 (m_partIndices == NULL || m_numParts > 0) &&
00360 (m_cullMode == RenderCullMode::CLOCKWISE || m_cullMode == RenderCullMode::COUNTER_CLOCKWISE || m_cullMode == RenderCullMode::NONE);
00361 }
00362 };
00363
00365 class MeshDesc
00366 {
00367 public:
00369 const SubmeshDesc* m_submeshes;
00370
00372 uint32_t m_numSubmeshes;
00373
00375 TextureUVOrigin::Enum m_uvOrigin;
00376
00377
00378
00380 MeshDesc() : m_submeshes(NULL), m_numSubmeshes(0), m_uvOrigin(TextureUVOrigin::ORIGIN_TOP_LEFT) {}
00381
00383 bool isValid() const
00384 {
00385 return m_submeshes != NULL &&
00386 m_numSubmeshes > 0;
00387 }
00388 };
00389
00390
00396 virtual void createRenderMesh(const MeshDesc& meshDesc, bool createMappingInformation) = 0;
00397
00398
00407 virtual uint32_t createReductionMap(uint32_t* map, const Vertex* vertices, const uint32_t* smoothingGroups, uint32_t vertexCount,
00408 const PxVec3& positionTolerance, float normalTolerance, float UVTolerance) = 0;
00409
00410
00414 virtual void deleteStaticBuffersAfterUse(bool set) = 0;
00415
00420
00421
00423 virtual uint32_t getSubmeshCount() const = 0;
00425 virtual uint32_t getPartCount() const = 0;
00427 virtual const char* getMaterialName(uint32_t submeshIndex) const = 0;
00429 virtual void setMaterialName(uint32_t submeshIndex, const char* name) = 0;
00431 virtual void setWindingOrder(uint32_t submeshIndex, RenderCullMode::Enum winding) = 0;
00433 virtual RenderCullMode::Enum getWindingOrder(uint32_t submeshIndex) const = 0;
00435 virtual const RenderSubmesh& getSubmesh(uint32_t submeshIndex) const = 0;
00437 virtual RenderSubmesh& getSubmeshWritable(uint32_t submeshIndex) = 0;
00439 virtual const PxBounds3& getBounds(uint32_t partIndex = 0) const = 0;
00441 virtual void getStats(RenderMeshAssetStats& stats) const = 0;
00442 };
00443
00444
00450 class RenderMeshAsset : public Asset
00451 {
00452 public:
00453
00459 virtual RenderMeshActor* createActor(const RenderMeshActorDesc& desc) = 0;
00460
00464 virtual void releaseActor(RenderMeshActor&) = 0;
00465
00471 virtual uint32_t getSubmeshCount() const = 0;
00472
00478 virtual uint32_t getPartCount() const = 0;
00479
00483 virtual const char* getMaterialName(uint32_t submeshIndex) const = 0;
00484
00491 virtual const RenderSubmesh& getSubmesh(uint32_t submeshIndex) const = 0;
00492
00498 virtual const PxBounds3& getBounds(uint32_t partIndex = 0) const = 0;
00499
00505 virtual void getStats(RenderMeshAssetStats& stats) const = 0;
00506
00510 virtual UserOpaqueMesh* getOpaqueMesh(void) const = 0;
00511
00512 protected:
00513 virtual ~RenderMeshAsset() {}
00514 };
00515
00516 PX_POP_PACK
00517
00518 }
00519 }
00520
00521 #endif // RENDER_MESH_ASSET_H