|
thing.h00001 /* 00002 Copyright (C) 1998-2001 by Jorrit Tyberghein 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 */ 00018 00019 #ifndef __CS_THING_H__ 00020 #define __CS_THING_H__ 00021 00022 #include "csgeom/transfrm.h" 00023 #include "csutil/csobject.h" 00024 #include "csutil/nobjvec.h" 00025 #include "csengine/bsp.h" 00026 #include "csutil/util.h" 00027 #include "csutil/flags.h" 00028 #include "csutil/cscolor.h" 00029 #include "csutil/csvector.h" 00030 #include "csutil/garray.h" 00031 #include "ivaria/polymesh.h" 00032 #include "iengine/viscull.h" 00033 #include "iengine/mesh.h" 00034 #include "iengine/rview.h" 00035 #include "imesh/thing/thing.h" 00036 #include "imesh/object.h" 00037 #include "imesh/lighting.h" 00038 #include "iutil/eventh.h" 00039 #include "iutil/comp.h" 00040 00041 class csSector; 00042 class csEngine; 00043 class csStatLight; 00044 class csMaterialWrapper; 00045 class csMaterialList; 00046 class csThing; 00047 class csPolygon3D; 00048 class csPolygonInt; 00049 class csPolygonTree; 00050 class csPolygon2D; 00051 class csPolygon2DQueue; 00052 class csFrustumList; 00053 struct iShadowBlockList; 00054 struct csVisObjInfo; 00055 struct iGraphics3D; 00056 struct iRenderView; 00057 struct iMovable; 00058 struct iFrustumView; 00059 struct iMaterialWrapper; 00060 struct iPolygonBuffer; 00061 00078 struct csThingBBox 00079 { 00080 int i1, i2, i3, i4, i5, i6, i7, i8; 00081 }; 00082 00088 struct csThingEdge 00089 { 00090 int num_polygons; 00091 int* polygon_indices; 00092 }; 00093 00115 class csThing : public csObject 00116 { 00117 private: 00119 unsigned int thing_id; 00121 static int last_thing_id; 00123 unsigned long last_polygon_id; 00125 char* cachename; 00126 00128 int num_vertices; 00130 int max_vertices; 00131 00133 csVector3* obj_verts; 00139 csVector3* wor_verts; 00141 csVector3* cam_verts; 00143 int num_cam_verts; 00145 long cameranr; 00146 00152 long movablenr; 00156 iMovable* cached_movable; 00161 int cfg_moving; 00162 00164 csPolygonArray polygons; 00170 csVector portal_polygons; 00171 00176 iPolygonBuffer* polybuf; 00180 iMaterialWrapper** polybuf_materials; 00181 int polybuf_material_count; 00182 00184 CS_DECLARE_GROWING_ARRAY (thing_edges, csThingEdge); 00186 bool thing_edges_valid; 00187 00189 csCurvesArray curves; 00194 bool curves_transf_ok; 00195 00197 csThingBBox* bbox; 00198 00200 csBox3 obj_bbox; 00206 csBox3 wor_bbox; 00208 long wor_bbox_movablenr; 00209 00211 bool obj_bbox_valid; 00212 00214 csVector3 obj_radius; 00216 float max_obj_radius; 00217 00222 long light_frame_number; 00223 00225 csFog fog; 00226 00231 csVector visobjects; 00232 00237 csPolygonTree* static_tree; 00238 00240 int center_idx; 00241 00243 csThing* ParentTemplate; 00245 iBase* logparent; 00246 00248 bool prepared; 00249 00254 csVector3 curves_center; 00259 float curves_scale; 00260 00262 csVector3* curve_vertices; 00264 csVector2* curve_texels; 00265 00267 int num_curve_vertices; 00269 int max_curve_vertices; 00270 00271 float current_lod; 00272 uint32 current_features; 00273 00274 public: 00276 csFlags flags; 00277 00284 static long current_light_frame_number; 00285 00292 int draw_busy; 00293 00294 private: 00300 void PreparePolygonBuffer (); 00301 00306 void InvalidateThing (); 00307 00314 void DrawPolygonArrayDPM (csPolygonInt** polygon, int num, 00315 iRenderView* rview, iMovable* movable, csZBufMode zMode); 00316 00320 static void DrawPolygonArray (csPolygonInt** polygon, int num, 00321 iRenderView* rview, csZBufMode zMode); 00322 00328 static void* TestQueuePolygonArray (csPolygonInt** polygon, int num, 00329 iRenderView* d, csPolygon2DQueue* poly_queue, bool pvs); 00330 00335 static void DrawOnePolygon (csPolygon3D* p, csPolygon2D* poly, 00336 iRenderView* d, csZBufMode zMode); 00337 00342 static void* TestQueuePolygons (csThing*, csPolygonInt** polygon, 00343 int num, bool same_plane, void* data); 00344 00349 void DrawPolygonsFromQueue (csPolygon2DQueue* queue, iRenderView* rview); 00350 00355 static void* DrawPolygons (csThing*, csPolygonInt** polygon, 00356 int num, bool same_plane, void* data); 00357 00362 void CheckVisUpdate (csVisObjInfo* vinf); 00363 00368 void UpdateCurveTransform (const csReversibleTransform& movtrans); 00369 00375 void UpdateCurveTransform (); 00376 00378 void CleanupThingEdgeTable (); 00379 00381 void ComputeThingEdgeTable (); 00382 00384 void GenerateCacheName (); 00385 00386 public: 00390 csThing (iBase* parent); 00391 00393 virtual ~csThing (); 00394 00395 //---------------------------------------------------------------------- 00396 // Vertex handling functions 00397 //---------------------------------------------------------------------- 00398 00400 int AddVertex (const csVector3& v) { return AddVertex (v.x, v.y, v.z); } 00401 00403 int AddVertex (float x, float y, float z); 00404 00413 int AddVertexSmart (const csVector3& v) 00414 { 00415 return AddVertexSmart (v.x, v.y, v.z); 00416 } 00417 00426 int AddVertexSmart (float x, float y, float z); 00427 00438 void CompressVertices (); 00439 00445 void RemoveUnusedVertices (); 00446 00448 const csVector3& Vobj (int idx) const { return obj_verts[idx]; } 00449 00455 const csVector3& Vwor (int idx) const { return wor_verts[idx]; } 00456 00462 const csVector3& Vcam (int idx) const { return cam_verts[idx]; } 00463 00465 int GetVertexCount () const { return num_vertices; } 00466 00468 void SetVertex (int idx, const csVector3& vt); 00469 00471 void DeleteVertex (int idx); 00472 00474 void DeleteVertices (int from, int to); 00475 00476 //---------------------------------------------------------------------- 00477 // Polygon handling functions 00478 //---------------------------------------------------------------------- 00479 00481 void AddPolygon (csPolygonInt* spoly); 00482 00484 csPolygon3D* NewPolygon (csMaterialWrapper* material); 00485 00487 int GetPolygonCount () 00488 { return polygons.Length (); } 00489 00491 csPolygonInt* GetPolygonInt (int idx); 00492 00494 csPolygon3D *GetPolygon3D (int idx) 00495 { return polygons.Get (idx); } 00496 00498 csPolygon3D *GetPolygon3D (const char* name); 00499 00501 csPolygonArray& GetPolygonArray () { return polygons; } 00502 00506 unsigned long GetNewPolygonID () 00507 { 00508 last_polygon_id++; 00509 return last_polygon_id; 00510 } 00511 00513 int FindPolygonIndex (iPolygon3D* polygon) const; 00514 00516 void RemovePolygon (int idx); 00517 00519 void RemovePolygons (); 00520 00521 //---------------------------------------------------------------------- 00522 // Curve handling functions 00523 //---------------------------------------------------------------------- 00524 00526 void AddCurve (csCurve* curve); 00527 00529 int GetCurveCount () const 00530 { return curves.Length (); } 00531 00533 csCurve* GetCurve (int idx) const 00534 { return curves.Get (idx); } 00535 00537 iCurve* CreateCurve (iCurveTemplate* tmpl); 00538 00540 int FindCurveIndex (iCurve* curve) const; 00541 00543 void RemoveCurve (int idx); 00544 00546 void RemoveCurves (); 00547 00549 csCurve* GetCurve (char* name) const; 00550 00552 int GetCurveVertexCount () const { return num_curve_vertices; } 00553 00555 csVector3& GetCurveVertex (int i) const { return curve_vertices[i]; } 00556 00558 csVector3* GetCurveVertices () const { return curve_vertices; } 00559 00561 csVector2& GetCurveTexel (int i) const { return curve_texels[i]; } 00562 00564 void SetCurveVertex (int idx, const csVector3& vt); 00565 00567 void SetCurveTexel (int idx, const csVector2& vt); 00568 00570 void ClearCurveVertices (); 00571 00573 int AddCurveVertex (const csVector3& v, const csVector2& t); 00574 00576 float GetCurvesScale () const { return curves_scale; } 00577 00579 void SetCurvesScale (float f) { curves_scale = f; } 00580 00582 const csVector3& GetCurvesCenter () const { return curves_center; } 00583 00585 void SetCurvesCenter (csVector3& v) { curves_center = v; } 00586 00587 //---------------------------------------------------------------------- 00588 // Setup 00589 //---------------------------------------------------------------------- 00590 00598 void Prepare (); 00599 00606 void Merge (csThing* other); 00607 00611 void MergeTemplate (iThingState* tpl, 00612 iMaterialWrapper* default_material = NULL, 00613 csVector3* shift = NULL, csMatrix3* transform = NULL); 00614 00622 void ReplaceMaterials (iMaterialList* matList, const char* prefix); 00623 00625 void SetTemplate (csThing *t) 00626 { ParentTemplate = t; } 00627 00629 csThing *GetTemplate () const 00630 { return ParentTemplate; } 00631 00632 //---------------------------------------------------------------------- 00633 // Bounding information 00634 //---------------------------------------------------------------------- 00635 00645 void CreateBoundingBox (); 00646 00648 csThingBBox* GetBoundingBox () 00649 { 00650 if (!bbox) CreateBoundingBox (); 00651 return bbox; 00652 } 00653 00657 void GetTransformedBoundingBox ( 00658 const csReversibleTransform& trans, csBox3& cbox); 00659 00663 float GetScreenBoundingBox ( 00664 float fov, float sx, float sy, 00665 const csReversibleTransform& trans, csBox2& sbox, csBox3& cbox); 00666 00671 void GetBoundingBox (csBox3& box); 00672 00676 void GetBoundingBox (iMovable* movable, csBox3& box); 00677 00681 void GetRadius (csVector3& rad, csVector3& cent); 00682 00688 void AddPortalPolygon (csPolygon3D* poly); 00689 00693 void RemovePortalPolygon (csPolygon3D* poly); 00694 00695 //---------------------------------------------------------------------- 00696 // Visibility culler 00697 //---------------------------------------------------------------------- 00698 00702 csPolygonTree* GetStaticTree () { return static_tree; } 00703 00710 void BuildStaticTree (const char* name, int mode = BSP_MINIMIZE_SPLITS); 00711 00713 void RegisterVisObject (iVisibilityObject* visobj); 00715 void UnregisterVisObject (iVisibilityObject* visobj); 00716 00722 bool VisTest (iRenderView* irview); 00723 00724 //---------------------------------------------------------------------- 00725 // Shadow System 00726 //---------------------------------------------------------------------- 00727 00729 void RegisterShadowReceiver (iShadowReceiver* receiver); 00731 void UnregisterShadowReceiver (iShadowReceiver* receiver); 00732 00736 void CastShadows (iFrustumView* fview); 00737 00738 //---------------------------------------------------------------------- 00739 // Drawing 00740 //---------------------------------------------------------------------- 00741 00745 bool DrawTest (iRenderView* rview, iMovable* movable); 00746 00750 bool Draw (iRenderView* rview, iMovable* movable, csZBufMode zMode); 00751 00755 bool DrawCurves (iRenderView* rview, iMovable* movable, csZBufMode zMode); 00756 00761 bool DrawFoggy (iRenderView* rview, iMovable* movable); 00762 00763 //---------------------------------------------------------------------- 00764 // Lighting 00765 //---------------------------------------------------------------------- 00766 00770 void InitializeDefault (); 00771 00775 bool ReadFromCache (iCacheManager* cache_mgr, int id); 00776 00780 bool WriteToCache (iCacheManager* cache_mgr, int id); 00781 00786 void PrepareLighting (); 00787 00789 void SetCacheName (const char* n) 00790 { 00791 delete[] cachename; 00792 cachename = n ? csStrNew (n) : 0; 00793 } 00795 const char* GetCacheName (); 00796 00797 //---------------------------------------------------------------------- 00798 // Utility functions 00799 //---------------------------------------------------------------------- 00800 00809 csPolygon3D* IntersectSphere (csVector3& center, float radius, 00810 float* pr = NULL); 00811 00823 csPolygon3D* IntersectSegment (const csVector3& start, 00824 const csVector3& end, csVector3& isect, 00825 float* pr = NULL, bool only_portals = false); 00826 00841 csPolygon3D* IntersectSegmentFull (const csVector3& start, 00842 const csVector3& end, csVector3& isect, 00843 float* pr = NULL, csMeshWrapper** p_mesh = NULL); 00844 00848 void RealCheckFrustum (iFrustumView* lview, iMovable* movable); 00849 00854 void CheckFrustum (iFrustumView* lview, iMovable* movable); 00855 00863 void AppendShadows (iMovable* movable, iShadowBlockList* shadows, 00864 csVector3& origin); 00865 00866 //---------------------------------------------------------------------- 00867 // Transformation 00868 //---------------------------------------------------------------------- 00869 00874 void UpdateTransformation (const csTransform& c, long cam_cameranr); 00875 00877 void WorUpdate (); 00878 00886 void HardTransform (const csReversibleTransform& t); 00887 00889 csVector3* GetCameraVertices (const csTransform& c, long cam_cameranr) 00890 { 00891 UpdateTransformation (c, cam_cameranr); 00892 return cam_verts; 00893 } 00894 00895 //---------------------------------------------------------------------- 00896 // Various 00897 //---------------------------------------------------------------------- 00898 00902 void SetMovingOption (int opt); 00903 00907 int GetMovingOption () const { return cfg_moving; } 00908 00914 void SetConvex (bool c); 00915 00921 int GetCenter () { return center_idx; } 00922 00924 bool HasFog () { return fog.enabled; } 00925 00927 csFog& GetFog () { return fog; } 00928 00930 void SetFog (float density, const csColor& color) 00931 { 00932 fog.enabled = true; 00933 fog.density = density; 00934 fog.red = color.red; 00935 fog.green = color.green; 00936 fog.blue = color.blue; 00937 } 00938 00940 void DisableFog () { fog.enabled = false; } 00941 00942 SCF_DECLARE_IBASE_EXT (csObject); 00943 00944 //------------------------- iThingState interface ------------------------- 00945 struct ThingState : public iThingState 00946 { 00947 SCF_DECLARE_EMBEDDED_IBASE (csThing); 00948 virtual void* GetPrivateObject () { return (void*)scfParent; } 00949 virtual iObject* QueryObject () { return scfParent; } 00950 virtual void CompressVertices () { scfParent->CompressVertices(); } 00951 00952 virtual int GetPolygonCount () { return scfParent->polygons.Length (); } 00953 virtual iPolygon3D *GetPolygon (int idx); 00954 virtual iPolygon3D *GetPolygon (const char* name); 00955 virtual iPolygon3D *CreatePolygon (const char *iName); 00956 virtual int FindPolygonIndex (iPolygon3D* polygon) const 00957 { return scfParent->FindPolygonIndex (polygon); } 00958 virtual void RemovePolygon (int idx) 00959 { scfParent->RemovePolygon (idx); } 00960 virtual void RemovePolygons () 00961 { scfParent->RemovePolygons (); } 00962 00963 virtual int GetPortalCount () const; 00964 virtual iPortal* GetPortal (int idx) const; 00965 virtual iPolygon3D* GetPortalPolygon (int idx) const; 00966 00967 virtual int GetVertexCount () const { return scfParent->num_vertices; } 00968 virtual const csVector3 &GetVertex (int i) const 00969 { return scfParent->obj_verts[i]; } 00970 virtual const csVector3* GetVertices () const 00971 { return scfParent->obj_verts; } 00972 virtual const csVector3 &GetVertexW (int i) const 00973 { return scfParent->wor_verts[i]; } 00974 virtual const csVector3* GetVerticesW () const 00975 { return scfParent->wor_verts; } 00976 virtual const csVector3 &GetVertexC (int i) const 00977 { return scfParent->cam_verts[i]; } 00978 virtual const csVector3* GetVerticesC () const 00979 { return scfParent->cam_verts; } 00980 virtual int CreateVertex (const csVector3 &iVertex) 00981 { return scfParent->AddVertex (iVertex.x, iVertex.y, iVertex.z); } 00982 virtual void SetVertex (int idx, const csVector3& vt) 00983 { scfParent->SetVertex (idx, vt); } 00984 virtual void DeleteVertex (int idx) 00985 { scfParent->DeleteVertex (idx); } 00986 virtual void DeleteVertices (int from, int to) 00987 { scfParent->DeleteVertices (from, to); } 00988 00989 virtual void CheckFrustum (iFrustumView* fview, iMovable* movable) 00990 { scfParent->CheckFrustum (fview, movable); } 00991 virtual csFlags& GetFlags () { return scfParent->flags; } 00992 virtual int GetMovingOption () const 00993 { return scfParent->GetMovingOption (); } 00994 virtual void SetMovingOption (int opt) 00995 { scfParent->SetMovingOption (opt); } 00996 00997 virtual const csVector3& GetCurvesCenter () const 00998 { return scfParent->curves_center; } 00999 virtual void SetCurvesCenter (const csVector3& cen) 01000 { scfParent->curves_center = cen; } 01001 virtual float GetCurvesScale () const 01002 { return scfParent->curves_scale; } 01003 virtual void SetCurvesScale (float scale) 01004 { scfParent->curves_scale = scale; } 01005 virtual int GetCurveCount () const 01006 { return scfParent->GetCurveCount (); } 01007 virtual int GetCurveVertexCount () const 01008 { return scfParent->GetCurveVertexCount (); } 01009 virtual csVector3& GetCurveVertex (int i) const 01010 { return scfParent->GetCurveVertex (i); } 01011 virtual csVector3* GetCurveVertices () const 01012 { return scfParent->GetCurveVertices (); } 01013 virtual csVector2& GetCurveTexel (int i) const 01014 { return scfParent->GetCurveTexel (i); } 01015 virtual void SetCurveVertex (int idx, const csVector3& vt) 01016 { scfParent->SetCurveVertex (idx, vt); } 01017 virtual void SetCurveTexel (int idx, const csVector2& vt) 01018 { scfParent->SetCurveTexel (idx, vt); } 01019 virtual void ClearCurveVertices () 01020 { scfParent->ClearCurveVertices (); } 01021 virtual iCurve* GetCurve (int idx) const; 01022 virtual iCurve* CreateCurve (iCurveTemplate* tmpl) 01023 { return scfParent->CreateCurve (tmpl); } 01024 virtual int FindCurveIndex (iCurve* curve) const 01025 { return scfParent->FindCurveIndex (curve); } 01026 virtual void RemoveCurve (int idx) 01027 { scfParent->RemoveCurve (idx); } 01028 virtual void RemoveCurves () 01029 { scfParent->RemoveCurves (); } 01030 01031 virtual void MergeTemplate (iThingState* tpl, 01032 iMaterialWrapper* default_material = NULL, 01033 csVector3* shift = NULL, csMatrix3* transform = NULL) 01034 { 01035 scfParent->MergeTemplate (tpl, default_material, shift, transform); 01036 } 01037 virtual void ReplaceMaterials (iMaterialList* materials, 01038 const char* prefix) 01039 { 01040 scfParent->ReplaceMaterials (materials, prefix); 01041 } 01042 virtual void AddCurveVertex (const csVector3& v, const csVector2& uv) 01043 { 01044 scfParent->AddCurveVertex (v, uv); 01045 } 01046 virtual bool HasFog () const 01047 { return scfParent->HasFog (); } 01048 virtual csFog *GetFog () const 01049 { return &scfParent->GetFog (); } 01050 } scfiThingState; 01051 friend struct ThingState; 01052 01053 //------------------------- iLightingInfo interface ------------------------- 01054 struct LightingInfo : public iLightingInfo 01055 { 01056 SCF_DECLARE_EMBEDDED_IBASE (csThing); 01057 virtual void InitializeDefault () 01058 { 01059 scfParent->InitializeDefault (); 01060 } 01061 virtual bool ReadFromCache (iCacheManager* cache_mgr, int id) 01062 { 01063 return scfParent->ReadFromCache (cache_mgr, id); 01064 } 01065 virtual bool WriteToCache (iCacheManager* cache_mgr, int id) 01066 { 01067 return scfParent->WriteToCache (cache_mgr, id); 01068 } 01069 virtual void PrepareLighting () 01070 { 01071 scfParent->PrepareLighting (); 01072 } 01073 virtual void SetCacheName (const char* cachename) 01074 { 01075 scfParent->SetCacheName (cachename); 01076 } 01077 virtual const char* GetCacheName () const 01078 { 01079 return scfParent->GetCacheName (); 01080 } 01081 } scfiLightingInfo; 01082 friend struct LightingInfo; 01083 01084 //-------------------- iPolygonMesh interface implementation --------------- 01085 struct PolyMesh : public iPolygonMesh 01086 { 01087 PolyMesh () : polygons (NULL), vertices (NULL), alloc_vertices (NULL) { } 01088 virtual ~PolyMesh () { Cleanup (); } 01089 void Setup (); 01090 01091 SCF_DECLARE_EMBEDDED_IBASE (csThing); 01092 01093 virtual int GetVertexCount () 01094 { 01095 Setup (); 01096 return num_verts; 01097 } 01098 virtual csVector3* GetVertices () 01099 { 01100 Setup (); 01101 return vertices; 01102 } 01103 virtual int GetPolygonCount () 01104 { 01105 Setup (); 01106 return num_poly; 01107 } 01108 virtual csMeshedPolygon* GetPolygons () 01109 { 01110 Setup (); 01111 return polygons; 01112 } 01113 virtual void Cleanup (); 01114 01115 csMeshedPolygon* polygons; // Array of polygons. 01116 csVector3* vertices; // Array of vertices (points to alloc_vertices 01117 // or else obj_verts of scfParent). 01118 csVector3* alloc_vertices; // Optional copy of vertices from parent. 01119 // This copy is used if there are curve 01120 // vertices. 01121 int num_poly; // Total number of polygons. 01122 int curve_poly_start; // Index of first polygon from curves. 01123 // Polygons after this index need to be 01124 // deleted individually. 01125 int num_verts; // Total number of vertices. 01126 } scfiPolygonMesh; 01127 friend struct PolyMesh; 01128 01129 //-------------------- iVisibilityCuller interface implementation ---------- 01130 struct VisCull : public iVisibilityCuller 01131 { 01132 SCF_DECLARE_EMBEDDED_IBASE (csThing); 01133 virtual void Setup (const char* name) 01134 { 01135 scfParent->BuildStaticTree (name, BSP_MINIMIZE_SPLITS); 01136 } 01137 virtual void RegisterVisObject (iVisibilityObject* visobj) 01138 { 01139 scfParent->RegisterVisObject (visobj); 01140 } 01141 virtual void UnregisterVisObject (iVisibilityObject* visobj) 01142 { 01143 scfParent->UnregisterVisObject (visobj); 01144 } 01145 virtual bool VisTest (iRenderView* irview) 01146 { 01147 return scfParent->VisTest (irview); 01148 } 01149 virtual iPolygon3D* IntersectSegment (const csVector3& start, 01150 const csVector3& end, csVector3& isect, float* pr = NULL, 01151 iMeshWrapper** p_mesh = NULL); 01152 virtual bool SupportsShadowCasting () 01153 { 01154 return true; 01155 } 01156 virtual void RegisterShadowReceiver (iShadowReceiver* receiver) 01157 { 01158 scfParent->RegisterShadowReceiver (receiver); 01159 } 01160 virtual void UnregisterShadowReceiver (iShadowReceiver* receiver) 01161 { 01162 scfParent->UnregisterShadowReceiver (receiver); 01163 } 01164 virtual void CastShadows (iFrustumView* fview) 01165 { 01166 scfParent->CastShadows (fview); 01167 } 01168 } scfiVisibilityCuller; 01169 friend struct VisCull; 01170 01171 //-------------------- iMeshObject interface implementation ---------- 01172 struct MeshObject : public iMeshObject 01173 { 01174 SCF_DECLARE_EMBEDDED_IBASE (csThing); 01175 virtual iMeshObjectFactory* GetFactory () const; 01176 virtual bool DrawTest (iRenderView* rview, iMovable* movable) 01177 { 01178 return scfParent->DrawTest (rview, movable); 01179 } 01180 virtual void UpdateLighting (iLight** /*lights*/, int /*num_lights*/, 01181 iMovable* /*movable*/) { } 01182 virtual bool Draw (iRenderView* rview, iMovable* movable, 01183 csZBufMode zMode) 01184 { 01185 return scfParent->Draw (rview, movable, zMode); 01186 } 01187 virtual void SetVisibleCallback (iMeshObjectDrawCallback* /*cb*/) { } 01188 virtual iMeshObjectDrawCallback* GetVisibleCallback () const 01189 { return NULL; } 01190 virtual void GetObjectBoundingBox (csBox3& bbox, 01191 int /*type = CS_BBOX_NORMAL*/) 01192 { 01193 scfParent->GetBoundingBox (bbox); 01194 } 01195 virtual void GetRadius ( csVector3& rad, csVector3& cent) 01196 { scfParent->GetRadius (rad,cent); } 01197 virtual void NextFrame (csTicks /*current_time*/) { } 01198 virtual bool WantToDie () const { return false; } 01199 virtual void HardTransform (const csReversibleTransform& t) 01200 { 01201 scfParent->HardTransform (t); 01202 } 01203 virtual bool SupportsHardTransform () const { return true; } 01204 virtual bool HitBeamOutline (const csVector3&, const csVector3&, 01205 csVector3&, float*) 01206 { return false; } 01207 virtual bool HitBeamObject (const csVector3& /*start*/, 01208 const csVector3& /*end*/, 01209 csVector3& /*isect*/, float* /*pr*/) { return false; } 01210 virtual long GetShapeNumber () const { return 0; /*@@@*/ } 01211 virtual void SetLogicalParent (iBase* lp) { scfParent->logparent = lp; } 01212 virtual iBase* GetLogicalParent () const { return scfParent->logparent; } 01213 } scfiMeshObject; 01214 friend struct MeshObject; 01215 01216 //-------------------- iMeshObjectFactory interface implementation --------- 01217 struct MeshObjectFactory : public iMeshObjectFactory 01218 { 01219 SCF_DECLARE_EMBEDDED_IBASE (csThing); 01220 virtual iMeshObject* NewInstance (); 01221 virtual void HardTransform (const csReversibleTransform& t) 01222 { 01223 scfParent->HardTransform (t); 01224 } 01225 virtual bool SupportsHardTransform () const { return true; } 01226 virtual void SetLogicalParent (iBase* lp) { scfParent->logparent = lp; } 01227 virtual iBase* GetLogicalParent () const { return scfParent->logparent; } 01228 } scfiMeshObjectFactory; 01229 friend struct MeshObjectFactory; 01230 }; 01231 01236 class csThingObjectType : public iMeshObjectType 01237 { 01238 private: 01239 iObjectRegistry* object_reg; 01240 01247 csNamedObjVector planes; 01248 01253 csNamedObjVector curve_templates; 01254 01255 public: 01256 SCF_DECLARE_IBASE; 01257 01259 csThingObjectType (iBase*); 01260 01262 virtual ~csThingObjectType (); 01263 01265 virtual bool Initialize (iObjectRegistry *object_reg); 01266 01268 virtual iMeshObjectFactory* NewFactory (); 01269 01270 iPolyTxtPlane* CreatePolyTxtPlane (const char* name = NULL); 01271 iPolyTxtPlane* FindPolyTxtPlane (const char* name); 01272 iCurveTemplate* CreateBezierTemplate (const char* name = NULL); 01273 iCurveTemplate* FindCurveTemplate (const char *iName); 01274 void RemovePolyTxtPlane (iPolyTxtPlane* pl); 01275 void RemoveCurveTemplate (iCurveTemplate* ct); 01276 void ClearPolyTxtPlanes (); 01277 void ClearCurveTemplates (); 01278 01279 struct eiThingEnvironment : public iThingEnvironment 01280 { 01281 SCF_DECLARE_EMBEDDED_IBASE(csThingObjectType); 01282 virtual iPolyTxtPlane* CreatePolyTxtPlane (const char* name = NULL) 01283 { 01284 return scfParent->CreatePolyTxtPlane (name); 01285 } 01286 virtual iPolyTxtPlane* FindPolyTxtPlane (const char* name) 01287 { 01288 return scfParent->FindPolyTxtPlane (name); 01289 } 01290 virtual iCurveTemplate* CreateBezierTemplate (const char* name = NULL) 01291 { 01292 return scfParent->CreateBezierTemplate (name); 01293 } 01294 virtual iCurveTemplate* FindCurveTemplate (const char* name) 01295 { 01296 return scfParent->FindCurveTemplate (name); 01297 } 01298 virtual void RemovePolyTxtPlane (iPolyTxtPlane* pl) 01299 { 01300 scfParent->RemovePolyTxtPlane (pl); 01301 } 01302 virtual void RemoveCurveTemplate (iCurveTemplate* ct) 01303 { 01304 scfParent->RemoveCurveTemplate (ct); 01305 } 01306 virtual void ClearPolyTxtPlanes () 01307 { 01308 scfParent->ClearPolyTxtPlanes (); 01309 } 01310 virtual void ClearCurveTemplates () 01311 { 01312 scfParent->ClearCurveTemplates (); 01313 } 01314 } scfiThingEnvironment; 01315 01316 struct eiComponent : public iComponent 01317 { 01318 SCF_DECLARE_EMBEDDED_IBASE(csThingObjectType); 01319 virtual bool Initialize (iObjectRegistry* p) 01320 { return scfParent->Initialize(p); } 01321 } scfiComponent; 01322 }; 01323 01324 #endif // __CS_THING_H__ Generated for Crystal Space by doxygen 1.2.5 written by Dimitri van Heesch, ©1997-2000 |