From 7028cbe09c688437910a25623098762bf0fa592d Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Mon, 28 Mar 2016 22:28:34 +1000 Subject: Move Irrlicht to src/others. --- .../source/Irrlicht/CTerrainTriangleSelector.cpp | 234 +++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 src/others/irrlicht-1.8.1/source/Irrlicht/CTerrainTriangleSelector.cpp (limited to 'src/others/irrlicht-1.8.1/source/Irrlicht/CTerrainTriangleSelector.cpp') diff --git a/src/others/irrlicht-1.8.1/source/Irrlicht/CTerrainTriangleSelector.cpp b/src/others/irrlicht-1.8.1/source/Irrlicht/CTerrainTriangleSelector.cpp new file mode 100644 index 0000000..91820ce --- /dev/null +++ b/src/others/irrlicht-1.8.1/source/Irrlicht/CTerrainTriangleSelector.cpp @@ -0,0 +1,234 @@ +// Copyright (C) 2002-2012 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) +{ + // Get pointer to the GeoMipMaps vertices + const video::S3DVertex2TCoords* vertices = static_cast(node->getRenderBuffer()->getVertices()); + + // Clear current data + const s32 count = (static_cast(node))->TerrainData.PatchCount; + TrianglePatches.TotalTriangles = 0; + TrianglePatches.NumPatches = count*count; + + TrianglePatches.TrianglePatchArray.reallocate(TrianglePatches.NumPatches); + for (s32 o=0; o indices; + s32 tIndex = 0; + for(s32 x = 0; x < count; ++x ) + { + for(s32 z = 0; z < count; ++z ) + { + TrianglePatches.TrianglePatchArray[tIndex].NumTriangles = 0; + TrianglePatches.TrianglePatchArray[tIndex].Box = node->getBoundingBox( x, z ); + u32 indexCount = node->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; + ++tIndex; + } + } +} + + +//! Gets all triangles. +void CTerrainTriangleSelector::getTriangles(core::triangle3df* triangles, + s32 arraySize, s32& outTriangleCount, + const core::matrix4* transform) const +{ + 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) const +{ + 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) const +{ + const s32 count = core::min_((s32)TrianglePatches.TotalTriangles, arraySize); + + core::matrix4 mat; + + if (transform) + mat = (*transform); + + s32 tIndex = 0; + + for (s32 i=0; i