summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pmheightfieldroam.h
diff options
context:
space:
mode:
Diffstat (limited to 'kpovmodeler/pmheightfieldroam.h')
-rw-r--r--kpovmodeler/pmheightfieldroam.h283
1 files changed, 283 insertions, 0 deletions
diff --git a/kpovmodeler/pmheightfieldroam.h b/kpovmodeler/pmheightfieldroam.h
new file mode 100644
index 00000000..e2802c6b
--- /dev/null
+++ b/kpovmodeler/pmheightfieldroam.h
@@ -0,0 +1,283 @@
+//-*-C++-*-
+/*
+**************************************************************************
+ description
+ --------------------
+ copyright : (C) 2003 by Leon Pennington
+ email : leon@leonscape.co.uk
+**************************************************************************
+
+**************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+**************************************************************************/
+#ifndef PMHEIGHTFIELDROAM_H
+#define PMHEIGHTFIELDROAM_H
+
+class QString;
+
+/**
+ * ROAM display class for @ref PMHeightField
+*/
+class PMHeightFieldROAM
+{
+ int m_size;
+ int m_numPoints;
+ int m_usedPoints;
+ int m_numLines;
+ int m_numNodes;
+ bool m_fail;
+ int m_maxLevel;
+ int m_displayDetail;
+ int m_waterLevel;
+ bool m_mapMod;
+ bool m_levelMod;
+
+ /**
+ * Point Structure holds most of the info
+ */
+ struct pointStructure
+ {
+ unsigned short hgt;
+ pointStructure* lines[ 8 ];
+ int pos;
+ bool used;
+ };
+ /**
+ * The points array
+ */
+ pointStructure* m_pPoints;
+
+ /**
+ * The Triangle Node structure used in the ROAM algorithm
+ */
+ struct triNodeStructure
+ {
+ triNodeStructure* lchd;
+ triNodeStructure* rchd;
+ triNodeStructure* base;
+ triNodeStructure* lnbr;
+ triNodeStructure* rnbr;
+ int vari;
+ bool split;
+ };
+ /**
+ * Tree Root node
+ */
+ triNodeStructure* m_pTree;
+ /**
+ * Next available node
+ */
+ triNodeStructure* m_pNextNode;
+
+ /**
+ * Loads and formats the image to the correct size, creates the points
+ * array. Then fills the points array with the heights and zero's the
+ * rest of the info
+ * @param filename The name of the file to load
+ * @return true if succesful false it it fails
+ */
+ bool imageToData( const QString &fileName );
+
+ /**
+ * Sets the Maximum Level of the tree.
+ */
+ void calcLevel( );
+
+ /**
+ * Generates the Variance for each node.
+ * @param current The current node
+ * @param x1-y1 The position of the first corner
+ * @param x2-y2 The position of the second corner
+ * @param x3-y3 The position of the third corner
+ * @param level The current level within a tree
+ */
+ void varNode( triNodeStructure* current,
+ int x1, int y1,
+ int x2, int y2,
+ int x3, int y3,
+ int level );
+
+ /**
+ * Generates the Split for the Tree.
+ * @param current The current node
+ * @param level The current level within a tree
+ */
+ void sptNode( triNodeStructure* current, int level );
+
+ /**
+ * Request the splitting of a node, checks too see if it can be
+ * Split or if its base neighbour requires splitting.
+ * @param current node to split
+ */
+ void split( triNodeStructure* current );
+
+ /**
+ * Counts up the lines and points in a model, and sets the points
+ * structure ready for returning
+ * @param current The current node
+ * @param x1-y1 The position of the first corner
+ * @param x2-y2 The position of the second corner
+ * @param x3-y3 The position of the third corner
+ */
+ void pntNode( triNodeStructure* current,
+ int x1, int y1,
+ int x2, int y2,
+ int x3, int y3 );
+
+ /**
+ * Adds a line makes sure that this line does not already exist
+ * @param pts1 The start point in the line
+ * @param pts2 The end point of the line
+ */
+ void addLine( pointStructure* pts1, pointStructure* pts2 );
+
+ /**
+ * creates the points array and clears it
+ * @return true if succesful
+ */
+ bool createPoints( );
+ /**
+ * Clears some of the points data for recalculation or all
+ * of it for initialization
+ * @param all true if all the data is to be cleared
+ */
+ void clearPoints( bool all = false );
+
+ /**
+ * creates the nodes array and clears it
+ * @return true if succesful
+ */
+ bool createNodes( );
+ /**
+ * Clears nodes for reuse in splitting recalculation or
+ * all of the data for initialization and variance
+ * @param all true if all the data is to be cleared
+ */
+ void clearNodes( bool all = false );
+
+ /**
+ * Sets the height of a point
+ * @param x the position of the point in X
+ * @param y the position of the point in Y
+ * @param hgt the new height
+ */
+ void setHeight( int x, int y, unsigned short hgt ) const
+ { m_pPoints[ x + ( y * m_size ) ].hgt = hgt; }
+
+public:
+ /**
+ * Constructor for class
+ * @param fileName Source file for the map
+ */
+ PMHeightFieldROAM( const QString &fileName );
+ /**
+ * Class Destructor relases all the memory
+ */
+ ~PMHeightFieldROAM( );
+
+ /**
+ * Returns true if there has been a problem
+ */
+ bool isFailed( ) { return m_fail; }
+
+ /**
+ * Creates the model based on the current map
+ * display detail and water level
+ */
+ void updateModel( );
+
+ /**
+ * Sets the display detail for the model
+ * @param detail The new level of detail
+ */
+ void setDisplayDetail( int detail );
+ /**
+ * Returns the current display detail
+ */
+ int displayDetail( ) const { return m_displayDetail; }
+
+ /**
+ * Sets the water level
+ * @param waterLevel the water level
+ */
+ void setWaterLevel( double m_waterLevel );
+ /**
+ * Returns the current water level
+ */
+ double waterLevel( ) const;
+
+ /**
+ * Return The size of the map in either direction
+ */
+ int size( ) const { return m_size; }
+ /**
+ * Return The total number of points in the model
+ */
+ int numPoints( ) const { return m_numPoints; }
+ /**
+ * Return The number of used points
+ */
+ int usedPoints( ) const { return m_usedPoints; }
+ /**
+ * Return The number of lines
+ */
+ int numLines( ) const { return m_numLines; }
+ /**
+ * Return the number of nodes
+ */
+ int numNodes( ) const { return m_numNodes; }
+
+ /**
+ * Returns a height of a point
+ * @param x the position of the point in X
+ * @param y the position of the point in Y
+ * @param waterLevel whether to return a point offset by water level
+ * @return the height of the point
+ */
+ unsigned short height( int x, int y, bool waterLevel = false ) const;
+
+ /**
+ * Determines if the point is used
+ * @param x The position of the point on the x axis.
+ * @param y The position of the point on the y axis.
+ * @return true if the point is used else false
+ */
+ bool usedPoint( int x, int y ) const
+ { return m_pPoints[ x + ( y * m_size ) ].used; }
+
+ /**
+ * Gets the used postion of a point
+ * @param x The position of the point on the x axis.
+ * @param y The position of the point on the y axis.
+ * @return the used position
+ */
+ int posPoint( int x, int y ) const
+ { return m_pPoints[ x + ( y * m_size ) ].pos; }
+
+ /**
+ * Returns the used position of a point at the end point of a line.
+ * @param x The position of the start point on the x axis.
+ * @param y The position of the start point on the y axis.
+ * @param line The Line Index
+ * @return The used positon of the end point
+ */
+ int endPoint( int x, int y, int line ) const
+ { return m_pPoints[ x + ( y * m_size ) ].lines[ line ]->pos; }
+
+ /**
+ * Returns whether this line exists
+ * @param x The position of the start point on the x axis.
+ * @param y The position of the start point on the y axis.
+ * @param line The Line Index
+ * @return Whether the line exists
+ */
+ bool lineExist( int x, int y, int line ) const;
+
+};
+
+#endif