diff options
Diffstat (limited to '')
-rw-r--r-- | libraries/irrlicht-1.8/include/ITerrainSceneNode.h | 364 |
1 files changed, 182 insertions, 182 deletions
diff --git a/libraries/irrlicht-1.8/include/ITerrainSceneNode.h b/libraries/irrlicht-1.8/include/ITerrainSceneNode.h index 0706709..4802710 100644 --- a/libraries/irrlicht-1.8/include/ITerrainSceneNode.h +++ b/libraries/irrlicht-1.8/include/ITerrainSceneNode.h | |||
@@ -1,182 +1,182 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt | 1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt |
2 | // This file is part of the "Irrlicht Engine". | 2 | // This file is part of the "Irrlicht Engine". |
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h |
4 | 4 | ||
5 | // The code for the TerrainSceneNode is based on the terrain renderer by | 5 | // The code for the TerrainSceneNode is based on the terrain renderer by |
6 | // Soconne and the GeoMipMapSceneNode developed by Spintz. They made their | 6 | // Soconne and the GeoMipMapSceneNode developed by Spintz. They made their |
7 | // code available for Irrlicht and allowed it to be distributed under this | 7 | // code available for Irrlicht and allowed it to be distributed under this |
8 | // licence. I only modified some parts. A lot of thanks go to them. | 8 | // licence. I only modified some parts. A lot of thanks go to them. |
9 | 9 | ||
10 | #ifndef __I_TERRAIN_SCENE_NODE_H__ | 10 | #ifndef __I_TERRAIN_SCENE_NODE_H__ |
11 | #define __I_TERRAIN_SCENE_NODE_H__ | 11 | #define __I_TERRAIN_SCENE_NODE_H__ |
12 | 12 | ||
13 | #include "ETerrainElements.h" | 13 | #include "ETerrainElements.h" |
14 | #include "ISceneNode.h" | 14 | #include "ISceneNode.h" |
15 | #include "IDynamicMeshBuffer.h" | 15 | #include "IDynamicMeshBuffer.h" |
16 | #include "irrArray.h" | 16 | #include "irrArray.h" |
17 | 17 | ||
18 | namespace irr | 18 | namespace irr |
19 | { | 19 | { |
20 | namespace io | 20 | namespace io |
21 | { | 21 | { |
22 | class IReadFile; | 22 | class IReadFile; |
23 | } // end namespace io | 23 | } // end namespace io |
24 | namespace scene | 24 | namespace scene |
25 | { | 25 | { |
26 | class IMesh; | 26 | class IMesh; |
27 | 27 | ||
28 | //! A scene node for displaying terrain using the geo mip map algorithm. | 28 | //! A scene node for displaying terrain using the geo mip map algorithm. |
29 | /** The code for the TerrainSceneNode is based on the Terrain renderer by Soconne and | 29 | /** The code for the TerrainSceneNode is based on the Terrain renderer by Soconne and |
30 | * the GeoMipMapSceneNode developed by Spintz. They made their code available for Irrlicht | 30 | * the GeoMipMapSceneNode developed by Spintz. They made their code available for Irrlicht |
31 | * and allowed it to be distributed under this licence. I only modified some parts. | 31 | * and allowed it to be distributed under this licence. I only modified some parts. |
32 | * A lot of thanks go to them. | 32 | * A lot of thanks go to them. |
33 | * | 33 | * |
34 | * This scene node is capable of very quickly loading | 34 | * This scene node is capable of very quickly loading |
35 | * terrains and updating the indices at runtime to enable viewing very large terrains. It uses a | 35 | * terrains and updating the indices at runtime to enable viewing very large terrains. It uses a |
36 | * CLOD (Continuous Level of Detail) algorithm which updates the indices for each patch based on | 36 | * CLOD (Continuous Level of Detail) algorithm which updates the indices for each patch based on |
37 | * a LOD (Level of Detail) which is determined based on a patch's distance from the camera. | 37 | * a LOD (Level of Detail) which is determined based on a patch's distance from the camera. |
38 | * | 38 | * |
39 | * The Patch Size of the terrain must always be a size of ( 2^N+1, i.e. 8+1(9), 16+1(17), etc. ). | 39 | * The Patch Size of the terrain must always be a size of ( 2^N+1, i.e. 8+1(9), 16+1(17), etc. ). |
40 | * The MaxLOD available is directly dependent on the patch size of the terrain. LOD 0 contains all | 40 | * The MaxLOD available is directly dependent on the patch size of the terrain. LOD 0 contains all |
41 | * of the indices to draw all the triangles at the max detail for a patch. As each LOD goes up by 1 | 41 | * of the indices to draw all the triangles at the max detail for a patch. As each LOD goes up by 1 |
42 | * the step taken, in generating indices increases by - 2^LOD, so for LOD 1, the step taken is 2, for | 42 | * the step taken, in generating indices increases by - 2^LOD, so for LOD 1, the step taken is 2, for |
43 | * LOD 2, the step taken is 4, LOD 3 - 8, etc. The step can be no larger than the size of the patch, | 43 | * LOD 2, the step taken is 4, LOD 3 - 8, etc. The step can be no larger than the size of the patch, |
44 | * so having a LOD of 8, with a patch size of 17, is asking the algoritm to generate indices every | 44 | * so having a LOD of 8, with a patch size of 17, is asking the algoritm to generate indices every |
45 | * 2^8 ( 256 ) vertices, which is not possible with a patch size of 17. The maximum LOD for a patch | 45 | * 2^8 ( 256 ) vertices, which is not possible with a patch size of 17. The maximum LOD for a patch |
46 | * size of 17 is 2^4 ( 16 ). So, with a MaxLOD of 5, you'll have LOD 0 ( full detail ), LOD 1 ( every | 46 | * size of 17 is 2^4 ( 16 ). So, with a MaxLOD of 5, you'll have LOD 0 ( full detail ), LOD 1 ( every |
47 | * 2 vertices ), LOD 2 ( every 4 vertices ), LOD 3 ( every 8 vertices ) and LOD 4 ( every 16 vertices ). | 47 | * 2 vertices ), LOD 2 ( every 4 vertices ), LOD 3 ( every 8 vertices ) and LOD 4 ( every 16 vertices ). |
48 | **/ | 48 | **/ |
49 | class ITerrainSceneNode : public ISceneNode | 49 | class ITerrainSceneNode : public ISceneNode |
50 | { | 50 | { |
51 | public: | 51 | public: |
52 | //! Constructor | 52 | //! Constructor |
53 | ITerrainSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, | 53 | ITerrainSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, |
54 | const core::vector3df& position = core::vector3df(0.0f, 0.0f, 0.0f), | 54 | const core::vector3df& position = core::vector3df(0.0f, 0.0f, 0.0f), |
55 | const core::vector3df& rotation = core::vector3df(0.0f, 0.0f, 0.0f), | 55 | const core::vector3df& rotation = core::vector3df(0.0f, 0.0f, 0.0f), |
56 | const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f) ) | 56 | const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f) ) |
57 | : ISceneNode (parent, mgr, id, position, rotation, scale) {} | 57 | : ISceneNode (parent, mgr, id, position, rotation, scale) {} |
58 | 58 | ||
59 | //! Get the bounding box of the terrain. | 59 | //! Get the bounding box of the terrain. |
60 | /** \return The bounding box of the entire terrain. */ | 60 | /** \return The bounding box of the entire terrain. */ |
61 | virtual const core::aabbox3d<f32>& getBoundingBox() const =0; | 61 | virtual const core::aabbox3d<f32>& getBoundingBox() const =0; |
62 | 62 | ||
63 | //! Get the bounding box of a patch | 63 | //! Get the bounding box of a patch |
64 | /** \return The bounding box of the chosen patch. */ | 64 | /** \return The bounding box of the chosen patch. */ |
65 | virtual const core::aabbox3d<f32>& getBoundingBox(s32 patchX, s32 patchZ) const =0; | 65 | virtual const core::aabbox3d<f32>& getBoundingBox(s32 patchX, s32 patchZ) const =0; |
66 | 66 | ||
67 | //! Get the number of indices currently in the meshbuffer | 67 | //! Get the number of indices currently in the meshbuffer |
68 | /** \return The index count. */ | 68 | /** \return The index count. */ |
69 | virtual u32 getIndexCount() const =0; | 69 | virtual u32 getIndexCount() const =0; |
70 | 70 | ||
71 | //! Get pointer to the mesh | 71 | //! Get pointer to the mesh |
72 | /** \return Pointer to the mesh. */ | 72 | /** \return Pointer to the mesh. */ |
73 | virtual IMesh* getMesh() =0; | 73 | virtual IMesh* getMesh() =0; |
74 | 74 | ||
75 | //! Get pointer to the buffer used by the terrain (most users will not need this) | 75 | //! Get pointer to the buffer used by the terrain (most users will not need this) |
76 | virtual IMeshBuffer* getRenderBuffer() =0; | 76 | virtual IMeshBuffer* getRenderBuffer() =0; |
77 | 77 | ||
78 | 78 | ||
79 | //! Gets the meshbuffer data based on a specified level of detail. | 79 | //! Gets the meshbuffer data based on a specified level of detail. |
80 | /** \param mb A reference to an IDynamicMeshBuffer object | 80 | /** \param mb A reference to an IDynamicMeshBuffer object |
81 | \param LOD The level of detail you want the indices from. */ | 81 | \param LOD The level of detail you want the indices from. */ |
82 | virtual void getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD=0) const =0; | 82 | virtual void getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD=0) const =0; |
83 | 83 | ||
84 | //! Gets the indices for a specified patch at a specified Level of Detail. | 84 | //! Gets the indices for a specified patch at a specified Level of Detail. |
85 | /** \param indices A reference to an array of u32 indices. | 85 | /** \param indices A reference to an array of u32 indices. |
86 | \param patchX Patch x coordinate. | 86 | \param patchX Patch x coordinate. |
87 | \param patchZ Patch z coordinate. | 87 | \param patchZ Patch z coordinate. |
88 | \param LOD The level of detail to get for that patch. If -1, | 88 | \param LOD The level of detail to get for that patch. If -1, |
89 | then get the CurrentLOD. If the CurrentLOD is set to -1, | 89 | then get the CurrentLOD. If the CurrentLOD is set to -1, |
90 | meaning it's not shown, then it will retrieve the triangles at | 90 | meaning it's not shown, then it will retrieve the triangles at |
91 | the highest LOD (0). | 91 | the highest LOD (0). |
92 | \return Number of indices put into the buffer. */ | 92 | \return Number of indices put into the buffer. */ |
93 | virtual s32 getIndicesForPatch(core::array<u32>& indices, | 93 | virtual s32 getIndicesForPatch(core::array<u32>& indices, |
94 | s32 patchX, s32 patchZ, s32 LOD=0) =0; | 94 | s32 patchX, s32 patchZ, s32 LOD=0) =0; |
95 | 95 | ||
96 | //! Populates an array with the CurrentLOD of each patch. | 96 | //! Populates an array with the CurrentLOD of each patch. |
97 | /** \param LODs A reference to a core::array<s32> to hold the | 97 | /** \param LODs A reference to a core::array<s32> to hold the |
98 | values | 98 | values |
99 | \return Number of elements in the array */ | 99 | \return Number of elements in the array */ |
100 | virtual s32 getCurrentLODOfPatches(core::array<s32>& LODs) const =0; | 100 | virtual s32 getCurrentLODOfPatches(core::array<s32>& LODs) const =0; |
101 | 101 | ||
102 | //! Manually sets the LOD of a patch | 102 | //! Manually sets the LOD of a patch |
103 | /** \param patchX Patch x coordinate. | 103 | /** \param patchX Patch x coordinate. |
104 | \param patchZ Patch z coordinate. | 104 | \param patchZ Patch z coordinate. |
105 | \param LOD The level of detail to set the patch to. */ | 105 | \param LOD The level of detail to set the patch to. */ |
106 | virtual void setLODOfPatch(s32 patchX, s32 patchZ, s32 LOD=0) =0; | 106 | virtual void setLODOfPatch(s32 patchX, s32 patchZ, s32 LOD=0) =0; |
107 | 107 | ||
108 | //! Get center of terrain. | 108 | //! Get center of terrain. |
109 | virtual const core::vector3df& getTerrainCenter() const =0; | 109 | virtual const core::vector3df& getTerrainCenter() const =0; |
110 | 110 | ||
111 | //! Get height of a point of the terrain. | 111 | //! Get height of a point of the terrain. |
112 | virtual f32 getHeight(f32 x, f32 y) const =0; | 112 | virtual f32 getHeight(f32 x, f32 y) const =0; |
113 | 113 | ||
114 | //! Sets the movement camera threshold. | 114 | //! Sets the movement camera threshold. |
115 | /** It is used to determine when to recalculate | 115 | /** It is used to determine when to recalculate |
116 | indices for the scene node. The default value is 10.0f. */ | 116 | indices for the scene node. The default value is 10.0f. */ |
117 | virtual void setCameraMovementDelta(f32 delta) =0; | 117 | virtual void setCameraMovementDelta(f32 delta) =0; |
118 | 118 | ||
119 | //! Sets the rotation camera threshold. | 119 | //! Sets the rotation camera threshold. |
120 | /** It is used to determine when to recalculate | 120 | /** It is used to determine when to recalculate |
121 | indices for the scene node. The default value is 1.0f. */ | 121 | indices for the scene node. The default value is 1.0f. */ |
122 | virtual void setCameraRotationDelta(f32 delta) =0; | 122 | virtual void setCameraRotationDelta(f32 delta) =0; |
123 | 123 | ||
124 | //! Sets whether or not the node should dynamically update its associated selector when the geomipmap data changes. | 124 | //! Sets whether or not the node should dynamically update its associated selector when the geomipmap data changes. |
125 | /** \param bVal: Boolean value representing whether or not to update selector dynamically. */ | 125 | /** \param bVal: Boolean value representing whether or not to update selector dynamically. */ |
126 | virtual void setDynamicSelectorUpdate(bool bVal) =0; | 126 | virtual void setDynamicSelectorUpdate(bool bVal) =0; |
127 | 127 | ||
128 | //! Override the default generation of distance thresholds. | 128 | //! Override the default generation of distance thresholds. |
129 | /** For determining the LOD a patch is rendered at. If any LOD | 129 | /** For determining the LOD a patch is rendered at. If any LOD |
130 | is overridden, then the scene node will no longer apply scaling | 130 | is overridden, then the scene node will no longer apply scaling |
131 | factors to these values. If you override these distances, and | 131 | factors to these values. If you override these distances, and |
132 | then apply a scale to the scene node, it is your responsibility | 132 | then apply a scale to the scene node, it is your responsibility |
133 | to update the new distances to work best with your new terrain | 133 | to update the new distances to work best with your new terrain |
134 | size. */ | 134 | size. */ |
135 | virtual bool overrideLODDistance(s32 LOD, f64 newDistance) =0; | 135 | virtual bool overrideLODDistance(s32 LOD, f64 newDistance) =0; |
136 | 136 | ||
137 | //! Scales the base texture, similar to makePlanarTextureMapping. | 137 | //! Scales the base texture, similar to makePlanarTextureMapping. |
138 | /** \param scale The scaling amount. Values above 1.0 | 138 | /** \param scale The scaling amount. Values above 1.0 |
139 | increase the number of time the texture is drawn on the | 139 | increase the number of time the texture is drawn on the |
140 | terrain. Values below 0 will decrease the number of times the | 140 | terrain. Values below 0 will decrease the number of times the |
141 | texture is drawn on the terrain. Using negative values will | 141 | texture is drawn on the terrain. Using negative values will |
142 | flip the texture, as well as still scaling it. | 142 | flip the texture, as well as still scaling it. |
143 | \param scale2 If set to 0 (default value), this will set the | 143 | \param scale2 If set to 0 (default value), this will set the |
144 | second texture coordinate set to the same values as in the | 144 | second texture coordinate set to the same values as in the |
145 | first set. If this is another value than zero, it will scale | 145 | first set. If this is another value than zero, it will scale |
146 | the second texture coordinate set by this value. */ | 146 | the second texture coordinate set by this value. */ |
147 | virtual void scaleTexture(f32 scale = 1.0f, f32 scale2=0.0f) =0; | 147 | virtual void scaleTexture(f32 scale = 1.0f, f32 scale2=0.0f) =0; |
148 | 148 | ||
149 | //! Initializes the terrain data. Loads the vertices from the heightMapFile. | 149 | //! Initializes the terrain data. Loads the vertices from the heightMapFile. |
150 | /** The file must contain a loadable image of the heightmap. The heightmap | 150 | /** The file must contain a loadable image of the heightmap. The heightmap |
151 | must be square. | 151 | must be square. |
152 | \param file The file to read the image from. File is not rewinded. | 152 | \param file The file to read the image from. File is not rewinded. |
153 | \param vertexColor Color of all vertices. | 153 | \param vertexColor Color of all vertices. |
154 | \param smoothFactor Number of smoothing passes. */ | 154 | \param smoothFactor Number of smoothing passes. */ |
155 | virtual bool loadHeightMap(io::IReadFile* file, | 155 | virtual bool loadHeightMap(io::IReadFile* file, |
156 | video::SColor vertexColor=video::SColor(255,255,255,255), | 156 | video::SColor vertexColor=video::SColor(255,255,255,255), |
157 | s32 smoothFactor=0) =0; | 157 | s32 smoothFactor=0) =0; |
158 | 158 | ||
159 | //! Initializes the terrain data. Loads the vertices from the heightMapFile. | 159 | //! Initializes the terrain data. Loads the vertices from the heightMapFile. |
160 | /** The data is interpreted as (signed) integers of the given bit size or | 160 | /** The data is interpreted as (signed) integers of the given bit size or |
161 | floats (with 32bits, signed). Allowed bitsizes for integers are | 161 | floats (with 32bits, signed). Allowed bitsizes for integers are |
162 | 8, 16, and 32. The heightmap must be square. | 162 | 8, 16, and 32. The heightmap must be square. |
163 | \param file The file to read the RAW data from. File is not rewinded. | 163 | \param file The file to read the RAW data from. File is not rewinded. |
164 | \param bitsPerPixel Size of data if integers used, for floats always use 32. | 164 | \param bitsPerPixel Size of data if integers used, for floats always use 32. |
165 | \param signedData Whether we use signed or unsigned ints, ignored for floats. | 165 | \param signedData Whether we use signed or unsigned ints, ignored for floats. |
166 | \param floatVals Whether the data is float or int. | 166 | \param floatVals Whether the data is float or int. |
167 | \param width Width (and also Height, as it must be square) of the heightmap. Use 0 for autocalculating from the filesize. | 167 | \param width Width (and also Height, as it must be square) of the heightmap. Use 0 for autocalculating from the filesize. |
168 | \param vertexColor Color of all vertices. | 168 | \param vertexColor Color of all vertices. |
169 | \param smoothFactor Number of smoothing passes. */ | 169 | \param smoothFactor Number of smoothing passes. */ |
170 | virtual bool loadHeightMapRAW(io::IReadFile* file, s32 bitsPerPixel=16, | 170 | virtual bool loadHeightMapRAW(io::IReadFile* file, s32 bitsPerPixel=16, |
171 | bool signedData=false, bool floatVals=false, s32 width=0, | 171 | bool signedData=false, bool floatVals=false, s32 width=0, |
172 | video::SColor vertexColor=video::SColor(255,255,255,255), | 172 | video::SColor vertexColor=video::SColor(255,255,255,255), |
173 | s32 smoothFactor=0) =0; | 173 | s32 smoothFactor=0) =0; |
174 | 174 | ||
175 | }; | 175 | }; |
176 | 176 | ||
177 | } // end namespace scene | 177 | } // end namespace scene |
178 | } // end namespace irr | 178 | } // end namespace irr |
179 | 179 | ||
180 | 180 | ||
181 | #endif // __I_TERRAIN_SCENE_NODE_H__ | 181 | #endif // __I_TERRAIN_SCENE_NODE_H__ |
182 | 182 | ||