00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_IMESH_TERRAIN2_H__
00021 #define __CS_IMESH_TERRAIN2_H__
00022
00027 #include "csutil/scf_interface.h"
00028 #include "iutil/array.h"
00029 #include "ivideo/shader/shader.h"
00030 #include "imesh/object.h"
00031
00032 class csVector3;
00033 struct csCollisionPair;
00034 struct iCollider;
00035 struct iTerrainCell;
00036 struct iRenderView;
00037 struct iTerrainSystem;
00038 struct iMovable;
00039
00049 struct csLockedHeightData
00050 {
00052 float* data;
00053
00055 size_t pitch;
00056 };
00057
00067 struct csLockedMaterialMap
00068 {
00070 unsigned char* data;
00071
00073 size_t pitch;
00074 };
00075
00084 struct csLockedNormalData
00085 {
00087 csVector3* data;
00088
00090 size_t pitch;
00091 };
00092
00094 struct iTerrainVector3Array : public iArrayChangeAll<csVector3>
00095 {
00096 SCF_IARRAYCHANGEALL_INTERFACE(iTerrainVector3Array);
00097 };
00098
00100 struct iTerrainCollisionPairArray : public iArrayChangeAll<csCollisionPair>
00101 {
00102 SCF_IARRAYCHANGEALL_INTERFACE(iTerrainCollisionPairArray);
00103 };
00104
00106 typedef csRefArray<iMaterialWrapper> csTerrainMaterialPalette;
00107
00108
00114 struct iTerrainCellCollisionProperties : public virtual iBase
00115 {
00116 SCF_INTERFACE (iTerrainCellCollisionProperties, 2, 0, 1);
00117
00124 virtual bool GetCollidable () const = 0;
00125
00131 virtual void SetCollidable (bool value) = 0;
00132
00139 virtual void SetParameter(const char* param, const char* value) = 0;
00140
00144 virtual csPtr<iTerrainCellCollisionProperties> Clone () = 0;
00145
00147 virtual size_t GetParameterCount() = 0;
00148
00150 virtual const char* GetParameterName (size_t index) = 0;
00151
00153
00154 virtual const char* GetParameterValue (size_t index) = 0;
00155 virtual const char* GetParameterValue (const char* name) = 0;
00157 };
00158
00165 struct iTerrainCellRenderProperties : public virtual iShaderVariableContext
00166 {
00167 SCF_INTERFACE (iTerrainCellRenderProperties, 2, 0, 1);
00168
00174 virtual bool GetVisible () const = 0;
00175
00181 virtual void SetVisible (bool value) = 0;
00182
00189 virtual void SetParameter (const char* param, const char* value) = 0;
00190
00194 virtual csPtr<iTerrainCellRenderProperties> Clone () = 0;
00195
00197 virtual size_t GetParameterCount() = 0;
00198
00200 virtual const char* GetParameterName (size_t index) = 0;
00201
00203
00204 virtual const char* GetParameterValue (size_t index) = 0;
00205 virtual const char* GetParameterValue (const char* name) = 0;
00207 };
00208
00212 struct iTerrainCellFeederProperties : public virtual iBase
00213 {
00214 SCF_INTERFACE (iTerrainCellFeederProperties, 3, 2, 0);
00215
00219 virtual void SetHeightmapSource (const char* source, const char* format) = 0;
00220
00224 virtual void SetNormalMapSource (const char* source) = 0;
00225
00229 virtual void SetMaterialMapSource (const char* source) = 0;
00230
00234 virtual void SetHeightOffset (float offset) = 0;
00235
00239 virtual void AddAlphaMap (const char* material, const char* alphaMapSource) = 0;
00240
00247 virtual void SetParameter (const char* param, const char* value) = 0;
00248
00252 virtual csPtr<iTerrainCellFeederProperties> Clone () = 0;
00253
00255 virtual size_t GetParameterCount() = 0;
00256
00258 virtual const char* GetParameterName (size_t index) = 0;
00259
00261
00262 virtual const char* GetParameterValue (size_t index) = 0;
00263 virtual const char* GetParameterValue (const char* name) = 0;
00265
00266
00268 virtual size_t GetAlphaMapCount() = 0;
00269
00271 virtual const char* GetAlphaMapMaterial (size_t index) = 0;
00272
00274
00275 virtual const char* GetAlphaMapSource (size_t index) = 0;
00276 virtual const char* GetAlphaMapSource (const char* material) = 0;
00278
00280 virtual void SetHeightmapSmooth (bool doSmooth) = 0;
00281 virtual bool GetHeightmapSmooth () const = 0;
00283 };
00284
00288 struct iTerrainDataFeeder : public virtual iBase
00289 {
00290 SCF_INTERFACE (iTerrainDataFeeder, 2, 0, 0);
00291
00299 virtual csPtr<iTerrainCellFeederProperties> CreateProperties () = 0;
00300
00310 virtual bool PreLoad (iTerrainCell* cell) = 0;
00311
00320 virtual bool Load (iTerrainCell* cell) = 0;
00321
00328 virtual void SetParameter (const char* param, const char* value) = 0;
00329 };
00330
00336 struct csTerrainColliderCollideSegmentResult
00337 {
00339 bool hit;
00340
00342 csVector3 isect;
00343
00345
00346 csVector3 a, b, c;
00348
00349 csTerrainColliderCollideSegmentResult()
00350 : hit (false), isect (0), a (0), b (0), c (0) {}
00351 };
00352
00354 struct iTerrainCollider : public virtual iBase
00355 {
00356 SCF_INTERFACE (iTerrainCollider, 3, 0, 0);
00357
00365 virtual csPtr<iTerrainCellCollisionProperties> CreateProperties () = 0;
00366
00380 virtual bool CollideSegment (iTerrainCell* cell, const csVector3& start,
00381 const csVector3& end, bool oneHit,
00382 iTerrainVector3Array* points) = 0;
00383
00395 virtual bool CollideSegment (iTerrainCell* cell, const csVector3& start,
00396 const csVector3& end,
00397 csVector3& hitPoint) = 0;
00398
00409 virtual csTerrainColliderCollideSegmentResult CollideSegment (
00410 iTerrainCell* cell, const csVector3& start, const csVector3& end) = 0;
00411
00429 virtual bool CollideTriangles (iTerrainCell* cell, const csVector3* vertices,
00430 size_t tri_count,
00431 const unsigned int* indices, float radius,
00432 const csReversibleTransform& trans,
00433 bool oneHit, iTerrainCollisionPairArray* pairs) = 0;
00434
00450 virtual bool Collide (iTerrainCell* cell, iCollider* collider,
00451 float radius, const csReversibleTransform& trans,
00452 bool oneHit, iTerrainCollisionPairArray* pairs) = 0;
00453 };
00454
00455
00457 struct iTerrainRenderer : public virtual iBase
00458 {
00459 SCF_INTERFACE (iTerrainRenderer, 3, 0, 0);
00460
00468 virtual csPtr<iTerrainCellRenderProperties> CreateProperties () = 0;
00469
00474 virtual void ConnectTerrain (iTerrainSystem* system) = 0;
00475
00479 virtual void DisconnectTerrain (iTerrainSystem* system) = 0;
00480
00481
00495 virtual CS::Graphics::RenderMesh** GetRenderMeshes (int& n, iRenderView* rview,
00496 iMovable* movable, uint32 frustum_mask,
00497 const csArray<iTerrainCell*>& cells) = 0;
00498
00499
00506 virtual void OnMaterialPaletteUpdate (const csTerrainMaterialPalette&
00507 material_palette) = 0;
00508
00521 virtual void OnMaterialMaskUpdate (iTerrainCell* cell,
00522 const csRect& rectangle, const unsigned char* materialMap, size_t pitch) = 0;
00523
00537 virtual void OnMaterialMaskUpdate (iTerrainCell* cell, size_t materialIdx,
00538 const csRect& rectangle, const unsigned char* materialMap, size_t pitch) = 0;
00539
00548 virtual void OnAlphaMapUpdate (iTerrainCell* cell,
00549 iMaterialWrapper* material, iImage* alphaMap) = 0;
00550 };
00551
00553 struct iTerrainCellHeightDataCallback : public virtual iBase
00554 {
00555 SCF_INTERFACE (iTerrainCellHeightDataCallback, 1, 0, 0);
00556
00563 virtual void OnHeightUpdate (iTerrainCell* cell, const csRect& rectangle) = 0;
00564 };
00565
00567 struct iTerrainCellLoadCallback : public virtual iBase
00568 {
00569 SCF_INTERFACE (iTerrainCellLoadCallback, 1, 0, 0);
00570
00576 virtual void OnCellLoad (iTerrainCell* cell) = 0;
00577
00583 virtual void OnCellPreLoad (iTerrainCell* cell) = 0;
00584
00590 virtual void OnCellUnload (iTerrainCell* cell) = 0;
00591 };
00592
00593 struct iTerrainFactoryCell;
00594
00601 struct iTerrainSystem : public virtual iBase
00602 {
00603 SCF_INTERFACE (iTerrainSystem, 3, 0, 0);
00604
00613 virtual iTerrainCell* GetCell (const char* name, bool loadData = false) = 0;
00614
00626 virtual iTerrainCell* GetCell (const csVector2& pos, bool loadData = false) = 0;
00627
00634 virtual iTerrainCell* GetCell (size_t index, bool loadData = false) = 0;
00635
00639 virtual size_t GetCellCount () const = 0;
00640
00646 virtual const csTerrainMaterialPalette& GetMaterialPalette () const = 0;
00647
00653 virtual void SetMaterialPalette (const csTerrainMaterialPalette& array) = 0;
00654
00672 virtual bool CollideSegment (const csVector3& start, const csVector3& end,
00673 bool oneHit, iTerrainVector3Array* points,
00674 iMaterialArray* materials) = 0;
00675
00693 virtual bool CollideSegment (const csVector3& start, const csVector3& end,
00694 csVector3& hitPoint,
00695 iMaterialWrapper** hitMaterial) = 0;
00696
00713 virtual csTerrainColliderCollideSegmentResult CollideSegment (
00714 const csVector3& start, const csVector3& end,
00715 bool use_ray = false) = 0;
00716
00739 virtual bool CollideTriangles (const csVector3* vertices,
00740 size_t tri_count,
00741 const unsigned int* indices, float radius,
00742 const csReversibleTransform& trans,
00743 bool oneHit, iTerrainCollisionPairArray* pairs) = 0;
00744
00765 virtual bool Collide (iCollider* collider, float radius,
00766 const csReversibleTransform& trans, bool oneHit,
00767 iTerrainCollisionPairArray* pairs) = 0;
00768
00775 virtual float GetVirtualViewDistance () const = 0;
00776
00783 virtual void SetVirtualViewDistance (float distance) = 0;
00784
00792 virtual bool GetAutoPreLoad () const = 0;
00793
00799 virtual void SetAutoPreLoad (bool mode) = 0;
00800
00813 virtual void PreLoadCells (iRenderView* rview, iMovable* movable) = 0;
00814
00826 virtual float GetHeight (const csVector2& pos) = 0;
00827
00838 virtual csVector3 GetTangent (const csVector2& pos) = 0;
00839
00850 virtual csVector3 GetBinormal (const csVector2& pos) = 0;
00851
00862 virtual csVector3 GetNormal (const csVector2& pos) = 0;
00863
00869 virtual size_t GetMaxLoadedCells () const = 0;
00870
00878 virtual void SetMaxLoadedCells (size_t value) = 0;
00879
00883 virtual void UnloadOldCells () = 0;
00884
00888 virtual void AddCellLoadListener (iTerrainCellLoadCallback* cb) = 0;
00889
00893 virtual void RemoveCellLoadListener (iTerrainCellLoadCallback* cb) = 0;
00894
00898 virtual void AddCellHeightUpdateListener (iTerrainCellHeightDataCallback* cb) = 0;
00899
00903 virtual void RemoveCellHeightUpdateListener (iTerrainCellHeightDataCallback* cb) = 0;
00904
00912 virtual iTerrainCell* AddCell (iTerrainFactoryCell*) = 0;
00913
00917 virtual void RemoveCell (iTerrainCell*) = 0;
00918 };
00919
00928 struct iTerrainCell : public virtual iBase
00929 {
00930 SCF_INTERFACE (iTerrainCell, 6, 0, 0);
00931
00933 enum LoadState
00934 {
00935 NotLoaded,
00937 PreLoaded,
00939 Loaded
00940 };
00941
00947 virtual LoadState GetLoadState () const = 0;
00948
00964 virtual void SetLoadState (LoadState state) = 0;
00965
00971 virtual iTerrainSystem* GetTerrain () = 0;
00972
00980 virtual const char* GetName () const = 0;
00981
00988 virtual iTerrainCellRenderProperties* GetRenderProperties () const = 0;
00989
00996 virtual iTerrainCellCollisionProperties* GetCollisionProperties () const = 0;
00997
01004 virtual iTerrainCellFeederProperties* GetFeederProperties () const = 0;
01005
01012 virtual int GetGridWidth () const = 0;
01013
01020 virtual int GetGridHeight () const = 0;
01021
01028 virtual csLockedHeightData GetHeightData () = 0;
01029
01043 virtual csLockedHeightData LockHeightData (const csRect& rectangle) = 0;
01044
01050 virtual void UnlockHeightData () = 0;
01051
01058 virtual csLockedNormalData GetNormalData () = 0;
01059
01072 virtual csLockedNormalData LockNormalData (const csRect& rectangle) = 0;
01073
01079 virtual void UnlockNormalData () = 0;
01080
01084 virtual void RecalculateNormalData () = 0;
01085
01092 virtual const csVector2& GetPosition () const = 0;
01093
01102 virtual const csVector3& GetSize () const = 0;
01103
01110 virtual int GetMaterialMapWidth () const = 0;
01111
01118 virtual int GetMaterialMapHeight () const = 0;
01119
01125 virtual bool GetMaterialPersistent() const = 0;
01126
01145 virtual csLockedMaterialMap LockMaterialMap (const csRect& rectangle) = 0;
01146
01155 virtual void UnlockMaterialMap() = 0;
01156
01166 virtual void SetMaterialMask (unsigned int material, iImage* image) = 0;
01167
01179 virtual void SetMaterialMask (unsigned int material, const unsigned char*
01180 data, unsigned int width, unsigned int height) = 0;
01181
01188 virtual void SetAlphaMask (iMaterialWrapper* material, iImage* alphaMap) = 0;
01189
01195 virtual void SetBaseMaterial (iMaterialWrapper* material) = 0;
01196
01200 virtual iMaterialWrapper* GetBaseMaterial () const = 0;
01201
01207 virtual void SetAlphaSplatMaterial (iMaterialWrapper* material) = 0;
01208
01214 virtual iMaterialWrapper* GetAlphaSplatMaterial () const = 0;
01215
01228 virtual bool CollideSegment (const csVector3& start, const csVector3& end,
01229 bool oneHit, iTerrainVector3Array* points) = 0;
01230
01242 virtual bool CollideSegment (const csVector3& start, const csVector3& end,
01243 csVector3& hitPoint) = 0;
01244
01261 virtual bool CollideTriangles (const csVector3* vertices,
01262 size_t tri_count,
01263 const unsigned int* indices, float radius,
01264 const csReversibleTransform& trans,
01265 bool oneHit, iTerrainCollisionPairArray* pairs) = 0;
01266
01281 virtual bool Collide (iCollider* collider, float radius,
01282 const csReversibleTransform& trans, bool oneHit,
01283 iTerrainCollisionPairArray* pairs) = 0;
01284
01294 virtual float GetHeight (int x, int y) const = 0;
01295
01304 virtual float GetHeight (const csVector2& pos) const = 0;
01305
01314 virtual csVector3 GetTangent (int x, int y) const = 0;
01315
01323 virtual csVector3 GetTangent (const csVector2& pos) const = 0;
01324
01333 virtual csVector3 GetBinormal (int x, int y) const = 0;
01334
01342 virtual csVector3 GetBinormal (const csVector2& pos) const = 0;
01343
01352 virtual csVector3 GetNormal (int x, int y) const = 0;
01353
01361 virtual csVector3 GetNormal (const csVector2& pos) const = 0;
01362
01364 virtual csRefCount* GetRenderData () const = 0;
01365
01367 virtual void SetRenderData (csRefCount* data) = 0;
01368
01370 virtual csRefCount* GetCollisionData () const = 0;
01371
01373 virtual void SetCollisionData (csRefCount* data) = 0;
01374
01376 virtual csRefCount* GetFeederData () const = 0;
01377
01379 virtual void SetFeederData (csRefCount* data) = 0;
01380
01388 virtual void SetName (const char* name) = 0;
01389
01396 virtual void SetSplatBaseMaterial (iMaterialWrapper* material) = 0;
01397
01399 virtual iMaterialWrapper* GetSplatBaseMaterial () const = 0;
01400
01405 virtual csLockedNormalData GetTangentData () = 0;
01406
01411 virtual csLockedNormalData GetBitangentData () = 0;
01412 };
01413
01415 struct iTerrainFactoryCell : public virtual iBase
01416 {
01417 SCF_INTERFACE (iTerrainFactoryCell, 2, 0, 1);
01418
01425 virtual iTerrainCellRenderProperties* GetRenderProperties () const = 0;
01426
01433 virtual iTerrainCellCollisionProperties* GetCollisionProperties () const = 0;
01434
01441 virtual iTerrainCellFeederProperties* GetFeederProperties () const = 0;
01442
01448 virtual void SetBaseMaterial (iMaterialWrapper* material) = 0;
01449
01455 virtual void SetAlphaSplatMaterial (iMaterialWrapper* material) = 0;
01456
01458 virtual const char* GetName() = 0;
01459
01461 virtual void SetName (const char* name) = 0;
01462
01469 virtual int GetGridWidth () const = 0;
01470
01477 virtual int GetGridHeight () const = 0;
01478
01485 virtual const csVector2& GetPosition () const = 0;
01486
01495 virtual const csVector3& GetSize () const = 0;
01496
01503 virtual int GetMaterialMapWidth () const = 0;
01504
01511 virtual int GetMaterialMapHeight () const = 0;
01512
01516 virtual iMaterialWrapper* GetBaseMaterial () const = 0;
01517
01523 virtual iMaterialWrapper* GetAlphaSplatMaterial () const = 0;
01524
01530 virtual bool GetMaterialPersistent() const = 0;
01531
01536 virtual void SetGridWidth (int w) = 0;
01537
01542 virtual void SetGridHeight (int h) = 0;
01543
01548 virtual void SetPosition (const csVector2& pos) = 0;
01549
01556 virtual void SetSize (const csVector3& size) = 0;
01557
01562 virtual void SetMaterialMapWidth (int w) = 0;
01563
01568 virtual void SetMaterialMapHeight (int h) = 0;
01569
01574 virtual void SetMaterialPersistent (bool flag) = 0;
01575
01582 virtual void SetSplatBaseMaterial (iMaterialWrapper* material) = 0;
01583
01585 virtual iMaterialWrapper* GetSplatBaseMaterial () const = 0;
01586 };
01587
01589 struct iTerrainFactory : public virtual iBase
01590 {
01591 SCF_INTERFACE (iTerrainFactory, 2, 0, 3);
01592
01598 virtual void SetRenderer (iTerrainRenderer* renderer) = 0;
01599
01605 virtual void SetCollider (iTerrainCollider* collider) = 0;
01606
01612 virtual void SetFeeder (iTerrainDataFeeder* feeder) = 0;
01613
01634 virtual iTerrainFactoryCell* AddCell (const char* name,
01635 int gridWidth, int gridHeight, int materialMapWidth,
01636 int materialMapHeight, bool materiaMapPersistent,
01637 const csVector2& position, const csVector3& size) = 0;
01638
01644 virtual void SetMaxLoadedCells (size_t number) = 0;
01645
01652 virtual void SetVirtualViewDistance (float distance) = 0;
01653
01659 virtual void SetAutoPreLoad (bool mode) = 0;
01660
01661
01665 virtual iTerrainRenderer* GetRenderer () = 0;
01666
01670 virtual iTerrainCollider* GetCollider () = 0;
01671
01675 virtual iTerrainDataFeeder* GetFeeder () = 0;
01676
01681 virtual size_t GetMaxLoadedCells () = 0;
01682
01684 virtual size_t GetCellCount () = 0;
01685
01687 virtual iTerrainFactoryCell* GetCell (size_t index) = 0;
01688
01690 virtual iTerrainFactoryCell* GetDefaultCell () = 0;
01691
01699 virtual iTerrainFactoryCell* AddCell () = 0;
01700
01702 virtual iTerrainFactoryCell* GetCell (const char* name) = 0;
01703
01705 virtual void RemoveCell (iTerrainFactoryCell*) = 0;
01706 };
01707
01708
01709 #endif