source: GTP/trunk/App/Games/Jungle_Rumble/src/physic/physics/include/NxTriangleMeshDesc.h @ 1378

Revision 1378, 6.5 KB checked in by giegl, 18 years ago (diff)

GTPD - Jungle Rumble - integrate into GTP SVN structure

Line 
1#ifndef NX_COLLISION_NXTRIANGLEMESHDESC
2#define NX_COLLISION_NXTRIANGLEMESHDESC
3/*----------------------------------------------------------------------------*\
4|
5|                                               Public Interface to NovodeX Technology
6|
7|                                                            www.novodex.com
8|
9\*----------------------------------------------------------------------------*/
10/** \addtogroup physics
11  @{
12*/
13
14#include "NxTriangleMesh.h"
15#include "NxSimpleTriangleMesh.h"
16
17/**
18\brief Descriptor class for #NxTriangleMesh.
19
20Note that this class is derived from NxSimpleTriangleMesh which contains the members that describe the basic mesh.
21The mesh data is *copied* when an NxTriangleMesh object is created from this descriptor. After the call the
22user may discard the triangle data.
23
24@see NxTriangleMesh NxTriangleMeshShape
25*/
26class NxTriangleMeshDesc : public NxSimpleTriangleMesh
27        {
28        public:
29        /**
30        If materialIndices is NULL (not used) then this should be zero. Otherwise this is the
31        offset between material indices in bytes. This is at least sizeof(NxMaterialIndex).
32
33        <b>Default:</b> 0
34
35        <b>Platform:</b>
36        \li PC SW: Yes
37        \li PPU  : No
38        \li PS3  : Yes
39        \li XB360: Yes
40
41        @see materialIndices
42        */
43        NxU32                                   materialIndexStride;
44
45        /**
46        Optional pointer to first material index, or NULL. There are NxSimpleTriangleMesh::numTriangles indices in total.
47        Caller may add materialIndexStride bytes to the pointer to access the next triangle.
48
49        When a triangle mesh collides with another object, a material is required at the collision point.
50        If materialIndices is NULL, then the material of the NxTriangleMeshShape instance (specified via NxShapeDesc::materialIndex) is used.
51        Otherwise, if the point of contact is on a triangle with index i, then the material index is determined as:
52        NxMaterialIndex index = *(NxMaterialIndex *)(((NxU8*)materialIndices) + materialIndexStride * i);
53
54        If the contact point falls on a vertex or an edge, a triangle adjacent to the vertex or edge is selected, and its index
55        used to look up a material. The selection is arbitrary but consistent over time.
56
57        <b>Default:</b> NULL
58
59        <b>Platform:</b>
60        \li PC SW: Yes
61        \li PPU  : No
62        \li PS3  : Yes
63        \li XB360: Yes
64
65        @see materialIndexStride
66        */
67        const void*                             materialIndices;
68
69        /**
70        The mesh may represent either an arbitrary mesh or a height field. The advantage of a height field
71        is that it is assumed to be semi-infinite along one axis, and therefore it doesn't have the problem
72        of fast moving objects 'popping' through it due to temporal under sampling.
73
74        However, height fields must be 'flat' in the sense that the projections of all triangles onto the
75        height field plane must be disjoint. (If the height field vertical axis is Y, the height field plane is spanned by X and Z.)
76
77        To create a height field, set heightFieldVerticalAxis to NX_X, NX_Y or NX_Z,
78        or leave it set to NX_NOT_HEIGHTFIELD for an arbitrary mesh.
79
80        <b>Default:</b> NX_NOT_HEIGHTFIELD
81
82        <b>Platform:</b>
83        \li PC SW: Yes
84        \li PPU  : No
85        \li PS3  : Yes
86        \li XB360: Yes
87
88        @see NxHeightFieldAxis heightFieldVerticalExtent
89        */
90        NxHeightFieldAxis               heightFieldVerticalAxis;
91
92        /**
93        If this mesh is a height field, this sets how far 'below ground' the height volume extends.
94
95        In this way even objects which are under the surface of the height field but above
96        this cutoff are treated as colliding with the height field. To create a height field with the up axis being
97        the Y axis, you need to set the heightFieldVerticalAxis to Y and the heightFieldVerticalExtent to a large negative number.
98
99        The heightFieldVerticalExtent has to be outside of the vertex coordinate range of the mesh along the heightFieldVerticalAxis.
100
101        You may set this to a positive value, in which case the extent will be cast along the opposite side of the height field.
102
103        You may use a smaller finite value for the extent if you want to put some space under the height field, such as a cave.
104
105        <b>Range:</b> (-inf,inf)<br>
106        <b>Default:</b> 0
107
108        <b>Platform:</b>
109        \li PC SW: Yes
110        \li PPU  : No
111        \li PS3  : Yes
112        \li XB360: Yes
113
114        @see heightFieldVerticalAxis
115        */
116        NxReal                                  heightFieldVerticalExtent;
117
118        /**
119        The pmap is an optional data structure which makes mesh-mesh collision detection more robust at the cost of higher
120        memory consumption. A pmap can be created with ::NxCreatePMap and released with ::NxReleasePMap.
121        You may also save the output of ::NxCreatePMap do disc to avoid this preprocessing step.
122
123        The pmap data will not be copied. For this reason the caller does not need to keep it around for the lifetime of
124        the NxTriangleMesh object.
125
126        <b>Default:</b> NULL
127
128        <b>Platform:</b>
129        \li PC SW: Yes
130        \li PPU  : No
131        \li PS3  : Yes
132        \li XB360: Yes
133
134        @see NxTriangleMesh.loadPMap
135        */
136        NxPMap*                                 pmap;
137
138        /**
139        The SDK computes convex edges of a mesh and use them for collision detection. This parameter allows you to
140        setup a tolerance for the convex edge detector.
141
142        <b>Range:</b> (0,inf)<br>
143        <b>Default:</b> 0.001
144
145        <b>Platform:</b>
146        \li PC SW: Yes
147        \li PPU  : No
148        \li PS3  : Yes
149        \li XB360: Yes
150        */
151        NxReal                                  convexEdgeThreshold;
152
153        /**
154        \brief Constructor sets to default.
155        */
156        NX_INLINE NxTriangleMeshDesc();
157       
158        /**
159        \brief (re)sets the structure to the default.   
160        */
161        NX_INLINE void setToDefault();
162       
163        /**
164        \brief Returns true if the descriptor is valid.
165        \return true if the current settings are valid
166        */
167        NX_INLINE bool isValid() const;
168        };
169
170NX_INLINE NxTriangleMeshDesc::NxTriangleMeshDesc()      //constructor sets to default
171        {
172        setToDefault();
173        }
174
175NX_INLINE void NxTriangleMeshDesc::setToDefault()
176        {
177        NxSimpleTriangleMesh::setToDefault();
178        materialIndexStride                     = 0;
179        materialIndices                         = 0;
180        heightFieldVerticalAxis         = NX_NOT_HEIGHTFIELD;
181        heightFieldVerticalExtent       = 0;
182        convexEdgeThreshold                     = 0.001f;
183        pmap                                            = NULL;
184        }
185
186NX_INLINE bool NxTriangleMeshDesc::isValid() const
187        {
188        if(numVertices < 3)     //at least 1 trig's worth of points
189                return false;
190        if ((!triangles) && (numVertices%3))            // Non-indexed mesh => we must ensure the geometry defines an implicit number of triangles // i.e. numVertices can't be divided by 3
191                return false;
192        //add more validity checks here
193        if (materialIndices && materialIndexStride < sizeof(NxMaterialIndex))
194                return false;
195        return NxSimpleTriangleMesh::isValid();
196        }
197
198/** @} */
199#endif
200
201
202//AGCOPYRIGHTBEGIN
203///////////////////////////////////////////////////////////////////////////
204// Copyright © 2005 AGEIA Technologies.
205// All rights reserved. www.ageia.com
206///////////////////////////////////////////////////////////////////////////
207//AGCOPYRIGHTEND
208
Note: See TracBrowser for help on using the repository browser.