imesh/terrain2.h
00001 /* 00002 Copyright (C) 2006 by Kapoulkine Arseny 00003 2007 by Marten Svanfeldt 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_IMESH_TERRAIN2_H__ 00021 #define __CS_IMESH_TERRAIN2_H__ 00022 00023 #include "csutil/scf_interface.h" 00024 #include "iutil/array.h" 00025 #include "ivideo/shader/shader.h" 00026 00027 class csVector3; 00028 struct csCollisionPair; 00029 struct iCollider; 00030 struct iTerrainCell; 00031 struct iRenderView; 00032 struct iTerrainSystem; 00033 struct iMovable; 00034 00044 struct csLockedHeightData 00045 { 00047 float* data; 00048 00050 size_t pitch; 00051 }; 00052 00062 struct csLockedMaterialMap 00063 { 00065 unsigned char* data; 00066 00068 size_t pitch; 00069 }; 00070 00072 struct iTerrainVector3Array : public iArrayChangeAll<csVector3> 00073 { 00074 SCF_IARRAYCHANGEALL_INTERFACE(iTerrainVector3Array); 00075 }; 00076 00078 struct iTerrainCollisionPairArray : public iArrayChangeAll<csCollisionPair> 00079 { 00080 SCF_IARRAYCHANGEALL_INTERFACE(iTerrainCollisionPairArray); 00081 }; 00082 00084 typedef csRefArray<iMaterialWrapper> csTerrainMaterialPalette; 00085 00086 00092 struct iTerrainCellCollisionProperties : public virtual iBase 00093 { 00094 SCF_INTERFACE (iTerrainCellCollisionProperties, 2, 0, 1); 00095 00102 virtual bool GetCollidable () const = 0; 00103 00109 virtual void SetCollidable (bool value) = 0; 00110 00117 virtual void SetParameter(const char* param, const char* value) = 0; 00118 00122 virtual csPtr<iTerrainCellCollisionProperties> Clone () = 0; 00123 00125 virtual size_t GetParameterCount() = 0; 00126 00128 virtual const char* GetParameterName (size_t index) = 0; 00129 00131 00132 virtual const char* GetParameterValue (size_t index) = 0; 00133 virtual const char* GetParameterValue (const char* name) = 0; 00135 }; 00136 00143 struct iTerrainCellRenderProperties : public virtual iShaderVariableContext 00144 { 00145 SCF_INTERFACE (iTerrainCellRenderProperties, 2, 0, 1); 00146 00152 virtual bool GetVisible () const = 0; 00153 00159 virtual void SetVisible (bool value) = 0; 00160 00167 virtual void SetParameter (const char* param, const char* value) = 0; 00168 00172 virtual csPtr<iTerrainCellRenderProperties> Clone () = 0; 00173 00175 virtual size_t GetParameterCount() = 0; 00176 00178 virtual const char* GetParameterName (size_t index) = 0; 00179 00181 00182 virtual const char* GetParameterValue (size_t index) = 0; 00183 virtual const char* GetParameterValue (const char* name) = 0; 00185 }; 00186 00190 struct iTerrainCellFeederProperties : public virtual iBase 00191 { 00192 SCF_INTERFACE (iTerrainCellFeederProperties, 3, 1, 0); 00193 00197 virtual void SetHeightmapSource (const char* source, const char* format) = 0; 00198 00202 virtual void SetMaterialMapSource (const char* source) = 0; 00203 00207 virtual void SetHeightOffset (float offset) = 0; 00208 00212 virtual void AddAlphaMap (const char* material, const char* alphaMapSource) = 0; 00213 00220 virtual void SetParameter (const char* param, const char* value) = 0; 00221 00225 virtual csPtr<iTerrainCellFeederProperties> Clone () = 0; 00226 00228 virtual size_t GetParameterCount() = 0; 00229 00231 virtual const char* GetParameterName (size_t index) = 0; 00232 00234 00235 virtual const char* GetParameterValue (size_t index) = 0; 00236 virtual const char* GetParameterValue (const char* name) = 0; 00238 00239 00241 virtual size_t GetAlphaMapCount() = 0; 00242 00244 virtual const char* GetAlphaMapMaterial (size_t index) = 0; 00245 00247 00248 virtual const char* GetAlphaMapSource (size_t index) = 0; 00249 virtual const char* GetAlphaMapSource (const char* material) = 0; 00251 00253 virtual void SetHeightmapSmooth (bool doSmooth) = 0; 00254 virtual bool GetHeightmapSmooth () const = 0; 00256 }; 00257 00261 struct iTerrainDataFeeder : public virtual iBase 00262 { 00263 SCF_INTERFACE (iTerrainDataFeeder, 2, 0, 0); 00264 00272 virtual csPtr<iTerrainCellFeederProperties> CreateProperties () = 0; 00273 00283 virtual bool PreLoad (iTerrainCell* cell) = 0; 00284 00293 virtual bool Load (iTerrainCell* cell) = 0; 00294 00301 virtual void SetParameter (const char* param, const char* value) = 0; 00302 }; 00303 00307 struct csTerrainColliderCollideSegmentResult 00308 { 00310 bool hit; 00311 00313 csVector3 isect; 00314 00316 00317 csVector3 a, b, c; 00319 }; 00320 00322 struct iTerrainCollider : public virtual iBase 00323 { 00324 SCF_INTERFACE (iTerrainCollider, 2, 0, 1); 00325 00333 virtual csPtr<iTerrainCellCollisionProperties> CreateProperties () = 0; 00334 00348 virtual bool CollideSegment (iTerrainCell* cell, const csVector3& start, 00349 const csVector3& end, bool oneHit, 00350 iTerrainVector3Array* points) = 0; 00351 00362 virtual csTerrainColliderCollideSegmentResult CollideSegment ( 00363 iTerrainCell* cell, const csVector3& start, const csVector3& end) = 0; 00364 00382 virtual bool CollideTriangles (iTerrainCell* cell, const csVector3* vertices, 00383 size_t tri_count, 00384 const unsigned int* indices, float radius, 00385 const csReversibleTransform& trans, 00386 bool oneHit, iTerrainCollisionPairArray* pairs) = 0; 00387 00403 virtual bool Collide (iTerrainCell* cell, iCollider* collider, 00404 float radius, const csReversibleTransform& trans, 00405 bool oneHit, iTerrainCollisionPairArray* pairs) = 0; 00406 }; 00407 00408 00410 struct iTerrainRenderer : public virtual iBase 00411 { 00412 SCF_INTERFACE (iTerrainRenderer, 2, 0, 0); 00413 00421 virtual csPtr<iTerrainCellRenderProperties> CreateProperties () = 0; 00422 00427 virtual void ConnectTerrain (iTerrainSystem* system) = 0; 00428 00432 virtual void DisconnectTerrain (iTerrainSystem* system) = 0; 00433 00434 00448 virtual CS::Graphics::RenderMesh** GetRenderMeshes (int& n, iRenderView* rview, 00449 iMovable* movable, uint32 frustum_mask, 00450 const csArray<iTerrainCell*> cells) = 0; 00451 00452 00459 virtual void OnMaterialPaletteUpdate (const csTerrainMaterialPalette& 00460 material_palette) = 0; 00461 00474 virtual void OnMaterialMaskUpdate (iTerrainCell* cell, 00475 const csRect& rectangle, const unsigned char* materialMap, size_t pitch) = 0; 00476 00490 virtual void OnMaterialMaskUpdate (iTerrainCell* cell, size_t materialIdx, 00491 const csRect& rectangle, const unsigned char* materialMap, size_t pitch) = 0; 00492 00501 virtual void OnAlphaMapUpdate (iTerrainCell* cell, 00502 iMaterialWrapper* material, iImage* alphaMap) = 0; 00503 }; 00504 00506 struct iTerrainCellHeightDataCallback : public virtual iBase 00507 { 00508 SCF_INTERFACE (iTerrainCellHeightDataCallback, 1, 0, 0); 00509 00516 virtual void OnHeightUpdate (iTerrainCell* cell, const csRect& rectangle) = 0; 00517 }; 00518 00520 struct iTerrainCellLoadCallback : public virtual iBase 00521 { 00522 SCF_INTERFACE (iTerrainCellLoadCallback, 1, 0, 0); 00523 00529 virtual void OnCellLoad (iTerrainCell* cell) = 0; 00530 00536 virtual void OnCellPreLoad (iTerrainCell* cell) = 0; 00537 00543 virtual void OnCellUnload (iTerrainCell* cell) = 0; 00544 }; 00545 00552 struct iTerrainSystem : public virtual iBase 00553 { 00554 SCF_INTERFACE (iTerrainSystem, 2, 0, 0); 00555 00564 virtual iTerrainCell* GetCell (const char* name, bool loadData = false) = 0; 00565 00577 virtual iTerrainCell* GetCell (const csVector2& pos, bool loadData = false) = 0; 00578 00585 virtual iTerrainCell* GetCell (size_t index, bool loadData = false) = 0; 00586 00590 virtual size_t GetCellCount () const = 0; 00591 00597 virtual const csTerrainMaterialPalette& GetMaterialPalette () const = 0; 00598 00604 virtual void SetMaterialPalette (const csTerrainMaterialPalette& array) = 0; 00605 00624 virtual bool CollideSegment (const csVector3& start, const csVector3& end, 00625 bool oneHit, iTerrainVector3Array* points) = 0; 00626 00643 virtual csTerrainColliderCollideSegmentResult CollideSegment ( 00644 const csVector3& start, const csVector3& end, 00645 bool use_ray = false) = 0; 00646 00669 virtual bool CollideTriangles (const csVector3* vertices, 00670 size_t tri_count, 00671 const unsigned int* indices, float radius, 00672 const csReversibleTransform& trans, 00673 bool oneHit, iTerrainCollisionPairArray* pairs) = 0; 00674 00695 virtual bool Collide (iCollider* collider, float radius, 00696 const csReversibleTransform& trans, bool oneHit, 00697 iTerrainCollisionPairArray* pairs) = 0; 00698 00705 virtual float GetVirtualViewDistance () const = 0; 00706 00713 virtual void SetVirtualViewDistance (float distance) = 0; 00714 00722 virtual bool GetAutoPreLoad () const = 0; 00723 00729 virtual void SetAutoPreLoad (bool mode) = 0; 00730 00743 virtual void PreLoadCells (iRenderView* rview, iMovable* movable) = 0; 00744 00756 virtual float GetHeight (const csVector2& pos) = 0; 00757 00768 virtual csVector3 GetTangent (const csVector2& pos) = 0; 00769 00780 virtual csVector3 GetBinormal (const csVector2& pos) = 0; 00781 00792 virtual csVector3 GetNormal (const csVector2& pos) = 0; 00793 00799 virtual size_t GetMaxLoadedCells () const = 0; 00800 00808 virtual void SetMaxLoadedCells (size_t value) = 0; 00809 00813 virtual void UnloadOldCells () = 0; 00814 00818 virtual void AddCellLoadListener (iTerrainCellLoadCallback* cb) = 0; 00819 00823 virtual void RemoveCellLoadListener (iTerrainCellLoadCallback* cb) = 0; 00824 00828 virtual void AddCellHeightUpdateListener (iTerrainCellHeightDataCallback* cb) = 0; 00829 00833 virtual void RemoveCellHeightUpdateListener (iTerrainCellHeightDataCallback* cb) = 0; 00834 }; 00835 00844 struct iTerrainCell : public virtual iBase 00845 { 00846 SCF_INTERFACE (iTerrainCell, 3, 0, 1); 00847 00849 enum LoadState 00850 { 00851 NotLoaded, 00853 PreLoaded, 00855 Loaded 00856 }; 00857 00863 virtual LoadState GetLoadState () const = 0; 00864 00880 virtual void SetLoadState (LoadState state) = 0; 00881 00887 virtual iTerrainSystem* GetTerrain () = 0; 00888 00896 virtual const char* GetName () const = 0; 00897 00904 virtual iTerrainCellRenderProperties* GetRenderProperties () const = 0; 00905 00912 virtual iTerrainCellCollisionProperties* GetCollisionProperties () const = 0; 00913 00920 virtual iTerrainCellFeederProperties* GetFeederProperties () const = 0; 00921 00928 virtual int GetGridWidth () const = 0; 00929 00936 virtual int GetGridHeight () const = 0; 00937 00944 virtual csLockedHeightData GetHeightData () = 0; 00945 00959 virtual csLockedHeightData LockHeightData (const csRect& rectangle) = 0; 00960 00966 virtual void UnlockHeightData () = 0; 00967 00974 virtual const csVector2& GetPosition () const = 0; 00975 00984 virtual const csVector3& GetSize () const = 0; 00985 00992 virtual int GetMaterialMapWidth () const = 0; 00993 01000 virtual int GetMaterialMapHeight () const = 0; 01001 01007 virtual bool GetMaterialPersistent() const = 0; 01008 01027 virtual csLockedMaterialMap LockMaterialMap (const csRect& rectangle) = 0; 01028 01037 virtual void UnlockMaterialMap() = 0; 01038 01048 virtual void SetMaterialMask (unsigned int material, iImage* image) = 0; 01049 01061 virtual void SetMaterialMask (unsigned int material, const unsigned char* 01062 data, unsigned int width, unsigned int height) = 0; 01063 01070 virtual void SetAlphaMask (iMaterialWrapper* material, iImage* alphaMap) = 0; 01071 01077 virtual void SetBaseMaterial (iMaterialWrapper* material) = 0; 01078 01082 virtual iMaterialWrapper* GetBaseMaterial () const = 0; 01083 01096 virtual bool CollideSegment (const csVector3& start, const csVector3& end, 01097 bool oneHit, iTerrainVector3Array* points) = 0; 01098 01115 virtual bool CollideTriangles (const csVector3* vertices, 01116 size_t tri_count, 01117 const unsigned int* indices, float radius, 01118 const csReversibleTransform& trans, 01119 bool oneHit, iTerrainCollisionPairArray* pairs) = 0; 01120 01135 virtual bool Collide (iCollider* collider, float radius, 01136 const csReversibleTransform& trans, bool oneHit, 01137 iTerrainCollisionPairArray* pairs) = 0; 01138 01148 virtual float GetHeight (int x, int y) const = 0; 01149 01158 virtual float GetHeight (const csVector2& pos) const = 0; 01159 01168 virtual csVector3 GetTangent (int x, int y) const = 0; 01169 01177 virtual csVector3 GetTangent (const csVector2& pos) const = 0; 01178 01187 virtual csVector3 GetBinormal (int x, int y) const = 0; 01188 01196 virtual csVector3 GetBinormal (const csVector2& pos) const = 0; 01197 01206 virtual csVector3 GetNormal (int x, int y) const = 0; 01207 01215 virtual csVector3 GetNormal (const csVector2& pos) const = 0; 01216 01218 virtual csRefCount* GetRenderData () const = 0; 01219 01221 virtual void SetRenderData (csRefCount* data) = 0; 01222 01224 virtual csRefCount* GetCollisionData () const = 0; 01225 01227 virtual void SetCollisionData (csRefCount* data) = 0; 01228 01230 virtual csRefCount* GetFeederData () const = 0; 01231 01233 virtual void SetFeederData (csRefCount* data) = 0; 01234 01242 virtual void SetName (const char* name) = 0; 01243 }; 01244 01246 struct iTerrainFactoryCell : public virtual iBase 01247 { 01248 SCF_INTERFACE (iTerrainFactoryCell, 1, 0 ,1); 01249 01256 virtual iTerrainCellRenderProperties* GetRenderProperties () const = 0; 01257 01264 virtual iTerrainCellCollisionProperties* GetCollisionProperties () const = 0; 01265 01272 virtual iTerrainCellFeederProperties* GetFeederProperties () const = 0; 01273 01279 virtual void SetBaseMaterial (iMaterialWrapper* material) = 0; 01280 01282 virtual const char* GetName() = 0; 01283 01285 virtual void SetName (const char* name) = 0; 01286 01293 virtual int GetGridWidth () const = 0; 01294 01301 virtual int GetGridHeight () const = 0; 01302 01309 virtual const csVector2& GetPosition () const = 0; 01310 01319 virtual const csVector3& GetSize () const = 0; 01320 01327 virtual int GetMaterialMapWidth () const = 0; 01328 01335 virtual int GetMaterialMapHeight () const = 0; 01336 01340 virtual iMaterialWrapper* GetBaseMaterial () const = 0; 01341 01347 virtual bool GetMaterialPersistent() const = 0; 01348 01353 virtual void SetGridWidth (int w) = 0; 01354 01359 virtual void SetGridHeight (int h) = 0; 01360 01365 virtual void SetPosition (const csVector2& pos) = 0; 01366 01373 virtual void SetSize (const csVector3& size) = 0; 01374 01379 virtual void SetMaterialMapWidth (int w) = 0; 01380 01385 virtual void SetMaterialMapHeight (int h) = 0; 01386 01391 virtual void SetMaterialPersistent (bool flag) = 0; 01392 }; 01393 01395 struct iTerrainFactory : public virtual iBase 01396 { 01397 SCF_INTERFACE (iTerrainFactory, 2, 0, 2); 01398 01404 virtual void SetRenderer (iTerrainRenderer* renderer) = 0; 01405 01411 virtual void SetCollider (iTerrainCollider* collider) = 0; 01412 01418 virtual void SetFeeder (iTerrainDataFeeder* feeder) = 0; 01419 01440 virtual iTerrainFactoryCell* AddCell (const char* name, 01441 int gridWidth, int gridHeight, int materialMapWidth, 01442 int materialMapHeight, bool materiaMapPersistent, 01443 const csVector2& position, const csVector3& size) = 0; 01444 01450 virtual void SetMaxLoadedCells (size_t number) = 0; 01451 01458 virtual void SetVirtualViewDistance (float distance) = 0; 01459 01465 virtual void SetAutoPreLoad (bool mode) = 0; 01466 01467 01471 virtual iTerrainRenderer* GetRenderer () = 0; 01472 01476 virtual iTerrainCollider* GetCollider () = 0; 01477 01481 virtual iTerrainDataFeeder* GetFeeder () = 0; 01482 01487 virtual size_t GetMaxLoadedCells () = 0; 01488 01490 virtual size_t GetCellCount () = 0; 01491 01493 virtual iTerrainFactoryCell* GetCell (size_t index) = 0; 01494 01496 virtual iTerrainFactoryCell* GetDefaultCell () = 0; 01497 01505 virtual iTerrainFactoryCell* AddCell () = 0; 01506 01508 virtual iTerrainFactoryCell* GetCell (const char* name) = 0; 01509 }; 01510 01511 01512 #endif
Generated for Crystal Space 1.4.0 by doxygen 1.5.8