93 TriObject * tri = (TriObject *)obj->ConvertToType(
CurTime, triObjectClassID);
358 char *tilda = ::strchr(
Name,
'~');
359 memset(tilda,0,
sizeof(
Name) - ((
int)tilda - (
int)
Name));
479 memset(tmp,0,
sizeof(tmp));
486 strncpy(buffer,tmp,size);
572 while (i<tasks.
Count()) {
594 while (meshes.
Count() > 0) {
596 int cur_index = meshes.
Count() - 1;
604 simple_meshes.
Add(cur_mesh);
606 cur_mesh->
Split(simple_meshes);
619 while (i < simple_meshes.
Count()) {
621 if (simple_meshes[i]->Can_Combine()) {
624 while (j < simple_meshes.
Count()) {
625 if (simple_meshes[i]->Can_Combine_With(simple_meshes[j])) {
630 simple_meshes[i]->Combine_Mesh(simple_meshes[j]);
631 delete simple_meshes[j];
637 if (simple_meshes[i]->Can_Combine() ==
false) {
638 j = simple_meshes.
Count();
658 for (i=0; i<simple_meshes.
Count(); i++) {
660 simple_meshes[i]->Generate_Name(
"MESH",i,context);
667 for (i=0; i<simple_meshes.
Count(); i++) {
668 tasks.
Add(simple_meshes[i]);
699 strncpy(prefix,
Name,
sizeof(prefix));
702 char * interior_prefix = strchr(prefix,
'^');
703 char * exterior_prefix = strchr(prefix,
'#');
706 if (interior_prefix !=
NULL) {
707 strncpy(
Name,prefix,(
int)(interior_prefix - prefix) + 1);
708 }
else if (exterior_prefix !=
NULL) {
709 strncpy(
Name,prefix,(
int)(exterior_prefix - prefix) + 1);
717 sprintf(
Name + strlen(
Name),
"%04d",index);
745 Mtl * nodemtl =
Node->GetMtl();
750 if (nodemtl ==
NULL) {
754 }
else if (nodemtl->NumSubMtls() <= 1) {
762 int sub_mtl_count = nodemtl->NumSubMtls();
763 bool * sub_mtl_flags =
new bool[sub_mtl_count];
768 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
769 sub_mtl_flags[mat_index] =
false;
775 for (face_index=0; face_index<
MeshData.getNumFaces(); face_index++) {
776 int max_mat_index =
MeshData.faces[face_index].getMatID();
777 int mat_index = (max_mat_index % sub_mtl_count);
778 sub_mtl_flags[mat_index] =
true;
785 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
786 if (sub_mtl_flags[mat_index]) {
787 SingleMtl = nodemtl->GetSubMtl(mat_index);
800 Point3 boxmin(0,0,0);
801 Point3 boxmax(0,0,0);
806 for (
int i=0; i<
MeshData.numVerts; i++) {
817 boxmax += Point3(0.1f,0.1f,0.1f);
818 boxmin -= Point3(0.1f,0.1f,0.1f);
881 Mtl * nodemtl =
Node->GetMtl();
885 int sub_mtl_count = nodemtl->NumSubMtls();
886 bool * sub_mtl_flags =
new bool[sub_mtl_count];
891 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
892 sub_mtl_flags[mat_index] =
false;
898 for (face_index=0; face_index<
MeshData.getNumFaces(); face_index++) {
899 int max_mat_index =
MeshData.faces[face_index].getMatID();
900 int mat_index = (max_mat_index % sub_mtl_count);
901 sub_mtl_flags[mat_index] =
true;
907 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
908 if (sub_mtl_flags[mat_index]) {
913 simple_meshes.
Add(new_task);
938 int sub_mtl_count =
Node->GetMtl()->NumSubMtls();
940 BitArray faces_to_delete(
MeshData.getNumFaces());
941 BitArray verts_to_delete(
MeshData.getNumVerts());
943 faces_to_delete.ClearAll();
944 verts_to_delete.ClearAll();
946 for (
int i=0; i<
MeshData.getNumFaces(); i++) {
947 if ((
MeshData.faces[i].getMatID() % sub_mtl_count) != mat_id) {
948 faces_to_delete.Set(i,
true);
952 MeshData.DeleteFaceSet(faces_to_delete,&verts_to_delete);
953 MeshData.DeleteVertSet(verts_to_delete);
1019 if (other_mtl ==
NULL) {
1024 if (my_mtl != other_mtl) {
1047 float dist = ::FLength(my_center - other_center);
1081 int matid =
MeshData.faces[0].getMatID();
1082 if (
Node->GetMtl()->NumSubMtls() > 1) {
1083 matid = matid %
Node->GetMtl()->NumSubMtls();
1096 for (
int i=0; i<
MeshData.numFaces; i++) {
1104 Point3 normal(0,0,0);
1116 Point3 obj_pos = world_pos *
Inverse(tm);
1122 for (
int face_index = 0; face_index <
MeshData.numFaces; face_index ++) {
1123 Face &maxface =
MeshData.faces[face_index];
1124 int face_smgroup = maxface.getSmGroup();
1125 if ((face_smgroup & smgroup) || (face_smgroup == smgroup)) {
1132 for (
int vert_index = 0; (vert_index < 3) && !found; vert_index ++) {
1133 int max_vert_index = maxface.v[vert_index];
1134 Point3 delta = obj_pos -
MeshData.verts[max_vert_index];
1135 if ((fabs (delta.x) <
EPSILON) &&
1143 Point3 v0 =
MeshData.verts[maxface.v[0]];
1144 Point3 v1 =
MeshData.verts[maxface.v[1]];
1145 Point3 v2 =
MeshData.verts[maxface.v[2]];
1146 Point3 face_normal = (v1-v0)^(v2-v1);
1152 normal.x += face_normal.x;
1153 normal.y += face_normal.y;
1154 normal.z += face_normal.z;
1172 normal = tm.PointTransform(normal);
Real Normalize(Real valueToNormalize, Real minRange, Real maxRange)
virtual bool Is_Aggregate(void)
virtual int Get_Geometry_Type(void)
AggregateGeometryExportTaskClass(INode *node, GeometryExportContextClass &context)
virtual void Export_Geometry(GeometryExportContextClass &context)
CollisionBoxGeometryExportTaskClass(INode *node, GeometryExportContextClass &context)
virtual int Get_Geometry_Type(void)
virtual void Export_Geometry(GeometryExportContextClass &context)
int Write_To_File(ChunkSaveClass &csave)
virtual void Export_Geometry(GeometryExportContextClass &context)
virtual int Get_Geometry_Type(void)
DazzleGeometryExportTaskClass(INode *node, GeometryExportContextClass &context)
int Write_To_File(ChunkSaveClass &csave)
bool Delete(T const &object)
bool Add(T const &object)
HierarchySaveClass * HTree
unsigned int * materialColors
MaxWorldInfoClass & WorldInfo
Progress_Meter_Class * ProgressMeter
char * materialColorTexture
MW: number of used house colors.
INodeListClass * OriginList
W3dExportOptionsStruct & Options
int numHouseColors
MW: number of used material colors.
int numMaterialColors
MW: holds all used material colors.
INode * Get_Object_Node(void)
void Generate_Name(char *root, int index, GeometryExportContextClass &context)
GeometryExportTaskClass(INode *node, GeometryExportContextClass &context)
static GeometryExportTaskClass * Create_Task(INode *node, GeometryExportContextClass &context)
virtual bool Is_Proxy(void)
virtual int Get_Geometry_Type(void)=0
static void Optimize_Geometry(DynamicVectorClass< GeometryExportTaskClass * > &tasks, GeometryExportContextClass &context)
virtual bool Is_Aggregate(void)
void Get_Full_Name(char *buffer, int size)
virtual ~GeometryExportTaskClass(void)
char ContainerName[W3D_NAME_LEN]
void Get_Export_Coordinate_System(INode *node, int *set_bone_index, INode **set_bone_node, Matrix3 *set_transform)
virtual void Set_Current_Task(GeometryExportTaskClass *task)
virtual void Set_Export_Transform(const Matrix3 &matrix)
Mtl * Get_Single_Material(void)
virtual int Get_Geometry_Type(void)
void Split(DynamicVectorClass< MeshGeometryExportTaskClass * > &simple_meshes)
void Combine_Mesh(MeshGeometryExportTaskClass *other_mesh)
virtual void Export_Geometry(GeometryExportContextClass &context)
bool Can_Combine_With(MeshGeometryExportTaskClass *other_mesh)
W3DAppData2Struct ExportOptions
MeshGeometryExportTaskClass(const MeshGeometryExportTaskClass &that)
MeshGeometryExportTaskClass(INode *node, GeometryExportContextClass &context)
virtual Point3 Get_Shared_Vertex_Normal(const Point3 &pos, int smgroup)
bool Is_Single_Material(void)
void Update_Cached_Data(void)
void Reduce_To_Single_Material(int mat_id)
void Set_Name_Dirty(bool onoff)
virtual ~MeshGeometryExportTaskClass(void)
int Write_To_File(ChunkSaveClass &csave, bool export_aabtrees=false)
NullGeometryExportTaskClass(INode *node, GeometryExportContextClass &context)
virtual int Get_Geometry_Type(void)
virtual void Export_Geometry(GeometryExportContextClass &context)
virtual int Get_Geometry_Type(void)
virtual void Export_Geometry(GeometryExportContextClass &context)
virtual bool Is_Proxy(void)
ProxyExportTaskClass(INode *node, GeometryExportContextClass &context)
const int OPTIMIZATION_FACECOUNT_LIMIT
const float OPTIMIZATION_COMBINING_DISTANCE
WWINLINE Quaternion Inverse(const Quaternion &a)
static W3DAppData2Struct * Get_App_Data(INode *node, bool create_if_missing=true)
bool DisableExportAABTrees
int Get_Lod_Level(INode *node)
void Set_W3D_Name(char *set_name, const char *src)
bool Append_Lod_Character(char *meshname, int lod_level, INodeListClass *origin_list)
bool Is_Collision_OBBox(INode *node)
bool Is_Dazzle(INode *node)
bool Is_Geometry(INode *node)
bool Is_Normal_Mesh(INode *node)
bool Is_Camera_Oriented_Mesh(INode *node)
bool Is_Camera_Aligned_Mesh(INode *node)
bool Is_Skin(INode *node)
bool Is_Null_Object(INode *node)
bool Is_Collision_AABox(INode *node)