275 HierarchyTreeName(
NULL),
297 HierarchyTreeName(
NULL),
338void HLodDefClass::Free(
void)
345 if (HierarchyTreeName) {
346 ::free(HierarchyTreeName);
347 HierarchyTreeName =
NULL;
380 Name = ::strdup (src_lod.
Get_Name ());
382 if (phtree !=
NULL) {
383 HierarchyTreeName = ::strdup (phtree->
Get_Name ());
394 for (
int index = 0; index < LodCount; index ++) {
402 char **model_names =
W3DNEWARRAY char *[Lod[index].ModelCount];
403 int *bone_indicies =
W3DNEWARRAY int[Lod[index].ModelCount];
404 for (
int model_index = 0; model_index < Lod[index].ModelCount; model_index ++) {
408 if (prender_obj !=
NULL) {
409 model_names[model_index] = ::strdup (prender_obj->
Get_Name ());
412 model_names[model_index] =
NULL;
413 bone_indicies[model_index] = 0;
418 Lod[index].ModelName = model_names;
419 Lod[index].BoneIndex = bone_indicies;
490 ::lstrcpyn (header.
Name, Name, sizeof (header.
Name));
491 header.
Name[
sizeof (header.
Name) - 1] = 0;
498 if (csave.
Write (&header, sizeof (header)) ==
sizeof (header)) {
529 for (
int lod_index = 0;
530 (lod_index < LodCount) && success;
532 success = Lod[lod_index].Save_W3D (csave);
557 if (Aggregates.ModelCount > 0) {
559 Aggregates.Save_W3D(csave);
585 if (read_header(cload) ==
FALSE) {
592 for (
int iLOD = 0; iLOD < LodCount; iLOD ++) {
604 Lod[iLOD].Load_W3D(cload);
617 Aggregates.Load_W3D(cload);
620 read_proxy_array(cload);
654 W3dHLodHeaderStruct header;
655 if (cload.
Read(&header,
sizeof(header)) !=
sizeof(header)) {
661 Name = ::_strdup(header.
Name);
695 W3dHLodArrayHeaderStruct header;
696 if (cload.
Read(&header,
sizeof(header)) !=
sizeof(header))
return false;
705 for (
int imodel=0; imodel<ProxyArray->Length(); ++imodel) {
709 W3dHLodSubObjectStruct subobjdef;
710 if (cload.
Read(&subobjdef,
sizeof(subobjdef)) !=
sizeof(subobjdef))
return false;
713 (*ProxyArray)[imodel].Init(subobjdef);
730HLodDefClass::SubObjectArrayClass::SubObjectArrayClass(
void) :
751HLodDefClass::SubObjectArrayClass::~SubObjectArrayClass(
void)
769void HLodDefClass::SubObjectArrayClass::Reset(
void)
773 if (ModelName !=
NULL) {
774 for (
int imodel=0; imodel<ModelCount;imodel++) {
775 free(ModelName[imodel]);
780 if (BoneIndex !=
NULL) {
801bool HLodDefClass::SubObjectArrayClass::Load_W3D(ChunkLoadClass & cload)
809 W3dHLodArrayHeaderStruct header;
810 if (cload.
Read(&header,
sizeof(header)) !=
sizeof(header))
return false;
822 for (
int imodel=0; imodel<ModelCount; ++imodel) {
826 W3dHLodSubObjectStruct subobjdef;
827 if (cload.
Read(&subobjdef,
sizeof(subobjdef)) !=
sizeof(subobjdef))
return false;
831 ModelName[imodel] = strdup(subobjdef.
Name);
849bool HLodDefClass::SubObjectArrayClass::Save_W3D(ChunkSaveClass &csave)
852 bool ret_val =
false;
860 W3dHLodArrayHeaderStruct header = { 0 };
865 ret_val = (csave.
Write (&header,
sizeof (header)) ==
sizeof (header));
875 (index < ModelCount) && ret_val;
882 W3dHLodSubObjectStruct info = { 0 };
886 ::lstrcpyn (info.
Name, ModelName[index], sizeof (info.
Name));
887 info.
Name[
sizeof (info.
Name) - 1] = 0;
890 ret_val &= (csave.
Write (&info,
sizeof (info)) ==
sizeof (info));
996 WWASSERT((count > 0) && (count < 256));
1019 HTree->Init_Default();
1023 for (
int lod_index=0; lod_index <
LodCount; lod_index++) {
1112 for (
int ilod=0; ilod < def.LodCount; ilod++) {
1114 Lod[ilod].MaxScreenSize = def.Lod[ilod].MaxScreenSize;
1116 for (
int imodel=0; imodel < def.Lod[ilod].ModelCount; imodel++) {
1119 int boneindex = def.Lod[ilod].BoneIndex[imodel];
1130 for (
int iagg=0; iagg<def.Aggregates.ModelCount; iagg++) {
1132 int boneindex = def.Aggregates.BoneIndex[iagg];
1203 for (imodel=0; imodel < def.SubObjectCount; ++imodel) {
1206 int boneindex = def.SubObjects[imodel].
PivotID;
1247 if (
this != &that) {
1268 for (model = 0; model < that.
Lod[lod].
Count(); model++) {
1271 newnode.
Model = that.
Lod[lod][model].Model->Clone();
1278 Lod[lod].Add(newnode);
1353 for (lod = 0; lod <
LodCount; lod++) {
1354 for (model = 0; model <
Lod[lod].Count(); model++) {
1365 Lod[lod].Delete_All();
1514#ifdef ALLOW_TEMPORARIES
1582 if ((lod_index >= 0) && (lod_index <
LodCount)) {
1585 Lod[lod_index].MaxScreenSize = size;
1621 if ((lod_index >= 0) && (lod_index <
LodCount)) {
1624 size =
Lod[lod_index].MaxScreenSize;
1664 assert(bias > 0.0f);
1665 bias =
MAX(bias, 0.0f);
1669 for (
int i = 0; i < additional_count; i++) {
1694 if ((lod_index >= 0) && (lod_index <
LodCount)) {
1697 count =
Lod[lod_index].Count ();
1724 if ((lod_index >= 0) &&
1726 (model_index <
Lod[lod_index].Count ())) {
1729 pmodel =
Lod[lod_index][model_index].Model;
1756 if ((lod_index >= 0) &&
1758 (model_index <
Lod[lod_index].Count ())) {
1761 pmodel =
Lod[lod_index][model_index].Model;
1762 if (pmodel !=
NULL) {
1791 if ((lod_index >= 0) &&
1793 (model_index <
Lod[lod_index].Count ())) {
1796 bone_index =
Lod[lod_index][model_index].BoneIndex;
1841 if ((model_index >= 0) &&
1872 if ((model_index >= 0) &&
1877 if (pmodel !=
NULL) {
1906 if ((model_index >= 0) &&
1932 bool included =
false;
1962 for (
int model = 0; model <
Lod[index].Count (); model++) {
1965 Lod[index][model].Model =
NULL;
1974 Lod[index].Delete_All ();
1976 for (index = 0; index <
LodCount; index ++) {
1977 temp_lods[index] =
Lod[index + 1];
1983 ::memcpy (temp_cost, &
Cost[1],
sizeof (
float) *
LodCount);
1984 ::memcpy (temp_value, &
Value[1],
sizeof (
float) * (
LodCount + 1));
1999 if (null_object !=
NULL) {
2003 for (
int index = 0; index <
LodCount; index ++) {
2004 temp_lods[index + 1] =
Lod[index];
2010 ::memcpy (&temp_cost[1],
Cost,
sizeof (
float) *
LodCount);
2011 ::memcpy (&temp_value[1],
Value,
sizeof (
float) * (
LodCount + 1));
2073 bool retval =
false;
2117 for (i = 0; i < model_count; i++) {
2118 if (
Lod[
CurLod][i].Model->Is_Not_Hidden_At_All()) {
2119 polycount +=
Lod[
CurLod][i].Model->Get_Num_Polys();
2124 for (i = 0; i < additional_count; i++) {
2156 for (i = 0; i <
Lod[
CurLod].Count(); i++) {
2200 for (i = 0; i <
Lod[lod_index].Count(); i++) {
2201 Lod[lod_index][i].Model->Special_Render(rinfo);
2265 for (i = 0; i < model_count; i++) {
2266 Lod[
CurLod][i].Model->Notify_Added(scene);
2270 for (i = 0; i < additional_count; i++) {
2292 for (i = 0; i < model_count; i++) {
2293 Lod[
CurLod][i].Model->Notify_Removed(scene);
2297 for (i = 0; i < additional_count; i++) {
2319 for (
int lod=0; lod<
LodCount;lod++) {
2320 count +=
Lod[lod].Count();
2342 for (
int lod=0; lod<
LodCount; lod++) {
2343 if (index <
Lod[lod].Count()) {
2344 Lod[lod][index].Model->Add_Ref();
2345 return Lod[lod][index].Model;
2347 index -=
Lod[lod].Count();
2388 if (removeme ==
NULL) {
2394 bool iscurrent =
false;
2396 for (
int lod = 0; (lod <
LodCount) && (!found); lod++) {
2397 for (
int model = 0; (model <
Lod[lod].Count()) && (!found); model++) {
2399 if (
Lod[lod][model].Model == removeme) {
2402 Lod[lod].Delete(model);
2414 for (
int model = 0; (model <
AdditionalModels.Count()) && (!found); model++) {
2464 for (
int lod = 0; lod <
LodCount; lod++) {
2465 for (
int model = 0; model <
Lod[lod].Count(); model++) {
2466 if (
Lod[lod][model].BoneIndex == boneindex) count++;
2491 for (
int lod = 0; lod <
LodCount; lod++) {
2492 for (
int model = 0; model <
Lod[lod].Count(); model++) {
2493 if (
Lod[lod][model].BoneIndex == boneindex) {
2494 if (count == index) {
2495 Lod[lod][model].Model->Add_Ref();
2496 return Lod[lod][model].Model;
2504 if (count == index) {
2529 for (
int lod = 0; lod <
LodCount; lod++) {
2530 for (
int model = 0; model <
Lod[lod].Count(); model++) {
2531 if (
Lod[lod][model].Model == subobj) {
2532 return Lod[lod][model].BoneIndex;
2547 return Lod[LodIndex][ModelIndex].BoneIndex;
2565 if ((boneindex < 0) || (boneindex >=
HTree->Num_Pivots()))
return 0;
2570 newnode.
Model = subobj;
2697 for (i = 0; i <
Lod[top].Count(); i++) {
2698 res |=
Lod[top][i].Model->Cast_Ray(raytest);
2732 for (i = 0; i <
Lod[top].Count(); i++) {
2733 res |=
Lod[top][i].Model->Cast_AABox(boxtest);
2767 for (i = 0; i <
Lod[top].Count(); i++) {
2768 res |=
Lod[top][i].Model->Cast_OBBox(boxtest);
2802 for (i = 0; i <
Lod[top].Count(); i++) {
2803 res |=
Lod[top][i].Model->Intersect_AABox(boxtest);
2837 for (i = 0; i <
Lod[top].Count(); i++) {
2838 res |=
Lod[top][i].Model->Intersect_OBBox(boxtest);
2901 for (
int i = 0; i < additional_count; i++) {
2933 for (
int i = 0; i <
LodCount; i++) {
2936 Lod[i].PixelCostPerArea = 0.0f;
2939 int model_count =
Lod[i].Count();
2941 for (
int j = 0; j < model_count; j++) {
2942 if (
Lod[i][j].Model->Is_Not_Hidden_At_All()) {
2943 polycount +=
Lod[i][j].Model->Get_Num_Polys();
2947 Lod[i].NonPixelCost = (polycount != 0)? polycount : 0.000001f;
2950 Lod[i].BenefitFactor = (polycount != 0) ? (1 - (0.5f / (polycount * polycount))) : 0.0f;
2974 for (
int i = 0; i < model_count; i++) {
2983 for (
int i = 0; i < model_count; i++) {
3008 for (
int i = 0; i < model_count; i++) {
3017 for (
int i = 0; i < model_count; i++) {
3095 if (lod ==
CurLod)
return;
3100 for (
int i = 0; i < model_count; i++) {
3109 for (
int i = 0; i < model_count; i++) {
3169 for (lod = 0; lod <
LodCount; lod++) {
3170 costs[lod] =
Lod[lod].NonPixelCost +
Lod[lod].PixelCostPerArea * screen_area;
3177 for (lod = 0; lod <
LodCount &&
Lod[lod].MaxScreenSize < screen_area; lod++) {
3193 values[lod] = (
Lod[lod].BenefitFactor * screen_area *
LODBias) / costs[lod];
3266 if (
scale==1.0f)
return;
3272 for (lod = 0; lod <
LodCount; lod++) {
3273 for (model = 0; model <
Lod[lod].Count(); model++) {
3274 Lod[lod][model].Model->Scale(
scale);
3332 *set = (*SnapPoints)[index];
3334 set->
X = set->
Y = set->
Z = 0;
3364 for (lod = 0; lod <
LodCount; lod++) {
3365 for (model = 0; model <
Lod[lod].Count(); model++) {
3368 int bone =
Lod[lod][model].BoneIndex;
3408 int count = high_lod.
Count ();
3419 int index = high_lod.
Count ();
3428 const char *name = model->
Get_Name ();
3429 const char *name_seg = ::strchr (name,
'.');
3430 if (name_seg !=
NULL) {
3431 name = name_seg + 1;
3437 if (::stricmp (name,
"BOUNDINGBOX") == 0) {
3450 ObjBox.Center.Set(0,0,0);
3451 ObjBox.Extent.Set(0,0,0);
3471 box.
Init(obj_aabox);
3526 if (boneindex >=
HTree->Num_Pivots()) {
3527 WWDEBUG_SAY((
"ERROR: Model %s tried to use bone %d in skeleton %s. Please re-export!\n",
Get_Name(),boneindex,
HTree->Get_Name()));
3532 newnode.
Model = robj;
3541 Lod[lod].Add(newnode);
3559 for (
int lod=0; lod<
LodCount; lod++) {
3560 for (
int model=0; model<
Lod[lod].Count(); model++) {
3561 Lod[lod][model].Model->Create_Decal(generator);
3588 for (
int lod=0; lod<
LodCount; lod++) {
3589 for (
int model=0; model<
Lod[lod].Count(); model++) {
3590 Lod[lod][model].Model->Delete_Decal(decal_id);
3636 for (
int index = 0; index < additional_count; index ++) {
Color scale(const Color &a, const Color &b)
@ W3D_CHUNK_HLOD_AGGREGATE_ARRAY
@ W3D_CHUNK_HLOD_PROXY_ARRAY
@ W3D_CHUNK_HLOD_LOD_ARRAY
@ W3D_CHUNK_HLOD_SUB_OBJECT
@ W3D_CHUNK_HLOD_SUB_OBJECT_ARRAY_HEADER
#define W3D_CURRENT_HLOD_VERSION
#define NO_MAX_SCREEN_SIZE
#define W3DMPO_GLUE(ARGCLASS)
void Transform(const Matrix3D &tm)
virtual bool Simple_Evaluate_Bone(int boneindex, Matrix3D *tm) const
void Set_Hierarchy_Valid(bool onoff) const
Animatable3DObjClass(const char *htree_name)
virtual void Render(RenderInfoClass &rinfo)
virtual void Update_Sub_Object_Transforms(void)
Animatable3DObjClass & operator=(const Animatable3DObjClass &)
virtual const HTreeClass * Get_HTree(void) const
virtual int Get_Bone_Index(const char *bonename)
virtual void Special_Render(SpecialRenderInfoClass &rinfo)
virtual void Set_HTree(HTreeClass *htree)
virtual void Set_Animation(void)
virtual void Set_Position(const Vector3 &v)
virtual void Set_Transform(const Matrix3D &m)
const Vector3 & Get_Local_Center(void)
const Vector3 & Get_Local_Extent(void)
uint32 Read(void *buf, uint32 nbytes)
uint32 Write(const void *buf, uint32 nbytes)
bool Begin_Chunk(uint32 id)
virtual const char * Get_Name(void) const
virtual void Set_Name(const char *name)
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
virtual int Get_Lod_Model_Bone(int lod_index, int model_index) const
virtual void Special_Render(SpecialRenderInfoClass &rinfo)
virtual int Add_Sub_Object_To_Bone(RenderObjClass *subobj, int bone_index)
virtual float Get_Value(void) const
virtual float Get_Max_Screen_Size(int lod_index) const
virtual void Render(RenderInfoClass &rinfo)
virtual float Get_Cost(void) const
virtual void Scale(float scale)
virtual void Decrement_LOD(void)
virtual RenderObjClass * Peek_Additional_Model(int model_index) const
virtual void Set_Position(const Vector3 &v)
virtual void Prepare_LOD(CameraClass &camera)
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
virtual void Update_Sub_Object_Transforms(void)
ModelArrayClass AdditionalModels
virtual int Get_Num_Sub_Objects_On_Bone(int boneindex) const
virtual bool Cast_Ray(RayCollisionTestClass &raytest)
virtual void Set_LOD_Bias(float bias)
virtual bool Cast_OBBox(OBBoxCollisionTestClass &boxtest)
virtual int Get_LOD_Level(void) const
virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const
virtual int Get_Num_Polys(void) const
virtual void Increment_LOD(void)
virtual void Add_Lod_Model(int lod, RenderObjClass *robj, int boneindex)
virtual bool Intersect_OBBox(OBBoxIntersectionTestClass &boxtest)
virtual bool Get_Proxy(int index, ProxyClass &proxy) const
SnapPointsClass * SnapPoints
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
virtual void Set_Max_Screen_Size(int lod_index, float size)
virtual int Get_Proxy_Count(void) const
HLodClass(const HLodClass &src)
virtual int Get_LOD_Count(void) const
virtual RenderObjClass * Get_Sub_Object_On_Bone(int index, int boneindex) const
virtual RenderObjClass * Get_Additional_Model(int model_index) const
virtual void Recalculate_Static_LOD_Factors(void)
virtual const AABoxClass & Get_Bounding_Box(void) const
HLodClass & operator=(const HLodClass &)
ProxyArrayClass * ProxyArray
virtual int Get_Sub_Object_Bone_Index(RenderObjClass *subobj) const
virtual int Add_Sub_Object(RenderObjClass *subobj)
virtual void Notify_Added(SceneClass *scene)
virtual bool Cast_AABox(AABoxCollisionTestClass &boxtest)
virtual int Get_Lod_Model_Count(int lod_index) const
virtual void Get_Snap_Point(int index, Vector3 *set)
virtual void Update_Obj_Space_Bounding_Volumes(void)
virtual RenderObjClass * Clone(void) const
virtual void Notify_Removed(SceneClass *scene)
virtual RenderObjClass * Peek_Lod_Model(int lod_index, int model_index) const
virtual int Remove_Sub_Object(RenderObjClass *robj)
virtual RenderObjClass * Get_Current_LOD(void)
virtual bool Is_NULL_Lod_Included(void) const
virtual int Get_Lod_Count(void) const
virtual void Set_Transform(const Matrix3D &m)
virtual int Get_Num_Snap_Points(void)
virtual void Create_Decal(DecalGeneratorClass *generator)
virtual int Get_Additional_Model_Count(void) const
virtual RenderObjClass * Get_Lod_Model(int lod_index, int model_index) const
virtual const SphereClass & Get_Bounding_Sphere(void) const
virtual void Set_LOD_Level(int lod)
virtual int Get_Additional_Model_Bone(int model_index) const
virtual void Set_HTree(HTreeClass *htree)
virtual void Set_Animation(void)
virtual void Include_NULL_Lod(bool include=true)
virtual void Set_Hidden(int onoff)
virtual float Get_Post_Increment_Value(void) const
virtual void Delete_Decal(uint32 decal_id)
virtual int Get_Num_Sub_Objects(void) const
virtual RenderObjClass * Get_Sub_Object(int index) const
virtual bool Intersect_AABox(AABoxIntersectionTestClass &boxtest)
WW3DErrorType Save(ChunkSaveClass &csave)
WW3DErrorType Save_Header(ChunkSaveClass &csave)
WW3DErrorType Save_Aggregate_Array(ChunkSaveClass &csave)
const char * Get_Name(void) const
WW3DErrorType Load_W3D(ChunkLoadClass &cload)
void Initialize(HLodClass &src_lod)
WW3DErrorType Save_Lod_Array(ChunkSaveClass &csave)
virtual PrototypeClass * Load_W3D(ChunkLoadClass &cload)
virtual RenderObjClass * Create(void)
const char * Get_Name(void) const
WWINLINE const char * Get_Name(void) const
static void Multiply(const Matrix3D &A, const Matrix3D &B, Matrix3D *set_result)
void mulVector3(const Vector3 &in, Vector3 &out) const
void Get_Orthogonal_Inverse(Matrix3D &set_inverse) const
void Transform_Center_Extent_AABox(const Vector3 ¢er, const Vector3 &extent, Vector3 *set_center, Vector3 *set_extent) const
void Add_Box(const MinMaxAABoxClass &box)
WWINLINE void Init(Vector3 *points, int num)
void Transform(const Matrix3D &tm)
static void Add_Object(RenderObjClass *robj)
static void Add_Cost(float cost)
ProxyArrayClass(int size)
void Set_Transform(const Matrix3D &tm)
void Set_Name(const char *name)
bool operator==(const ProxyRecordClass &that)
char Name[2 *W3D_NAME_LEN]
bool operator!=(const ProxyRecordClass &that)
const char * Get_Name(void)
void Init(const W3dHLodSubObjectStruct &w3d_data)
WWINLINE void Release_Ref(void) const
virtual float Get_Screen_Size(CameraClass &camera)
virtual void Set_Transform(const Matrix3D &m)
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
virtual int Is_Not_Hidden_At_All(void)
int Is_Sub_Objects_Match_LOD_Enabled(void)
virtual void Update_Obj_Space_Bounding_Volumes(void)
virtual const SphereClass & Get_Bounding_Sphere(void) const
AABoxClass CachedBoundingBox
virtual void Notify_Added(SceneClass *scene)
virtual void Update_Sub_Object_Transforms(void)
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
void Invalidate_Cached_Bounding_Volumes(void) const
virtual const AABoxClass & Get_Bounding_Box(void) const
virtual void Update_Sub_Object_Bits(void)
void Set_Sub_Object_Transforms_Dirty(bool onoff)
virtual const HTreeClass * Get_HTree(void) const
static const float AT_MAX_LOD
virtual int Class_ID(void) const
virtual void Set_Hidden(int onoff)
virtual bool Is_In_Scene(void)
bool Are_Sub_Object_Transforms_Dirty(void)
virtual void Set_LOD_Bias(float bias)
virtual void Notify_Removed(SceneClass *scene)
virtual void Set_Container(RenderObjClass *con)
virtual const char * Get_Name(void) const
const Matrix3D & Get_Transform(void) const
virtual int Get_Num_Sub_Objects(void) const
RenderObjClass * Get_Container(void) const
@ CLASSID_PARTICLEEMITTER
virtual RenderObjClass * Get_Sub_Object(int index) const
virtual void Set_Animation_Hidden(int onoff)
virtual int Remove_Sub_Object(RenderObjClass *robj)
SphereClass CachedBoundingSphere
virtual int Get_Sub_Object_Bone_Index(RenderObjClass *subobj) const
static const float AT_MIN_LOD
void Transform(const Matrix3D &tm)
void Add_Sphere(const SphereClass &s)
WWINLINE float Length(void) const
WWINLINE VectorClass(NoInitClass const &)
virtual RenderObjClass * Create_Render_Obj(const char *name)
static WW3DAssetManager * Get_Instance(void)
HLodLoaderClass _HLodLoader
#define REF_PTR_RELEASE(x)
#define REF_PTR_SET(dst, src)
char RenderObjName[2 *W3D_NAME_LEN]
char Name[W3D_NAME_LEN *2]