// Copyright (C) 2002-2007 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h #include "CTerrainTriangleSelector.h" #include "CTerrainSceneNode.h" #include "os.h" namespace irr { namespace scene { //! constructor CTerrainTriangleSelector::CTerrainTriangleSelector ( ITerrainSceneNode* node, s32 LOD ) : SceneNode ( node ) { #ifdef _DEBUG setDebugName ("CTerrainTriangleSelector"); #endif setTriangleData ( node, LOD ); } //! destructor CTerrainTriangleSelector::~CTerrainTriangleSelector() { TrianglePatches.TrianglePatchArray.clear ( ); } //! Clears and sets triangle data void CTerrainTriangleSelector::setTriangleData(ITerrainSceneNode* node, s32 LOD) { core::triangle3df tri; core::array indices; CTerrainSceneNode* terrainNode = (CTerrainSceneNode*)node; // Get pointer to the GeoMipMaps vertices video::S3DVertex2TCoords* vertices = (video::S3DVertex2TCoords*)terrainNode->RenderBuffer.getVertices(); // Clear current data TrianglePatches.TotalTriangles = 0; TrianglePatches.NumPatches = terrainNode->TerrainData.PatchCount * terrainNode->TerrainData.PatchCount; TrianglePatches.TrianglePatchArray.reallocate(TrianglePatches.NumPatches); for (int o=0; oTerrainData.PatchCount; ++x ) { for(s32 z = 0; z < terrainNode->TerrainData.PatchCount; ++z ) { s32 tIndex = x * terrainNode->TerrainData.PatchCount + z; TrianglePatches.TrianglePatchArray[tIndex].NumTriangles = 0; TrianglePatches.TrianglePatchArray[tIndex].Box = terrainNode->getBoundingBox( x, z ); u32 indexCount = terrainNode->getIndicesForPatch( indices, x, z, LOD ); TrianglePatches.TrianglePatchArray[tIndex].Triangles.reallocate(indexCount/3); for(u32 i = 0; i < indexCount; i += 3 ) { tri.pointA = vertices[indices[i+0]].Pos; tri.pointB = vertices[indices[i+1]].Pos; tri.pointC = vertices[indices[i+2]].Pos; TrianglePatches.TrianglePatchArray[tIndex].Triangles.push_back(tri); ++TrianglePatches.TrianglePatchArray[tIndex].NumTriangles; } TrianglePatches.TotalTriangles += TrianglePatches.TrianglePatchArray[tIndex].NumTriangles; } } } //! Gets all triangles. void CTerrainTriangleSelector::getTriangles ( core::triangle3df* triangles, s32 arraySize, s32& outTriangleCount, const core::matrix4* transform ) { s32 count = TrianglePatches.TotalTriangles; if (count > arraySize) count = arraySize; core::matrix4 mat; if (transform) mat = (*transform); s32 tIndex = 0; for (s32 i=0; i& box, const core::matrix4* transform) { s32 count = TrianglePatches.TotalTriangles; if (count > arraySize) count = arraySize; core::matrix4 mat; if (transform) mat = (*transform); s32 tIndex = 0; for (s32 i=0; i& line, const core::matrix4* transform) { s32 count = TrianglePatches.TotalTriangles; if (count > arraySize) count = arraySize; core::matrix4 mat; if (transform) mat = (*transform); s32 tIndex = 0; for (s32 i=0; i