00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "physxHeightFieldDesc.h"
00016
00017
00018
00019
00020
00021
00022 void PhysxHeightFieldDesc::
00023 set_convex_edge_threshold(float threshold) {
00024
00025 _desc.convexEdgeThreshold = threshold;
00026 }
00027
00028
00029
00030
00031
00032
00033 void PhysxHeightFieldDesc::
00034 set_thickness(float thickness) {
00035
00036 _desc.thickness = thickness;
00037 }
00038
00039
00040
00041
00042
00043
00044 void PhysxHeightFieldDesc::
00045 set_image(const PNMImage &image, unsigned short materialIndex) {
00046
00047 NxU32 _32K = 32767;
00048 NxU32 _64K = 65535;
00049
00050 NxU32 nbRows = image.get_x_size();
00051 NxU32 nbColumns = image.get_y_size();
00052
00053 set_size(nbRows, nbColumns);
00054
00055 NxU8 *currentByte = (NxU8 *)(_desc.samples);
00056
00057 for (NxU32 row=0; row < nbRows; row++) {
00058 for (NxU32 column=0; column < nbColumns; column++) {
00059
00060 NxHeightFieldSample* currentSample = (NxHeightFieldSample *)currentByte;
00061
00062 NxReal fvalue = image.get_bright(row, column);
00063 NxI16 ivalue = (NxI16)((fvalue - 0.5f) * _32K);
00064
00065 currentSample->height = (NxI16)ivalue;
00066 currentSample->tessFlag = (NxU8)0;
00067 currentSample->materialIndex0 = (NxU8)materialIndex;
00068 currentSample->materialIndex1 = (NxU8)materialIndex;
00069
00070 currentByte += _desc.sampleStride;
00071 }
00072 }
00073 }
00074
00075
00076
00077
00078
00079
00080 void PhysxHeightFieldDesc::
00081 set_material_index(unsigned int row, unsigned int column, unsigned short materialIndex0, unsigned short materialIndex1) {
00082
00083 nassertv(_desc.samples);
00084 nassertv(row < _desc.nbRows);
00085 nassertv(column < _desc.nbColumns);
00086
00087 NxU32 idx = row * _desc.nbColumns + column;
00088 NxU8 *byte = (NxU8 *)_desc.samples + _desc.sampleStride * idx;
00089 NxHeightFieldSample* sample = (NxHeightFieldSample *)byte;
00090
00091
00092
00093 sample->materialIndex0 = (NxU8)materialIndex0;
00094 sample->materialIndex1 = (NxU8)materialIndex1;
00095 }
00096
00097
00098
00099
00100
00101
00102 void PhysxHeightFieldDesc::
00103 set_height(unsigned int row, unsigned int column, short height) {
00104
00105 nassertv(_desc.samples);
00106 nassertv(row < _desc.nbRows);
00107 nassertv(column < _desc.nbColumns);
00108
00109 NxU32 idx = row * _desc.nbColumns + column;
00110 NxU8 *byte = (NxU8 *)_desc.samples + _desc.sampleStride * idx;
00111 NxHeightFieldSample* sample = (NxHeightFieldSample *)byte;
00112
00113 sample->height = (NxI16)height;
00114 }
00115
00116
00117
00118
00119
00120
00121 void PhysxHeightFieldDesc::
00122 set_tess_flag(unsigned int row, unsigned int column, unsigned short value) {
00123
00124 nassertv(_desc.samples);
00125 nassertv(row < _desc.nbRows);
00126 nassertv(column < _desc.nbColumns);
00127
00128 NxU32 idx = row * _desc.nbColumns + column;
00129 NxU8 *byte = (NxU8 *)_desc.samples + _desc.sampleStride * idx;
00130 NxHeightFieldSample* sample = (NxHeightFieldSample *)byte;
00131
00132 nassertv(value < 2);
00133 sample->tessFlag = (NxU8)value;
00134 }
00135