20btHeightfieldTerrainShape::btHeightfieldTerrainShape(
21 int heightStickWidth,
int heightStickLength,
const void* heightfieldData,
28 initialize(heightStickWidth, heightStickLength, heightfieldData,
29 heightScale, minHeight, maxHeight, upAxis, hdt,
33btHeightfieldTerrainShape::btHeightfieldTerrainShape(
int heightStickWidth,
int heightStickLength,
const void* heightfieldData,
btScalar maxHeight,
int upAxis,
bool useFloatData,
bool flipQuadEdges)
45 btScalar heightScale = maxHeight / 65535;
47 initialize(heightStickWidth, heightStickLength, heightfieldData,
48 heightScale, minHeight, maxHeight, upAxis, hdt,
52void btHeightfieldTerrainShape::initialize(
53 int heightStickWidth,
int heightStickLength,
const void* heightfieldData,
120btHeightfieldTerrainShape::~btHeightfieldTerrainShape()
135 btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
138 aabbMin = center - extent;
139 aabbMax = center + extent;
146btHeightfieldTerrainShape::getRawHeightFieldValue(
int x,
int y)
const
181void btHeightfieldTerrainShape::getVertex(
int x,
int y,
btVector3& vertex)
const
232 return (
int)(
x - 0.5);
234 return (
int)(
x + 0.5);
246void btHeightfieldTerrainShape::quantizeWithClamp(
int* out,
const btVector3&
point,
int )
const
275 int quantizedAabbMin[3];
276 int quantizedAabbMax[3];
282 for (
int i = 0; i < 3; ++i)
284 quantizedAabbMin[i]--;
285 quantizedAabbMax[i]++;
297 if (quantizedAabbMin[1] > startX)
298 startX = quantizedAabbMin[1];
299 if (quantizedAabbMax[1] < endX)
300 endX = quantizedAabbMax[1];
301 if (quantizedAabbMin[2] > startJ)
302 startJ = quantizedAabbMin[2];
303 if (quantizedAabbMax[2] < endJ)
304 endJ = quantizedAabbMax[2];
309 if (quantizedAabbMin[0] > startX)
310 startX = quantizedAabbMin[0];
311 if (quantizedAabbMax[0] < endX)
312 endX = quantizedAabbMax[0];
313 if (quantizedAabbMin[2] > startJ)
314 startJ = quantizedAabbMin[2];
315 if (quantizedAabbMax[2] < endJ)
316 endJ = quantizedAabbMax[2];
321 if (quantizedAabbMin[0] > startX)
322 startX = quantizedAabbMin[0];
323 if (quantizedAabbMax[0] < endX)
324 endX = quantizedAabbMax[0];
325 if (quantizedAabbMin[1] > startJ)
326 startJ = quantizedAabbMin[1];
327 if (quantizedAabbMax[1] < endJ)
328 endJ = quantizedAabbMax[1];
340 for (
int j = startJ; j < endJ; j++)
342 for (
int x = startX;
x < endX;
x++)
382void btHeightfieldTerrainShape::calculateLocalInertia(
btScalar,
btVector3& inertia)
const
389void btHeightfieldTerrainShape::setLocalScaling(
const btVector3& scaling)
393const btVector3& btHeightfieldTerrainShape::getLocalScaling()
const
400 struct GridRaycastState
417template <
typename Action_T>
421 rs.maxDistance3d = beginPos.distance(endPos);
422 if (rs.maxDistance3d < 0.0001)
431 rs.maxDistanceFlat =
btSqrt(rayDirectionFlatX * rayDirectionFlatX + rayDirectionFlatZ * rayDirectionFlatZ);
433 if (rs.maxDistanceFlat < 0.0001)
436 rayDirectionFlatX = 0;
437 rayDirectionFlatZ = 0;
441 rayDirectionFlatX /= rs.maxDistanceFlat;
442 rayDirectionFlatZ /= rs.maxDistanceFlat;
445 const int xiStep = rayDirectionFlatX > 0 ? 1 : rayDirectionFlatX < 0 ? -1 : 0;
446 const int ziStep = rayDirectionFlatZ > 0 ? 1 : rayDirectionFlatZ < 0 ? -1 : 0;
448 const float infinite = 9999999;
449 const btScalar paramDeltaX = xiStep != 0 ? 1.f /
btFabs(rayDirectionFlatX) : infinite;
450 const btScalar paramDeltaZ = ziStep != 0 ? 1.f /
btFabs(rayDirectionFlatZ) : infinite;
471 paramCrossX = infinite;
488 paramCrossZ = infinite;
495 if (paramCrossX == 0.0)
497 paramCrossX += paramDeltaX;
506 if (paramCrossZ == 0.0)
508 paramCrossZ += paramDeltaZ;
521 rs.prevParam = rs.param;
523 if (paramCrossX < paramCrossZ)
529 rs.param = paramCrossX;
530 paramCrossX += paramDeltaX;
536 rs.param = paramCrossZ;
537 paramCrossZ += paramDeltaZ;
540 if (rs.param > rs.maxDistanceFlat)
542 rs.param = rs.maxDistanceFlat;
577 shape->getVertex(
x,
z, vertices[0]);
578 shape->getVertex(
x + 1,
z, vertices[1]);
579 shape->getVertex(
x + 1,
z + 1, vertices[2]);
583 shape->getVertex(
x,
z, vertices[0]);
584 shape->getVertex(
x + 1,
z + 1, vertices[1]);
585 shape->getVertex(
x,
z + 1, vertices[2]);
591 shape->getVertex(
x,
z, vertices[0]);
592 shape->getVertex(
x,
z + 1, vertices[1]);
593 shape->getVertex(
x + 1,
z, vertices[2]);
597 shape->getVertex(
x + 1,
z, vertices[0]);
598 shape->getVertex(
x,
z + 1, vertices[1]);
599 shape->getVertex(
x + 1,
z + 1, vertices[2]);
606 exec(bs.prev_x, bs.prev_z);
639 const btHeightfieldTerrainShape::Range chunk =
vbounds[
x +
z *
width];
644 if (rs.maxDistanceFlat > 0.0001)
647 btScalar enterParam3d = rs.prevParam * flatTo3d;
648 btScalar exitParam3d = rs.param * flatTo3d;
654 if (enterPos[1] > chunk.max && exitPos[
m_indices[1]] > chunk.max)
658 if (enterPos[1] < chunk.min && exitPos[
m_indices[1]] < chunk.min)
689 processTriangles.
shape =
this;
692 processTriangles.
callback = callback;
703 int iBeginX =
static_cast<int>(
floor(beginPos[
indices[0]]));
704 int iBeginZ =
static_cast<int>(
floor(beginPos[
indices[2]]));
705 int iEndX =
static_cast<int>(
floor(endPos[
indices[0]]));
706 int iEndZ =
static_cast<int>(
floor(endPos[
indices[2]]));
708 if (iBeginX == iEndX && iBeginZ == iEndZ)
713 processTriangles.
exec(iBeginX, iEndZ);
737 processVBounds.rayBegin = beginPos;
738 processVBounds.rayEnd = endPos;
739 processVBounds.rayDir = rayDiff.normalized();
740 processVBounds.processTriangles = processTriangles;
750void btHeightfieldTerrainShape::buildAccelerator(
int chunkSize)
778 if (nChunksX == 0 || nChunksZ == 0)
787 for (
int cz = 0; cz < nChunksZ; ++cz)
789 int z0 = cz * chunkSize;
791 for (
int cx = 0; cx < nChunksX; ++cx)
793 int x0 = cx * chunkSize;
816 for (
int z = z0;
z < z0 + chunkSize + 1; ++
z)
823 for (
int x = x0;
x < x0 + chunkSize + 1; ++
x)
836 else if (height > r.max)
848void btHeightfieldTerrainShape::clearAccelerator()
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
virtual void getVertex(int i, btVector3 &vtx) const
@ TERRAIN_SHAPE_PROXYTYPE
btTriangleInfoMap * m_triangleInfoMap
virtual btScalar getMargin() const =0
static int getQuantized(btScalar x)
void gridRaycast(Action_T &quadAction, const btVector3 &beginPos, const btVector3 &endPos, int indices[3])
const void * m_heightfieldDataUnknown
btAlignedObjectArray< Range > m_vboundsGrid
PHY_ScalarType m_heightDataType
int m_heightStickWidth
terrain data
virtual btScalar getRawHeightFieldValue(int x, int y) const
bool m_useDiamondSubdivision
btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength, const void *heightfieldData, btScalar heightScale, btScalar minHeight, btScalar maxHeight, int upAxis, PHY_ScalarType heightDataType, bool flipQuadEdges)
preferred constructor
const unsigned char * m_heightfieldDataUnsignedChar
const short * m_heightfieldDataShort
bool m_useZigzagSubdivision
bool m_flipTriangleWinding
const btScalar * m_heightfieldDataFloat
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE void quantizeWithClamp(unsigned short *out, const btVector3 &point2, int isMax) const
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
virtual void processTriangle(btVector3 *triangle, int partId, int triangleIndex)=0
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float3 ceil(const float3 a)
void operator()(const GridRaycastState &bs) const
void exec(int x, int z) const
btTriangleCallback * callback
bool useDiamondSubdivision
const btHeightfieldTerrainShape * shape
void operator()(const GridRaycastState &rs) const
ProcessVBoundsAction(const btAlignedObjectArray< btHeightfieldTerrainShape::Range > &bnd, int *indices)
ProcessTrianglesAction processTriangles
const btAlignedObjectArray< btHeightfieldTerrainShape::Range > & vbounds