You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kpovmodeler/pmheightfieldroam.h

284 lines
7.9 KiB

//-*-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 TQString;
/**
* 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 TQString &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 TQString &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