54#define DAZZLE_SETTINGS_FILENAME "dazzle.ini"
55#define DAZZLE_TYPES_SECTION "Dazzles_List"
56#define DAZZLE_SECTION_BUFFERSIZE 32767
59static BOOL CALLBACK _settings_form_dlg_proc(HWND hWnd,
UINT msg, WPARAM wParam, LPARAM lParam);
60static BOOL CALLBACK _w3d_utility_tools_dlg_proc(HWND hWnd,
UINT msg, WPARAM wParam, LPARAM lParam);
78 virtual void SetReference (
int i, RefTargetHandle rtarg);
79 RefResult
NotifyRefChanged (Interval changeInt,RefTargetHandle hTarget,PartID& partID, RefMessage message);
104 return (REF_SUCCEED);
132 void Disable_Controls(
void);
136 ISpinnerControl * RegionSpin;
325 return &W3DUtilityDesc;
352 _settings_form_dlg_proc,
359 _w3d_utility_tools_dlg_proc,
396 if (oncount == totalcount) {
460 for (
unsigned int ni=0; ni<list->
Num_Nodes(); ni++) {
538 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
547 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
556 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
565 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
574 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
583 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
592 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
601 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
610 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
619 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
628 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
637 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
646 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
655 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
664 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
673 for (
unsigned int ni=0; ni<node_list->
Num_Nodes(); ni++) {
685 for (
int i = 0; i < list->
Num_Nodes(); i++)
730 if (!node->Selected())
741 char *oldname = node->GetName();
742 char *ext = strrchr(oldname,
'.');
744 if ( (ext !=
NULL) && (sscanf(ext,
".%d", &old_lod) == 1) )
763 node->SetName(newname);
768 sprintf(
msg,
"The maximum W3D object name is %d characters. Adding the LOD "
769 "extension to \"%s\" will pass this limit! Please shorten its name.",
772 MessageBox(
NULL,
msg,
"Error", MB_OK);
785 node->SetName(newname);
789 sprintf(
msg,
"The maximum W3D object name is %d characters. Adding the LOD "
790 "extension to \"%s\" will pass this limit! Please shorten its name.",
792 MessageBox(
NULL,
msg,
"Error", MB_OK);
805 char *convertingmessage =
"Converting materials...";
814 assert (gamenodematerials !=
NULL);
818 SetCursor (LoadCursor (
NULL, IDC_WAIT));
824 SetCursor (LoadCursor (
NULL, IDC_WAIT));
829 if (gamenodematerials !=
NULL)
delete [] gamenodematerials;
834 int gamenodematerialindex = 0;
837 if (rootnode !=
NULL) {
840 if (meshlist !=
NULL) {
842 for (
unsigned nodeindex = 0; nodeindex < meshlist->
Num_Nodes(); nodeindex++) {
844 Mtl *nodemtl = ((*meshlist) [nodeindex])->GetMtl();
847 if (nodemtl !=
NULL) {
850 if (!nodemtl->IsMultiMtl()) {
852 switch (conversion) {
856 assert (((
GameMtl*) nodemtl)->Substitute_Material() ==
NULL);
865 gamenodematerials [gamenodematerialindex].MakeRefByID (
FOREVER, gamenodematerialindex, nodemtl);
868 if (((
GameMtl*) nodemtl)->Substitute_Material() ==
NULL) {
871 ((*meshlist) [nodeindex])->SetMtl (((
GameMtl*) nodemtl)->Substitute_Material());
882 if (gamenodematerials [gamenodematerialindex].MaterialPtr !=
NULL) {
883 ((*meshlist) [nodeindex])->SetMtl (gamenodematerials [gamenodematerialindex].MaterialPtr);
884 ((
GameMtl*) gamenodematerials [gamenodematerialindex].MaterialPtr)->Set_Substitute_Material (
NULL);
888 gamenodematerialindex++;
893 for (
int materialindex = 0; materialindex < nodemtl->NumSubMtls(); materialindex++) {
895 Mtl *submaterial = nodemtl->GetSubMtl (materialindex);
898 if (submaterial !=
NULL) {
900 switch (conversion) {
904 assert (((
GameMtl*) submaterial)->Substitute_Material() ==
NULL);
913 gamenodematerials [gamenodematerialindex].MakeRefByID (
FOREVER, gamenodematerialindex, submaterial);
916 if (((
GameMtl*) submaterial)->Substitute_Material() ==
NULL) {
919 nodemtl->SetSubMtl (materialindex, ((
GameMtl*) submaterial)->Substitute_Material());
930 if (gamenodematerials [gamenodematerialindex].MaterialPtr !=
NULL) {
931 nodemtl->SetSubMtl (materialindex, gamenodematerials [gamenodematerialindex].MaterialPtr);
932 ((
GameMtl*) gamenodematerials [gamenodematerialindex].MaterialPtr)->Set_Substitute_Material (
NULL);
936 gamenodematerialindex++;
948 return (gamenodematerialindex);
956 StdMat *stdmtl = NewDefaultStdMat();
962 stdmtl->SetName (gamemtl->GetName());
963 stdmtl->SetAmbient (gamemtl->
GetAmbient(), 0);
964 stdmtl->SetDiffuse (gamemtl->
GetDiffuse(), 0);
966 stdmtl->SetOpacity (gamemtl->
Get_Opacity (0, 0), 0);
968 stdmtl->SetShinStr (gamemtl->
GetShinStr(), 0);
969 stdmtl->SetSubTexmap (ID_DI, gamemtl->
Get_Texture (0, 0));
971 stdmtl->SetSelfIllum ((emissive.r + emissive.g + emissive.b) / 3.0f, 0);
1074 for (
int i=0; i<node->NumberOfChildren(); i++) {
1075 INode * child = node->GetChildNode(i);
1082 if (!node->IsHidden()) node->Hide(
TRUE);
1095 if (
Is_Bone(node) && !node->IsHidden()) {
1106 Mtl * nodemtl = node->GetMtl();
1137 if (nodemtl ==
NULL) {
1141 bool is_alpha =
false;
1142 if (nodemtl->IsMultiMtl()) {
1143 for (
int mi=0; mi<nodemtl->NumSubMtls(); mi++) {
1165 Object * obj = node->EvalWorldState(0).obj;
1166 TriObject * tri = (TriObject *)obj->ConvertToType(0, triObjectClassID);
1169 Mesh & mesh = tri->mesh;
1174 if (nodemtl ==
NULL) {
1178 }
else if (nodemtl->NumSubMtls() <= 1) {
1184 int sub_mtl_count = nodemtl->NumSubMtls();
1185 bool * sub_mtl_flags =
new bool[sub_mtl_count];
1188 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
1189 sub_mtl_flags[mat_index] =
false;
1193 for (face_index=0; face_index<mesh.getNumFaces(); face_index++) {
1194 int max_mat_index = mesh.faces[face_index].getMatID();
1195 int mat_index = (max_mat_index % sub_mtl_count);
1196 sub_mtl_flags[mat_index] =
true;
1200 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
1201 if (sub_mtl_flags[mat_index]) {
1214 TCHAR temp_string[256];
1216 if (
NameOptions.OnlyAffectSelected && !node->Selected()) {
1226 node->SetName(temp_string);
1231 _stprintf(temp_string,
"%s%s",
NameOptions.PrefixName,node->GetName());
1232 node->SetName(temp_string);
1236 _stprintf(temp_string,
"%s%s",node->GetName(),
NameOptions.SuffixName);
1237 node->SetName(temp_string);
1270 mtl->SetName(newname);
1274 if (mtl->IsMultiMtl()) {
1275 for (
int mi=0; mi<mtl->NumSubMtls(); mi++) {
1288 AppDataChunk * appdata = node->GetAppDataChunk(
W3DUtilityClassID,UTILITY_CLASS_ID,0);
1306 AppDataChunk * appdata = node->GetAppDataChunk(
W3DUtilityClassID,UTILITY_CLASS_ID,1);
1340static BOOL CALLBACK _w3d_utility_tools_dlg_proc(HWND hWnd,
UINT msg, WPARAM wParam, LPARAM lParam)
1344 case WM_LBUTTONDOWN:
1347 TheW3DUtility.InterfacePtr->RollupMouseMessage(hWnd,
msg,wParam,lParam);
1352 switch (LOWORD(wParam))
1358 TheW3DUtility.Select_Geometry();
1362 TheW3DUtility.Select_Hierarchy();
1366 TheW3DUtility.Select_Alpha();
1370 TheW3DUtility.Select_Physical();
1374 TheW3DUtility.Select_Projectile();
1378 TheW3DUtility.Select_Vis();
1382 TheW3DUtility.generate_names();
1383 TheW3DUtility.update_settings_controls();
1387 TheW3DUtility.generate_material_names();
1388 TheW3DUtility.update_settings_controls();
1392 TheW3DUtility.generate_lod_extensions();
1393 TheW3DUtility.update_settings_controls();
1397 TheW3DUtility.export_with_standard_materials();
1401 TheW3DUtility.create_floater();
1426BOOL CALLBACK _settings_form_dlg_proc(HWND hWnd,
UINT msg, WPARAM wParam, LPARAM lParam)
1428 if (
msg == WM_INITDIALOG) {
1430 ::SetProp(hWnd,
"SettingsFormClass",(HANDLE)form);
1441static void _settings_form_selection_changed_callback(
void * param,NotifyInfo * info)
1459 ::RegisterNotification(_settings_form_selection_changed_callback,
this, NOTIFY_SELECTIONSET_CHANGED);
1467 ::UnRegisterNotification(_settings_form_selection_changed_callback,
this, NOTIFY_SELECTIONSET_CHANGED);
1472 if (ActiveList ==
this) {
1479 while ((cur !=
this) && (cur !=
NULL)) {
1484 assert(cur ==
this);
1486 prev->Next = cur->Next;
1496 if (ActiveList ==
NULL) {
1504 ::GetCOREInterface()->GetTime(),
1511 while (form !=
NULL) {
1512 form->Update_Controls(&node_list);
1518void SettingsFormClass::Init(
void)
1523 assert(dazzle_combo !=
NULL);
1524 SendMessage(dazzle_combo,CB_RESETCONTENT,0,0);
1530 char dllpath[_MAX_PATH];
1531 ::GetModuleFileName(
AppInstance,dllpath,
sizeof(dllpath));
1532 char * last_slash = strrchr(dllpath,
'\\');
1542 char * entry = dazzle_types_buffer;
1543 if (entry !=
NULL) {
1544 while (*entry !=
NULL) {
1545 entry = strchr(entry,
'=');
1546 if (entry !=
NULL) {
1548 ::SendMessage(dazzle_combo,CB_ADDSTRING,0,(LPARAM)entry);
1549 entry += strlen(entry) + 1;
1553 ::SendMessage(dazzle_combo,CB_ADDSTRING,0,(LPARAM)
"Default");
1556 ::SendMessage(dazzle_combo,CB_SETCURSEL,(WPARAM)0,0);
1558 delete dazzle_types_buffer;
1563 RegionSpin = SetupIntSpinner
1573void SettingsFormClass::Destroy(
void)
1575 ReleaseISpinner(RegionSpin);
1599 int control_id = LOWORD(wParam);
1615 check = !SendDlgItemMessage(hWnd,LOWORD(wParam),BM_GETCHECK,0,0L);
1616 SendDlgItemMessage(hWnd,LOWORD(wParam),BM_SETCHECK,check,0L);
1620 ::GetCOREInterface()->GetTime(),
1624 switch (LOWORD(wParam))
1726 if (HIWORD(wParam) == CBN_SELCHANGE) {
1729 if (dazzle_combo !=
NULL) {
1731 char dazzle_type[128];
1732 int cursel = ::SendMessage(dazzle_combo,CB_GETCURSEL,0,0);
1733 int len = ::SendMessage(dazzle_combo,CB_GETLBTEXTLEN,cursel,0);
1735 ::SendMessage(dazzle_combo,CB_GETLBTEXT,(WPARAM)cursel,(LPARAM)dazzle_type);
1749 case CC_SPINNER_CHANGE:
1752 ::GetCOREInterface()->GetTime(),
1762 case WM_CUSTEDIT_ENTER:
1765 ::GetCOREInterface()->GetTime(),
1768 ICustEdit * edit_ctrl = GetICustEdit(GetDlgItem(hWnd,wParam));
1770 if (edit_ctrl && node_list.
Num_Nodes() == 1) {
1772 edit_ctrl->GetText(buffer,
sizeof(buffer));
1773 node_list[0]->SetName(buffer);
1777 ReleaseICustEdit(edit_ctrl);
1791 ::GetCOREInterface()->GetTime(),
1794 Update_Controls(&node_list);
1797void SettingsFormClass::Update_Controls(
INodeListClass * node_list)
1803 ICustEdit * edit_ctrl = GetICustEdit(GetDlgItem(Hwnd,
IDC_OBJ_NAME));
1804 if (edit_ctrl !=
NULL) {
1806 edit_ctrl->Enable(
FALSE);
1808 }
else if (node_list->
Num_Nodes() == 1) {
1809 edit_ctrl->Enable(
TRUE);
1810 edit_ctrl->SetText((*node_list)[0]->GetName());
1812 edit_ctrl->Enable(
FALSE);
1816 ReleaseICustEdit(edit_ctrl);
1824 W3DUtilityClass::NodeStatesStruct ns;
1910 BOOL spinner_enable =
false;
1916 RegionSpin->SetIndeterminate(
FALSE);
1922 RegionSpin->SetIndeterminate(
TRUE);
1925 spinner_enable =
true;
1935 bool dazzle_combo_enable =
false;
1938 dazzle_combo_enable =
true;
1942 EnableWindow(dazzle_combo,dazzle_combo_enable);
1943 int selindex = ::SendMessage(dazzle_combo,CB_FINDSTRING,(WPARAM)0,(LPARAM)ns.
DazzleType);
1944 if (selindex != CB_ERR) {
1945 ::SendMessage(dazzle_combo,CB_SETCURSEL,(WPARAM)selindex,(LPARAM)0);
1947 ::SendMessage(dazzle_combo,CB_SETCURSEL,(WPARAM)0,(LPARAM)0);
1964void SettingsFormClass::Disable_Controls(
void)
2031 return TheW3DUtility.get_app_data_0(node);
2036 return TheW3DUtility.get_app_data_1(node);
2041 return TheW3DUtility.get_app_data_2(node);
2046 return TheW3DUtility.get_dazzle_app_data(node);
@ W3DSHADER_DESTBLENDFUNC_SRC_ALPHA
@ W3DSHADER_SRCBLENDFUNC_ONE_MINUS_SRC_ALPHA
@ W3DSHADER_SRCBLENDFUNC_SRC_ALPHA
@ W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_ALPHA
@ W3DSHADER_ALPHATEST_ENABLE
int Get_Src_Blend(int pass)
float Get_Shininess(int pass, TimeValue t)
Color Get_Emissive(int pass, TimeValue t)
Color GetSpecular(int mtlNum=0, BOOL backFace=FALSE)
float Get_Opacity(int pass, TimeValue t)
Color GetDiffuse(int mtlNum=0, BOOL backFace=FALSE)
int Get_Alpha_Test(int pass)
Texmap * Get_Texture(int pass, int stage)
int Get_Dest_Blend(int pass)
float GetShinStr(int mtlNum=0, BOOL backFace=FALSE)
Color GetAmbient(int mtlNum=0, BOOL backFace=FALSE)
bool Get_Options(OptionsStruct *options)
bool Get_Options(OptionsStruct *options)
bool Get_Options(OptionsStruct *options)
unsigned Num_Nodes(void) const
virtual RefTargetHandle GetReference(int i)
~MaterialReferenceMaker()
static int ReferenceCount
virtual void SetReference(int i, RefTargetHandle rtarg)
RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, PartID &partID, RefMessage message)
const TCHAR * ClassName()
void * Create(BOOL loading=FALSE)
static void set_hierarchy_in_all_selected(INodeListClass *list, bool onoff)
static void eval_node_states(INodeListClass *node_list, NodeStatesStruct *ns)
static void enable_camera_collision_in_all_selected(INodeListClass *list, bool onoff)
static void enable_npatches_in_all_selected(INodeListClass *list, bool onoff)
void select_hierarchy_node(INode *node)
bool is_alpha_material(Mtl *nodemtl)
static void update_settings_controls(INodeListClass *node_list=NULL)
void EndEditParams(Interface *ip, IUtil *iu)
static W3DAppData2Struct * get_app_data_2(INode *node)
FloaterDialogClass SettingsFloater
void select_physical_node(INode *node)
StdMat * new_standard_material(GameMtl *gamemtl)
static void enable_vis_collision_in_all_selected(INodeListClass *list, bool onoff)
int convert_materials(MaterialConversionEnum conversion, MaterialReferenceMaker *gamenodematerials)
void generate_names(void)
static W3DAppData0Struct * get_app_data_0(INode *node)
void Select_Hierarchy(void)
void select_vis_node(INode *node)
static void enable_two_sided_in_all_selected(INodeListClass *list, bool onoff)
static int eval_tri_state(int totalcount, int oncount)
static void enable_hidden_in_all_selected(INodeListClass *list, bool onoff)
void SelectionSetChanged(Interface *ip, IUtil *iu)
static void enable_vertex_alpha_in_all_selected(INodeListClass *list, bool onoff)
static void set_geometry_type_in_all_selected(INodeListClass *list, int geotype)
void generate_material_names_for_node(INode *node)
static W3DAppData1Struct * get_app_data_1(INode *node)
void BeginEditParams(Interface *ip, IUtil *iu)
static void enable_shatterable_in_all_selected(INodeListClass *list, bool onoff)
void Select_Geometry(void)
void Select_Physical(void)
void generate_node_name(INode *node)
static void set_region_in_all_selected(INodeListClass *list, char region)
GenNamesDialogClass::OptionsStruct NameOptions
void generate_material_names(void)
GenLodExtensionDialogClass::OptionsStruct LodExtensionOptions
void select_alpha_node(INode *node)
static void set_dazzle_type_in_all_selected(INodeListClass *list, char *dazzletype)
static void set_geometry_in_all_selected(INodeListClass *list, bool onoff)
void hide_node(INode *node)
static void enable_znormals_in_all_selected(INodeListClass *list, bool onoff)
void descend_tree(INode *node, int action)
void generate_lod_extensions(void)
static void enable_shadow_in_all_selected(INodeListClass *list, bool onoff)
static W3DDazzleAppDataStruct * get_dazzle_app_data(INode *node)
GenMtlNamesDialogClass::OptionsStruct MtlNameOptions
void create_floater(void)
static void enable_vehicle_collision_in_all_selected(INodeListClass *list, bool onoff)
static void enable_physical_collision_in_all_selected(INodeListClass *list, bool onoff)
void select_projectile_node(INode *node)
void export_with_standard_materials()
void Select_Projectile(void)
bool is_alpha_mesh(INode *node, Mtl *nodemtl)
void select_geometry_node(INode *node)
void generate_lod_ext(INode *node)
static void enable_projectile_collision_in_all_selected(INodeListClass *list, bool onoff)
TCHAR * Get_String(int id)
Class_ID GameMaterialClassID
void Enable_Export_Transform(bool onoff)
int Get_Geometry_Type(void) const
void Enable_Projectile_Collision(bool onoff)
void Enable_Export_Geometry(bool onoff)
void Enable_Two_Sided(bool onoff)
void Enable_Camera_Collision(bool onoff)
void Set_Geometry_Type(GeometryTypeEnum type)
bool Is_Physical_Collision_Enabled(void) const
bool Is_Vertex_Alpha_Enabled(void) const
void Enable_Vehicle_Collision(bool onoff)
void Enable_NPatchable(bool onoff)
bool Is_NPatchable_Enabled(void) const
void Enable_Vis_Collision(bool onoff)
bool Is_Geometry(void) const
static W3DAppData2Struct * Get_App_Data(INode *node, bool create_if_missing=true)
void Enable_Physical_Collision(bool onoff)
void Enable_Shadow(bool onoff)
bool Is_ZNormals_Enabled(void) const
bool Is_Vis_Collision_Enabled(void) const
bool Is_Two_Sided_Enabled(void) const
bool Is_Hidden_Enabled(void) const
bool Is_Shatterable_Enabled(void) const
void Enable_Shatterable(bool onoff)
void Enable_ZNormals(bool onoff)
void Enable_Hidden(bool onoff)
bool Is_Camera_Collision_Enabled(void) const
@ GEO_TYPE_CAMERA_ORIENTED
@ GEO_TYPE_CAMERA_ALIGNED
void Enable_Vertex_Alpha(bool onoff)
bool Is_Vehicle_Collision_Enabled(void) const
bool Is_Shadow_Enabled(void) const
bool Is_Projectile_Collision_Enabled(void) const
static W3DDazzleAppDataStruct * Get_App_Data(INode *node, bool create_if_missing=true)
bool GeometryCameraAligned
bool GeometryCameraOriented
bool Is_Geometry(INode *node)
bool Is_Projectile_Collision(INode *node)
bool Is_Vis_Collision(INode *node)
bool Is_Bone(INode *node)
bool Is_Physical_Collision(INode *node)
#define MAX_DAMAGE_REGIONS
W3DAppData1Struct * GetW3DAppData1(INode *node)
W3DAppData2Struct * GetW3DAppData2(INode *node)
ClassDesc * Get_W3D_Utility_Desc(void)
W3DDazzleAppDataStruct * GetW3DDazzleAppData(INode *node)
W3DAppData0Struct * GetW3DAppData0(INode *node)
#define DAZZLE_TYPES_SECTION
#define DAZZLE_SETTINGS_FILENAME
#define DAZZLE_SECTION_BUFFERSIZE
#define W3DUtilityClassID