| 211 | } |
| 212 | |
| 213 | bool Gu::HeightField::load(PxInputStream& stream) |
| 214 | { |
| 215 | // release old memory |
| 216 | releaseMemory(); |
| 217 | |
| 218 | // Import header |
| 219 | PxU32 version; |
| 220 | bool endian; |
| 221 | if(!readHeader('H', 'F', 'H', 'F', version, endian, stream)) |
| 222 | return false; |
| 223 | |
| 224 | // load mData |
| 225 | mData.rows = readDword(endian, stream); |
| 226 | mData.columns = readDword(endian, stream); |
| 227 | mData.rowLimit = readFloat(endian, stream); |
| 228 | mData.colLimit = readFloat(endian, stream); |
| 229 | mData.nbColumns = readFloat(endian, stream); |
| 230 | const float thickness = readFloat(endian, stream); |
| 231 | PX_UNUSED(thickness); |
| 232 | mData.convexEdgeThreshold = readFloat(endian, stream); |
| 233 | |
| 234 | PxU16 flags = readWord(endian, stream); |
| 235 | mData.flags = PxHeightFieldFlags(flags); |
| 236 | |
| 237 | PxU32 format = readDword(endian, stream); |
| 238 | mData.format = PxHeightFieldFormat::Enum(format); |
| 239 | |
| 240 | PxBounds3 minMaxBounds; |
| 241 | minMaxBounds.minimum.x = readFloat(endian, stream); |
| 242 | minMaxBounds.minimum.y = readFloat(endian, stream); |
| 243 | minMaxBounds.minimum.z = readFloat(endian, stream); |
| 244 | minMaxBounds.maximum.x = readFloat(endian, stream); |
| 245 | minMaxBounds.maximum.y = readFloat(endian, stream); |
| 246 | minMaxBounds.maximum.z = readFloat(endian, stream); |
| 247 | mData.mAABB = CenterExtents(minMaxBounds); |
| 248 | |
| 249 | mSampleStride = readDword(endian, stream); |
| 250 | mNbSamples = readDword(endian, stream); |
| 251 | mMinHeight = readFloat(endian, stream); |
| 252 | mMaxHeight = readFloat(endian, stream); |
| 253 | |
| 254 | // allocate height samples |
| 255 | mData.samples = NULL; |
| 256 | const PxU32 nbVerts = mData.rows * mData.columns; |
| 257 | if (nbVerts > 0) |
| 258 | { |
| 259 | mData.samples = reinterpret_cast<PxHeightFieldSample*>(PX_ALLOC(nbVerts*sizeof(PxHeightFieldSample), "PxHeightFieldSample")); |
| 260 | if (mData.samples == NULL) |
| 261 | { |
| 262 | Ps::getFoundation().error(PxErrorCode::eOUT_OF_MEMORY, __FILE__, __LINE__, "Gu::HeightField::load: PX_ALLOC failed!"); |
| 263 | return false; |
| 264 | } |
| 265 | stream.read(mData.samples, mNbSamples*sizeof(PxHeightFieldSample)); |
| 266 | if (endian) |
| 267 | for(PxU32 i = 0; i < mNbSamples; i++) |
| 268 | { |
| 269 | PxHeightFieldSample& s = mData.samples[i]; |
| 270 | PX_ASSERT(sizeof(PxU16) == sizeof(s.height)); |
nothing calls this directly
no test coverage detected