00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_MESHOBJ_H__
00020 #define __CS_MESHOBJ_H__
00021
00022 #include "csgeom/transfrm.h"
00023 #include "csutil/csobject.h"
00024 #include "csutil/nobjvec.h"
00025 #include "csutil/flags.h"
00026 #include "csutil/garray.h"
00027 #include "csengine/movable.h"
00028 #include "imesh/object.h"
00029 #include "iengine/mesh.h"
00030 #include "iengine/viscull.h"
00031 #include "ivideo/graph3d.h"
00032
00033 struct iMeshWrapper;
00034 struct iRenderView;
00035 struct iMovable;
00036 class csMeshWrapper;
00037 class csMeshFactoryWrapper;
00038 class csLight;
00039
00040 CS_DECLARE_OBJECT_VECTOR (csMeshListHelper, iMeshWrapper);
00041
00047 class csMeshList : public csMeshListHelper
00048 {
00049 public:
00050 SCF_DECLARE_IBASE;
00051
00053 csMeshList ();
00054
00055 class MeshList : public iMeshList
00056 {
00057 SCF_DECLARE_EMBEDDED_IBASE (csMeshList);
00058 virtual int GetCount () const;
00059 virtual iMeshWrapper *Get (int n) const;
00060 virtual int Add (iMeshWrapper *obj);
00061 virtual bool Remove (iMeshWrapper *obj);
00062 virtual bool Remove (int n);
00063 virtual void RemoveAll ();
00064 virtual int Find (iMeshWrapper *obj) const;
00065 virtual iMeshWrapper *FindByName (const char *Name) const;
00066 } scfiMeshList;
00067 };
00068
00072 class csMeshMeshList : public csMeshList
00073 {
00074 private:
00075 csMeshWrapper* mesh;
00076
00077 public:
00078 csMeshMeshList () : mesh (NULL) { }
00079 ~csMeshMeshList () { DeleteAll (); }
00080 void SetMesh (csMeshWrapper* m) { mesh = m; }
00081 virtual bool PrepareItem (csSome Item);
00082 virtual bool FreeItem (csSome Item);
00083 };
00084
00085 CS_DECLARE_OBJECT_VECTOR (csMeshFactoryListHelper, iMeshFactoryWrapper);
00086
00090 class csMeshFactoryList : public csMeshFactoryListHelper
00091 {
00092 public:
00093 SCF_DECLARE_IBASE;
00094
00096 csMeshFactoryList ();
00097
00098 class MeshFactoryList : public iMeshFactoryList
00099 {
00100 SCF_DECLARE_EMBEDDED_IBASE (csMeshFactoryList);
00101 virtual int GetCount () const;
00102 virtual iMeshFactoryWrapper *Get (int n) const;
00103 virtual int Add (iMeshFactoryWrapper *obj);
00104 virtual bool Remove (iMeshFactoryWrapper *obj);
00105 virtual bool Remove (int n);
00106 virtual void RemoveAll ();
00107 virtual int Find (iMeshFactoryWrapper *obj) const;
00108 virtual iMeshFactoryWrapper *FindByName (const char *Name) const;
00109 } scfiMeshFactoryList;
00110 };
00111
00115 class csMeshFactoryFactoryList : public csMeshFactoryList
00116 {
00117 private:
00118 csMeshFactoryWrapper* meshfact;
00119
00120 public:
00121 csMeshFactoryFactoryList () : meshfact (NULL) {}
00122 ~csMeshFactoryFactoryList () { DeleteAll (); }
00123 void SetMeshFactory (csMeshFactoryWrapper* m) { meshfact = m; }
00124 virtual bool PrepareItem (csSome Item);
00125 virtual bool FreeItem (csSome Item);
00126 };
00127
00128 SCF_VERSION (csMeshWrapper, 0, 0, 1);
00129
00133 class csMeshWrapper : public csObject
00134 {
00135 friend class csMovable;
00136 friend class csMovableSectorList;
00137
00138 protected:
00139
00141 iMeshWrapper *Parent;
00142
00148 csBox3 wor_bbox;
00150 long wor_bbox_movablenr;
00151
00153 int defered_num_lights;
00154
00156 int defered_lighting_flags;
00157
00164 csTicks last_anim_time;
00165
00172 bool is_visible;
00173
00177 csMovable movable;
00178
00185 long render_priority;
00186
00188 void UpdateDeferedLighting (const csVector3& pos);
00189
00190 private:
00192 iMeshObject* mesh;
00193
00195 csMeshMeshList children;
00196
00198 iMeshDrawCallback* draw_cb;
00199
00201 iMeshFactoryWrapper* factory;
00202
00204 csZBufMode zbufMode;
00205
00206 public:
00208 csFlags flags;
00209
00210 protected:
00212 void MoveToSector (csSector* s);
00213
00215 void RemoveFromSectors ();
00216
00224 void UpdateMove ();
00225
00231 void DrawInt (iRenderView* rview);
00232
00237 virtual ~csMeshWrapper ();
00238
00239 public:
00241 csMeshWrapper (iMeshWrapper* theParent, iMeshObject* mesh);
00243 csMeshWrapper (iMeshWrapper* theParent);
00244
00246 void SetParentContainer (iMeshWrapper* newParent) { Parent = newParent; }
00248 iMeshWrapper* GetParentContainer () const { return Parent; }
00249
00251 void SetFactory (iMeshFactoryWrapper* factory)
00252 {
00253 csMeshWrapper::factory = factory;
00254 }
00256 iMeshFactoryWrapper* GetFactory () const
00257 {
00258 return factory;
00259 }
00260
00262 void SetMeshObject (iMeshObject* mesh);
00264 iMeshObject* GetMeshObject () const {return mesh;}
00265
00267 void SetZBufMode (csZBufMode mode) { zbufMode = mode; }
00269 csZBufMode GetZBufMode () const { return zbufMode; }
00270
00279 void SetDrawCallback (iMeshDrawCallback* cb)
00280 {
00281 if (cb) cb->IncRef ();
00282 if (draw_cb) draw_cb->DecRef ();
00283 draw_cb = cb;
00284 }
00285
00287 iMeshDrawCallback* GetDrawCallback () const
00288 {
00289 return draw_cb;
00290 }
00291
00293 void MarkVisible () { is_visible = true; }
00294
00296 void MarkInvisible () { is_visible = false; }
00297
00299 bool IsVisible () const { return is_visible; }
00300
00305 void UpdateLighting (iLight** lights, int num_lights);
00306
00312 void DeferUpdateLighting (int flags, int num_lights);
00313
00319 void Draw (iRenderView* rview);
00320
00322 bool WantToDie () { return mesh->WantToDie (); }
00323
00331 csMovable& GetMovable () { return movable; }
00332
00345 void PlaceMesh ();
00346
00351 int HitBeamBBox (const csVector3& start, const csVector3& end,
00352 csVector3& isect, float* pr);
00357 bool HitBeamOutline (const csVector3& start, const csVector3& end,
00358 csVector3& isect, float* pr);
00363 bool HitBeamObject (const csVector3& start, const csVector3& end,
00364 csVector3& isect, float* pr);
00369 bool HitBeam (const csVector3& start, const csVector3& end,
00370 csVector3& isect, float* pr);
00371
00373 const csMeshMeshList& GetChildren () const { return children; }
00374
00376 void GetRadius (csVector3& rad, csVector3& cent) const;
00377
00387 void HardTransform (const csReversibleTransform& t);
00388
00394 void GetWorldBoundingBox (csBox3& cbox);
00395
00401 void GetTransformedBoundingBox (const csReversibleTransform& trans,
00402 csBox3& cbox);
00403
00409 float GetScreenBoundingBox (const iCamera *camera, csBox2& sbox,
00410 csBox3& cbox);
00411
00413 void SetRenderPriority (long rp);
00415 long GetRenderPriority () const
00416 {
00417 return render_priority;
00418 }
00419
00420 SCF_DECLARE_IBASE_EXT (csObject);
00421
00422
00423 struct MeshWrapper : public iMeshWrapper
00424 {
00425 SCF_DECLARE_EMBEDDED_IBASE (csMeshWrapper);
00426 virtual csMeshWrapper* GetPrivateObject ()
00427 {
00428 return (csMeshWrapper*)scfParent;
00429 }
00430 virtual iObject *QueryObject ()
00431 {
00432 return scfParent;
00433 }
00434 virtual iMeshObject* GetMeshObject () const
00435 {
00436 return scfParent->GetMeshObject ();
00437 }
00438 virtual void SetMeshObject (iMeshObject* m)
00439 {
00440 scfParent->SetMeshObject (m);
00441 }
00442 virtual iMeshFactoryWrapper* GetFactory () const
00443 {
00444 return scfParent->GetFactory ();
00445 }
00446 virtual void SetFactory (iMeshFactoryWrapper* m)
00447 {
00448 scfParent->SetFactory (m);
00449 }
00450 virtual void DeferUpdateLighting (int flags, int num_lights)
00451 {
00452 scfParent->DeferUpdateLighting (flags, num_lights);
00453 }
00454 virtual void UpdateLighting (iLight** lights, int num_lights)
00455 {
00456 scfParent->UpdateLighting (lights, num_lights);
00457 }
00458 virtual iMovable* GetMovable () const
00459 {
00460 return &(scfParent->movable.scfiMovable);
00461 }
00462 virtual void PlaceMesh ()
00463 {
00464 scfParent->PlaceMesh ();
00465 }
00466 virtual int HitBeamBBox (const csVector3& start, const csVector3& end,
00467 csVector3& isect, float* pr)
00468 {
00469 return scfParent->HitBeamBBox (start, end, isect, pr);
00470 }
00471 virtual bool HitBeamOutline (const csVector3& start, const csVector3& end,
00472 csVector3& isect, float* pr)
00473 {
00474 return scfParent->HitBeamOutline (start, end, isect, pr);
00475 }
00476 virtual bool HitBeamObject (const csVector3& start, const csVector3& end,
00477 csVector3& isect, float* pr)
00478 {
00479 return scfParent->HitBeamObject (start, end, isect, pr);
00480 }
00481 virtual bool HitBeam (const csVector3& start, const csVector3& end,
00482 csVector3& isect, float* pr)
00483 {
00484 return scfParent->HitBeam (start, end, isect, pr);
00485 }
00486 virtual void SetDrawCallback (iMeshDrawCallback* cb)
00487 {
00488 scfParent->SetDrawCallback (cb);
00489 }
00490 virtual iMeshDrawCallback* GetDrawCallback () const
00491 {
00492 return scfParent->GetDrawCallback ();
00493 }
00494 virtual void SetRenderPriority (long rp)
00495 {
00496 scfParent->SetRenderPriority (rp);
00497 }
00498 virtual long GetRenderPriority () const
00499 {
00500 return scfParent->GetRenderPriority ();
00501 }
00502 virtual csFlags& GetFlags ()
00503 {
00504 return scfParent->flags;
00505 }
00506 virtual void SetZBufMode (csZBufMode mode)
00507 {
00508 scfParent->SetZBufMode (mode);
00509 }
00510 virtual csZBufMode GetZBufMode () const
00511 {
00512 return scfParent->GetZBufMode ();
00513 }
00514 virtual void HardTransform (const csReversibleTransform& t)
00515 {
00516 scfParent->HardTransform (t);
00517 }
00518 virtual void GetWorldBoundingBox (csBox3& cbox)
00519 {
00520 scfParent->GetWorldBoundingBox (cbox);
00521 }
00522 virtual void GetTransformedBoundingBox (const csReversibleTransform& trans,
00523 csBox3& cbox)
00524 {
00525 scfParent->GetTransformedBoundingBox (trans, cbox);
00526 }
00527 virtual float GetScreenBoundingBox (iCamera* camera, csBox2& sbox,
00528 csBox3& cbox);
00529 virtual iMeshList* GetChildren ()
00530 {
00531 return &(scfParent->children.scfiMeshList);
00532 }
00533 virtual iMeshWrapper* GetParentContainer ()
00534 {
00535 return scfParent->GetParentContainer ();
00536 }
00537 virtual void SetParentContainer (iMeshWrapper* p)
00538 {
00539 scfParent->SetParentContainer (p);
00540 }
00541 virtual void GetRadius (csVector3& rad, csVector3 ¢) const
00542 {
00543 scfParent->GetRadius (rad,cent);
00544 }
00545 virtual void Draw (iRenderView* rview)
00546 {
00547 scfParent->Draw (rview);
00548 }
00549 virtual bool WantToDie ()
00550 {
00551 return scfParent->WantToDie ();
00552 }
00553 } scfiMeshWrapper;
00554 friend struct MeshWrapper;
00555
00556
00557 struct VisObject : public iVisibilityObject
00558 {
00559 SCF_DECLARE_EMBEDDED_IBASE (csMeshWrapper);
00560 virtual iMovable* GetMovable () const
00561 {
00562 return &(scfParent->movable.scfiMovable);
00563 }
00564 virtual long GetShapeNumber () const
00565 {
00566 return scfParent->mesh->GetShapeNumber ();
00567 }
00568 virtual void GetBoundingBox (csBox3& bbox)
00569 {
00570 scfParent->mesh->GetObjectBoundingBox (bbox, CS_BBOX_MAX);
00571 }
00572 virtual void MarkVisible () { scfParent->MarkVisible (); }
00573 virtual void MarkInvisible () { scfParent->MarkInvisible (); }
00574 virtual bool IsVisible () const { return scfParent->IsVisible (); }
00575 } scfiVisibilityObject;
00576 friend struct VisObject;
00577 };
00578
00579 SCF_VERSION (csMeshFactoryWrapper, 0, 0, 3);
00580
00584 class csMeshFactoryWrapper : public csObject
00585 {
00586 private:
00588 iMeshObjectFactory* meshFact;
00589
00591 iMeshFactoryWrapper* parent;
00592
00594 csReversibleTransform transform;
00595
00597 csMeshFactoryFactoryList children;
00598
00599 private:
00601 virtual ~csMeshFactoryWrapper ();
00602
00603 public:
00605 csMeshFactoryWrapper (iMeshObjectFactory* meshFact);
00607 csMeshFactoryWrapper ();
00608
00610 void SetMeshObjectFactory (iMeshObjectFactory* meshFact);
00611
00613 iMeshObjectFactory* GetMeshObjectFactory () const
00614 {
00615 return meshFact;
00616 }
00617
00621 iMeshWrapper* NewMeshObject ();
00622
00632 void HardTransform (const csReversibleTransform& t);
00633
00635 void PrepareChild (iMeshFactoryWrapper* child);
00637 void UnprepareChild (iMeshFactoryWrapper* child);
00638
00642 csReversibleTransform& GetTransform () { return transform; }
00643
00647 void SetTransform (const csReversibleTransform& tr) { transform = tr; }
00648
00649 SCF_DECLARE_IBASE_EXT (csObject);
00650
00651
00652 struct MeshFactoryWrapper : public iMeshFactoryWrapper
00653 {
00654 SCF_DECLARE_EMBEDDED_IBASE (csMeshFactoryWrapper);
00655 virtual iMeshObjectFactory* GetMeshObjectFactory () const
00656 { return scfParent->GetMeshObjectFactory (); }
00657 virtual void SetMeshObjectFactory (iMeshObjectFactory* fact)
00658 { scfParent->SetMeshObjectFactory (fact); }
00659 virtual iObject *QueryObject ()
00660 { return scfParent; }
00661 virtual void HardTransform (const csReversibleTransform& t)
00662 { scfParent->HardTransform (t); }
00663 virtual iMeshWrapper* CreateMeshWrapper ()
00664 { return scfParent->NewMeshObject (); }
00665 virtual iMeshFactoryWrapper* GetParentContainer () const
00666 { return scfParent->parent; }
00667 virtual void SetParentContainer (iMeshFactoryWrapper *p)
00668 { scfParent->parent = p; }
00669 virtual iMeshFactoryList* GetChildren ()
00670 { return &(scfParent->children.scfiMeshFactoryList); }
00671 virtual csReversibleTransform& GetTransform ()
00672 { return scfParent->GetTransform (); }
00673 virtual void SetTransform (const csReversibleTransform& tr)
00674 { scfParent->SetTransform (tr); }
00675 } scfiMeshFactoryWrapper;
00676 friend struct MeshFactoryWrapper;
00677 };
00678
00679 #endif // __CS_MESHOBJ_H__