From d952c59a3904c4b7129de07bbc8f5aa51c377954 Mon Sep 17 00:00:00 2001 From: Tazpn <tazpn@users.sourceforge.net> Date: Sat, 16 Dec 2006 19:26:31 +0000 Subject: [PATCH] 1. Partial work on collision rewrite. 2. Partial work on multi-material mesh import --- NifCommon/NifVersion.h | 4 +- NifExport/Coll.cpp | 40 +- NifExport/Exporter.cpp | 22 +- NifExport/Exporter.h | 6 +- NifExport/Util.cpp | 6 +- NifPlugins/DllEntry.cpp | 6 +- NifPlugins_VC80.vcproj | 8 +- NifProps/NifProps.rc | 634 ++++++++++++++-------- NifProps/bhkBoxObj.cpp | 811 +++++++++++++++++++++++++++++ NifProps/bhkCapsuleObj.cpp | 607 ++++++--------------- NifProps/bhkRigidBodyInterface.cpp | 50 +- NifProps/bhkRigidBodyInterface.h | 16 +- NifProps/bhkRigidBodyModifer.cpp | 763 +++++++++++++++++++++++++++ NifProps/bhkSphereObj.cpp | 413 ++++++--------- NifProps/resource.h | 89 +++- 15 files changed, 2483 insertions(+), 992 deletions(-) create mode 100644 NifProps/bhkBoxObj.cpp create mode 100644 NifProps/bhkRigidBodyModifer.cpp diff --git a/NifCommon/NifVersion.h b/NifCommon/NifVersion.h index 4f05d36..6fb3d1c 100644 --- a/NifCommon/NifVersion.h +++ b/NifCommon/NifVersion.h @@ -18,10 +18,10 @@ HISTORY: */ #define VERSION_MAJOR_INT 0 #define VERSION_MINOR_INT 2 -#define VERSION_BUILD_INT 10 +#define VERSION_BUILD_INT 11 #define VERSION_PATCH_INT 0 -#define VERSION_STRING "0, 2, 10, 0" +#define VERSION_STRING "0, 2, 11, 0" //#define DEF_VERSION_STRING(a,b,c,d) #a ", " #b ", " #c ", " #d //#define VERSION_STRING DEF_VERSION_STRING(a,b,c,d) diff --git a/NifExport/Coll.cpp b/NifExport/Coll.cpp index 5503d20..8281c68 100755 --- a/NifExport/Coll.cpp +++ b/NifExport/Coll.cpp @@ -1,4 +1,5 @@ #include "pch.h" +#include "../NifProps/bhkRigidBodyInterface.h" #ifdef _DEBUG #include <assert.h> @@ -9,6 +10,7 @@ #endif static Class_ID SCUBA_CLASS_ID(0x6d3d77ac, 0x79c939a9); +static Class_ID BHKRIGIDBODYMODIFIER_CLASS_ID(0x398fd801, 0x303e44e5); enum { @@ -252,7 +254,8 @@ Exporter::Result Exporter::exportCollision(NiNodeRef &parent, INode *node) ProgressUpdate(Collision, FormatText("'%s' Collision", node->GetName())); // marked as collision? - bool coll = npIsCollision(node); + //bool coll = npIsCollision(node); + bool coll = (mCollisionNodes.find(node) != mCollisionNodes.end()); bool local = !mFlattenHierarchy; NiNodeRef nodeParent = mFlattenHierarchy ? mNiRoot : parent; @@ -482,3 +485,38 @@ bhkSphereRepShapeRef Exporter::makeTriStripsShape(INode *node, const Matrix3& tm return bhkSphereRepShapeRef(DynamicCast<bhkSphereRepShape>(shape)); } + + +Exporter::Result Exporter::scanForCollision(INode *node) +{ + if (NULL == node) + return Exporter::Skip; + // Get the bhk RigidBody modifier if available and then get the picked node. + if (Modifier * mod = GetbhkCollisionModifier(node)){ + if (IParamBlock2* pblock = (IParamBlock2*)mod->GetReference(0)) { + if (INode *collMesh = pblock->GetINode(0, 0)) { + mCollisionNodes.insert(collMesh); + } else { + if (mSceneCollisionNode != NULL) { + if (mExportCollision) { + throw runtime_error("There are more than one Collision mesh found at the Scene Level."); + } + } else { + mSceneCollisionNode = node; + } + } + } + } + // Check self to see if is one of our bhkXXXObject classes + if (Object* obj = node->GetObjectRef()) + { + if (obj->SuperClassID() == HELPER_CLASS_ID && + obj->ClassID().PartB() == BHKRIGIDBODYCLASS_DESC.PartB()) { + mCollisionNodes.insert(node); + } + } + for (int i=0; i<node->NumberOfChildren(); i++) { + scanForCollision(node->GetChildNode(i)); + } + return Exporter::Ok; +} diff --git a/NifExport/Exporter.cpp b/NifExport/Exporter.cpp index 18e18e9..e7fe0de 100755 --- a/NifExport/Exporter.cpp +++ b/NifExport/Exporter.cpp @@ -57,7 +57,7 @@ static bool IsNodeOrParentSelected(INode *node) { } Exporter::Exporter(Interface *i, AppSettings *appSettings) - : mI(i), mAppSettings(appSettings) + : mI(i), mAppSettings(appSettings), mSceneCollisionNode(NULL) { memset(progressCounters, 0, sizeof(progressCounters)); memset(progressMax, 0, sizeof(progressMax)); @@ -111,6 +111,9 @@ Exporter::Result Exporter::doExport(NiNodeRef &root, INode *node) exportUPB(root, node); } + // Always Scan for Collision Nodes first + scanForCollision(node); + mNiRoot = root; if (mSelectedOnly) { int count = 0; @@ -137,11 +140,11 @@ Exporter::Result Exporter::doExport(NiNodeRef &root, INode *node) Result result = exportNodes(root, selectedRoots[i]); if (result != Ok && result != Skip) return result; - if (mExportCollision) { - result = exportCollision(root, selectedRoots[i]); - if (result != Ok) - return result; - } + //if (mExportCollision) { + // result = exportCollision(root, selectedRoots[i]); + // if (result != Ok) + // return result; + //} } // Always Zero out root transforms vector<NiAVObjectRef> children = root->GetChildren(); @@ -223,10 +226,13 @@ Exporter::Result Exporter::doExport(NiNodeRef &root, INode *node) Exporter::Result Exporter::exportNodes(NiNodeRef &parent, INode *node) { TSTR nodeName = node->GetName(); - bool coll = npIsCollision(node); + //bool coll = npIsCollision(node); + bool coll = (mCollisionNodes.find(node) != mCollisionNodes.end()); ProgressUpdate(Geometry, FormatText("'%s' Geometry", nodeName.data())); - if (coll || (node->IsHidden() && !mExportHidden && !coll)) + + // Abort if is a collision node or is hidden and we are not exporting hidden + if (coll || (node->IsHidden() && !mExportHidden)) return Skip; bool local = !mFlattenHierarchy; diff --git a/NifExport/Exporter.h b/NifExport/Exporter.h index 3b407d9..22ccee5 100755 --- a/NifExport/Exporter.h +++ b/NifExport/Exporter.h @@ -139,14 +139,17 @@ public: // maps face groups to material ID typedef std::map<int, FaceGroup> FaceGroups; + typedef std::set<INode*> INodeMap; typedef std::map<string, NiNodeRef> NodeMap; - typedef std::list<NiCallback*> CallbackList; + typedef std::list<NiCallback*> CallbackList; typedef std::list<Ref<NiNode> > NodeList; Interface *mI; NiNodeRef mNiRoot; AppSettings *mAppSettings; NodeMap mNodeMap; + INodeMap mCollisionNodes; + INode* mSceneCollisionNode; CallbackList mPostExportCallbacks; bool mIsBethesda; Box3 mBoundingBox; @@ -154,6 +157,7 @@ public: Result exportNodes(NiNodeRef &root, INode *node); Result exportCollision(NiNodeRef &root, INode *node); + Result scanForCollision(INode *node); /* utility functions */ Mtl *getMaterial(INode *node, int subMtl); diff --git a/NifExport/Util.cpp b/NifExport/Util.cpp index d45b427..6f98c6f 100755 --- a/NifExport/Util.cpp +++ b/NifExport/Util.cpp @@ -145,7 +145,8 @@ bool Exporter::isCollisionGroup(INode *maxNode, bool root) return false; } else { - if (npIsCollision(maxNode)) + if (mCollisionNodes.find(maxNode) != mCollisionNodes.end()) + //if (npIsCollision(maxNode)) return true; } @@ -166,7 +167,8 @@ bool Exporter::isMeshGroup(INode *maxNode, bool root) return false; } else { - if (!npIsCollision(maxNode)) + if (mCollisionNodes.find(maxNode) == mCollisionNodes.end()) + //if (!npIsCollision(maxNode)) { TimeValue t = 0; ObjectState os = maxNode->EvalWorldState(t); diff --git a/NifPlugins/DllEntry.cpp b/NifPlugins/DllEntry.cpp index 5cabc3a..3beef10 100644 --- a/NifPlugins/DllEntry.cpp +++ b/NifPlugins/DllEntry.cpp @@ -18,8 +18,8 @@ extern ClassDesc2* GetNifFurnitureDesc(); extern ClassDesc2* GetKfExportDesc(); extern ClassDesc2* GetbhkSphereDesc(); extern ClassDesc2* GetbhkCapsuleDesc(); -//extern ClassDesc2* GetbhkRigidBodyModifierDesc(); -//extern ClassDesc2* GetbhkBoxDesc(); +extern ClassDesc2* GetbhkRigidBodyModifierDesc(); +extern ClassDesc2* GetbhkBoxDesc(); enum ClassDescType { @@ -94,7 +94,7 @@ void InitializeLibSettings() } if ( GetIniValue<bool>("NifProps", "Enable", true, iniName) ) { classDescEnabled[CD_Props] = true; - classDescriptions[nClasses++] = GetNifPropsDesc(); + //classDescriptions[nClasses++] = GetNifPropsDesc(); #ifdef USE_UNSUPPORTED_CODE classDescriptions[nClasses++] = GetbhkRigidBodyModifierDesc(); classDescriptions[nClasses++] = GetbhkSphereDesc(); diff --git a/NifPlugins_VC80.vcproj b/NifPlugins_VC80.vcproj index 90fa3b6..0de9f6b 100644 --- a/NifPlugins_VC80.vcproj +++ b/NifPlugins_VC80.vcproj @@ -1075,6 +1075,10 @@ <Filter Name="Source Files" > + <File + RelativePath=".\NifProps\bhkBoxObj.cpp" + > + </File> <File RelativePath=".\NifProps\bhkCapsuleObj.cpp" > @@ -1084,11 +1088,11 @@ > </File> <File - RelativePath=".\NifProps\bhkSphereObj.cpp" + RelativePath=".\NifProps\bhkRigidBodyModifer.cpp" > </File> <File - RelativePath=".\NifProps\NifProps.cpp" + RelativePath=".\NifProps\bhkSphereObj.cpp" > </File> </Filter> diff --git a/NifProps/NifProps.rc b/NifProps/NifProps.rc index d01af50..3b4fc56 100755 --- a/NifProps/NifProps.rc +++ b/NifProps/NifProps.rc @@ -35,7 +35,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN 3 TEXTINCLUDE BEGIN - "\r\n" + "\r\0" END #endif // APSTUDIO_INVOKED @@ -72,7 +72,7 @@ BEGIN "#define DLLNAME ""NifProps.dlu"" // DLL Name\r\n" "#define DLLDESCRIPTION ""3ds Max Nif Reactor Properites Plugin""\r\n" "#include ""..\\nifcommon\\nifversion.rc"" \r\n" - "#endif\r\n" + "#endif\r\0" END #endif // APSTUDIO_INVOKED @@ -83,56 +83,50 @@ END // Dialog // -IDD_PANEL DIALOGEX 0, 0, 107, 360 +IDD_PANEL DIALOGEX 0, 0, 112, 333 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - COMBOBOX IDC_CB_MATERIAL,12,58,83,157,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP - CONTROL "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,50,83,8 - COMBOBOX IDC_CB_LAYER,12,82,83,171,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP - CONTROL "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,74,83,8 - GROUPBOX "Havok",IDC_GRP_HAVOK,5,39,95,285,WS_DISABLED - GROUPBOX "Object",IDC_GRP_OBJECT,5,5,95,32 + GROUPBOX "Object",IDC_GRP_OBJECT,10,5,95,46 CONTROL "Is Collision Mesh",IDC_CHK_ISCOLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,18,80,10 - CONTROL "Center",IDC_LBL_CENTER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,98,31,8 - CONTROL "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_DISABLED | WS_GROUP,12,124,28,8 - CONTROL "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_DISABLED | WS_GROUP,42,124,28,8 - LTEXT "Resti-\r\ntution",IDC_LBL_RESTITUTION,70,124,24,15,WS_DISABLED - CONTROL "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,263,67,8 - COMBOBOX IDC_CB_MOTION_SYSTEM,12,273,83,74,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP - CONTROL "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,289,43,8 - COMBOBOX IDC_CB_QUALITY_TYPE,12,298,83,63,CBS_DROPDOWN | WS_DISABLED | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_ED_CENTER_X,"CustEdit",WS_DISABLED | WS_TABSTOP,12,109,20,10 - CONTROL "",IDC_SP_CENTER_X,"SpinnerControl",WS_DISABLED,30,109,7,10 - CONTROL "",IDC_ED_CENTER_Y,"CustEdit",WS_DISABLED | WS_TABSTOP,42,109,20,10 - CONTROL "",IDC_SP_CENTER_Y,"SpinnerControl",WS_DISABLED,60,109,7,10 - CONTROL "",IDC_ED_CENTER_Z,"CustEdit",WS_DISABLED | WS_TABSTOP,72,109,20,10 - CONTROL "",IDC_SP_CENTER_Z,"SpinnerControl",WS_DISABLED,92,109,7,10 - CONTROL "",IDC_ED_MASS,"CustEdit",WS_DISABLED | WS_TABSTOP,12,143,20,10 - CONTROL "",IDC_SP_MASS,"SpinnerControl",WS_DISABLED,30,143,7,10 - CONTROL "",IDC_ED_FRICTION,"CustEdit",WS_DISABLED | WS_TABSTOP,42,143,20,10 - CONTROL "",IDC_SP_FRICTION,"SpinnerControl",WS_DISABLED,60,143,7,10 - CONTROL "",IDC_ED_RESTITUTION,"CustEdit",WS_DISABLED | WS_TABSTOP,70,143,20,10 - CONTROL "",IDC_SP_RESTITUTION,"SpinnerControl",WS_DISABLED,90,143,7,10 - LTEXT "Linear\r\nDamping",IDC_LBL_LINEAR_DAMPING,12,159,30,17,WS_DISABLED - CONTROL "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_DISABLED | WS_TABSTOP,12,178,35,10 - CONTROL "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",WS_DISABLED,45,178,7,10 - LTEXT "Angular\r\nDamping",IDC_LBL_ANGULAR_DAMPING,55,159,45,17,WS_DISABLED - CONTROL "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_DISABLED | WS_TABSTOP,55,178,35,10 - CONTROL "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",WS_DISABLED,90,178,7,10 - LTEXT "Max. Linear\r\nVelocity",IDC_LBL_MAX_LINEAR_VELOCITY,12,194,40,16,WS_DISABLED - CONTROL "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_DISABLED | WS_TABSTOP,12,214,35,10 - CONTROL "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",WS_DISABLED,45,214,7,10 - LTEXT "Max. Angular\r\nVelocity",IDC_LBL_MAX_ANGULAR_VELOCITY,55,194,45,16,WS_DISABLED - CONTROL "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_DISABLED | WS_TABSTOP,55,214,35,10 - CONTROL "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",WS_DISABLED,90,214,7,10 - LTEXT "Penetration\r\nDepth",IDC_LBL_PENETRATION_DEPTH,12,229,40,16,WS_DISABLED - CONTROL "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_DISABLED | WS_TABSTOP,12,249,35,10 - CONTROL "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",WS_DISABLED,45,249,7,10 - GROUPBOX "Animation",IDC_GRP_ANIMATION,7,325,95,28 - LTEXT "Priority:",IDC_STATIC,10,338,24,8 - CONTROL "",IDC_ED_ANIM_PRIORITY,"CustEdit",WS_DISABLED | WS_TABSTOP,39,337,20,10 - CONTROL "",IDC_SP_ANIM_PRIORITY,"SpinnerControl",WS_DISABLED,57,337,7,10 + GROUPBOX "Animation",IDC_GRP_ANIMATION,7,290,95,28 + LTEXT "Priority:",IDC_STATIC,10,304,24,8 + CONTROL "",IDC_ED_ANIM_PRIORITY,"CustEdit",WS_DISABLED | WS_TABSTOP,39,303,20,10 + CONTROL "",IDC_SP_ANIM_PRIORITY,"SpinnerControl",WS_DISABLED,60,303,7,10 + COMBOBOX IDC_CB_MATERIAL,13,77,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,69,83,8 + COMBOBOX IDC_CB_LAYER,13,101,83,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,92,83,8 + GROUPBOX "Rigid Body",IDC_GRP_HAVOK,7,58,98,230 + CONTROL "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,13,118,56,8 + CONTROL "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,13,131,56,8 + LTEXT "Restitution",IDC_LBL_RESTITUTION,13,142,56,11 + CONTROL "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,238,67,8 + COMBOBOX IDC_CB_MOTION_SYSTEM,13,247,83,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,263,43,8 + COMBOBOX IDC_CB_QUALITY_TYPE,13,272,83,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_ED_MASS,"CustEdit",WS_TABSTOP,71,118,22,10 + CONTROL "",IDC_SP_MASS,"SpinnerControl",0x0,93,118,7,10 + CONTROL "",IDC_ED_FRICTION,"CustEdit",WS_TABSTOP,71,130,22,10 + CONTROL "",IDC_SP_FRICTION,"SpinnerControl",0x0,93,130,7,10 + CONTROL "",IDC_ED_RESTITUTION,"CustEdit",WS_TABSTOP,71,142,22,10 + CONTROL "",IDC_SP_RESTITUTION,"SpinnerControl",0x0,93,142,7,10 + LTEXT "Linear Damping",IDC_LBL_LINEAR_DAMPING,13,155,56,11 + CONTROL "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_TABSTOP,71,155,22,10 + CONTROL "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",0x0,93,155,7,10 + LTEXT "Angular Damping",IDC_LBL_ANGULAR_DAMPING,13,167,56,10 + CONTROL "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_TABSTOP,71,167,22,10 + CONTROL "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",0x0,93,167,7,10 + LTEXT "Max. Linear Velocity",IDC_LBL_MAX_LINEAR_VELOCITY,13,179,56,16 + CONTROL "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_TABSTOP,71,183,22,10 + CONTROL "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",0x0,93,183,7,10 + LTEXT "Max. Angular Velocity",IDC_LBL_MAX_ANGULAR_VELOCITY,13,198,56,16 + CONTROL "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_TABSTOP,71,202,22,10 + CONTROL "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",0x0,93,202,7,10 + LTEXT "Penetration Depth",IDC_LBL_PENETRATION_DEPTH,13,217,56,16 + CONTROL "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_TABSTOP,71,221,22,10 + CONTROL "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",0x0,93,221,7,10 + PUSHBUTTON "<None>",IDC_PICK_NODE,29,33,54,13 END IDD_ANIM_PANEL DIALOGEX 0, 0, 107, 41 @@ -145,82 +139,133 @@ BEGIN CONTROL "",IDC_SP_ANIM_PRIORITY,"SpinnerControl",WS_DISABLED,55,17,7,10 END -IDD_SPHEREPARAM2 DIALOGEX 0, 0, 108, 51 +IDD_SPHEREPARAM2 DIALOGEX 0, 0, 107, 74 +STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + CONTROL "",IDC_RADIUS,"CustEdit",WS_TABSTOP,49,31,36,10 + CONTROL "",IDC_SEGMENTS,"CustEdit",WS_TABSTOP,49,44,36,10 + CONTROL "Smooth",IDC_OBSMOOTH,"Button",BS_AUTOCHECKBOX,49,59,36,10 + RTEXT "Radius:",-1,22,32,25,8 + RTEXT "Segments:",-1,11,44,36,8 + CONTROL "",IDC_SEGSPINNER,"SpinnerControl",0x0,87,44,7,10 + CONTROL "",IDC_RADSPINNER,"SpinnerControl",0x0,87,31,7,10 + COMBOBOX IDC_CB_MATERIAL,12,13,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,4,83,8 +END + +IDD_RIGIDBODY DIALOGEX 0, 0, 107, 216 +STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + COMBOBOX IDC_CB_LAYER,9,22,83,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,13,83,8 + GROUPBOX "Rigid Body",IDC_GRP_HAVOK,4,3,98,208 + CONTROL "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,39,56,8 + CONTROL "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,52,56,8 + LTEXT "Restitution",IDC_LBL_RESTITUTION,9,63,56,11 + CONTROL "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,159,67,8 + COMBOBOX IDC_CB_MOTION_SYSTEM,9,168,83,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,184,43,8 + COMBOBOX IDC_CB_QUALITY_TYPE,9,193,83,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_ED_MASS,"CustEdit",WS_TABSTOP,67,39,22,10 + CONTROL "",IDC_SP_MASS,"SpinnerControl",0x0,90,39,7,10 + CONTROL "",IDC_ED_FRICTION,"CustEdit",WS_TABSTOP,67,51,22,10 + CONTROL "",IDC_SP_FRICTION,"SpinnerControl",0x0,90,51,7,10 + CONTROL "",IDC_ED_RESTITUTION,"CustEdit",WS_TABSTOP,67,63,22,10 + CONTROL "",IDC_SP_RESTITUTION,"SpinnerControl",0x0,90,63,7,10 + LTEXT "Linear Damping",IDC_LBL_LINEAR_DAMPING,9,76,56,11 + CONTROL "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_TABSTOP,67,76,22,10 + CONTROL "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",0x0,90,76,7,10 + LTEXT "Angular Damping",IDC_LBL_ANGULAR_DAMPING,9,88,56,10 + CONTROL "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_TABSTOP,67,88,22,10 + CONTROL "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",0x0,90,88,7,10 + LTEXT "Max. Linear Velocity",IDC_LBL_MAX_LINEAR_VELOCITY,9,100,56,16 + CONTROL "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_TABSTOP,67,104,22,10 + CONTROL "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",0x0,90,104,7,10 + LTEXT "Max. Angular Velocity",IDC_LBL_MAX_ANGULAR_VELOCITY,9,119,56,16 + CONTROL "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_TABSTOP,67,123,22,10 + CONTROL "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",0x0,90,123,7,10 + LTEXT "Penetration Depth",IDC_LBL_PENETRATION_DEPTH,9,138,56,16 + CONTROL "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_TABSTOP,67,142,22,10 + CONTROL "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",0x0,90,142,7,10 +END + +IDD_CAPSULEPARAM DIALOGEX 0, 0, 112, 74 STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - CONTROL "",IDC_RADIUS,"CustEdit",WS_TABSTOP,49,8,36,10 - CONTROL "",IDC_SEGMENTS,"CustEdit",WS_TABSTOP,49,21,36,10 - CONTROL "Smooth",IDC_OBSMOOTH,"Button",BS_AUTOCHECKBOX,49,36,36,10 - RTEXT "Radius:",-1,22,9,25,8 - RTEXT "Segments:",-1,11,21,36,8 - CONTROL "",IDC_SEGSPINNER,"SpinnerControl",0x0,87,21,7,10 - CONTROL "",IDC_RADSPINNER,"SpinnerControl",0x0,87,8,7,10 + CONTROL "",IDC_RADIUS1,"CustEdit",WS_TABSTOP,49,31,36,10 + RTEXT "Radius 1:",IDC_STATIC,15,32,31,8 + CONTROL "",IDC_RADSPINNER1,"SpinnerControl",0x0,87,31,7,10 + CONTROL "",IDC_RADIUS2,"CustEdit",WS_TABSTOP,49,44,36,10 + RTEXT "Radius 2:",IDC_STATIC,15,44,31,8 + CONTROL "",IDC_RADSPINNER2,"SpinnerControl",0x0,87,44,7,10 + CONTROL "",IDC_LENGTHEDIT,"CustEdit",WS_TABSTOP,50,56,36,10 + CONTROL "",IDC_LENSPINNER,"SpinnerControl",0x0,87,56,7,10 + RTEXT "Length:",IDC_STATIC,24,56,25,8 + COMBOBOX IDC_CB_MATERIAL,12,13,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,4,83,8 END -IDD_RigidBody DIALOGEX 0, 0, 107, 238 +IDD_RB_MOD_PANEL DIALOGEX 0, 0, 107, 76 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - COMBOBOX IDC_CB_MATERIAL,9,22,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,14,83,8 - COMBOBOX IDC_CB_LAYER,9,46,83,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,37,83,8 - GROUPBOX "Rigid Body",IDC_GRP_HAVOK,4,3,98,230 - CONTROL "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,63,56,8 - CONTROL "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,76,56,8 - LTEXT "Restitution",IDC_LBL_RESTITUTION,9,87,56,11 - CONTROL "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,183,67,8 - COMBOBOX IDC_CB_MOTION_SYSTEM,9,192,83,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,208,43,8 - COMBOBOX IDC_CB_QUALITY_TYPE,9,217,83,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - CONTROL "",IDC_ED_MASS,"CustEdit",WS_TABSTOP,67,63,22,10 - CONTROL "",IDC_SP_MASS,"SpinnerControl",0x0,90,63,7,10 - CONTROL "",IDC_ED_FRICTION,"CustEdit",WS_TABSTOP,67,75,22,10 - CONTROL "",IDC_SP_FRICTION,"SpinnerControl",0x0,90,75,7,10 - CONTROL "",IDC_ED_RESTITUTION,"CustEdit",WS_TABSTOP,67,87,22,10 - CONTROL "",IDC_SP_RESTITUTION,"SpinnerControl",0x0,90,87,7,10 - LTEXT "Linear Damping",IDC_LBL_LINEAR_DAMPING,9,100,56,11 - CONTROL "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_TABSTOP,67,100,22,10 - CONTROL "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",0x0,90,100,7,10 - LTEXT "Angular Damping",IDC_LBL_ANGULAR_DAMPING,9,112,56,10 - CONTROL "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_TABSTOP,67,112,22,10 - CONTROL "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",0x0,90,112,7,10 - LTEXT "Max. Linear Velocity",IDC_LBL_MAX_LINEAR_VELOCITY,9,124,56,16 - CONTROL "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_TABSTOP,67,128,22,10 - CONTROL "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",0x0,90,128,7,10 - LTEXT "Max. Angular Velocity",IDC_LBL_MAX_ANGULAR_VELOCITY,9,143,56,16 - CONTROL "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_TABSTOP,67,147,22,10 - CONTROL "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",0x0,90,147,7,10 - LTEXT "Penetration Depth",IDC_LBL_PENETRATION_DEPTH,9,162,56,16 - CONTROL "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_TABSTOP,67,166,22,10 - CONTROL "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",0x0,90,166,7,10 + CONTROL "No Collision",IDC_RDO_NO_COLL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,9,10,82,10 + CONTROL "Axis Aligned Box",IDC_RDO_AXIS_ALIGNED_BOX,"Button",BS_AUTORADIOBUTTON,9,22,82,10 + CONTROL "Sphere",IDC_RDO_SPHERE,"Button",BS_AUTORADIOBUTTON,9,34,80,10 + GROUPBOX "Bounding Volume",IDC_STATIC,5,0,97,73 + CONTROL "Capsule",IDC_RDO_CAPSULE,"Button",BS_AUTORADIOBUTTON,9,46,80,10 + CONTROL "Proxy Mesh",IDC_RDO_PROXY_MESH,"Button",BS_AUTORADIOBUTTON,9,58,80,10 END -IDD_CAPSULEPARAM DIALOGEX 0, 0, 112, 86 +IDD_BOXPARAM1 DIALOGEX 0, 0, 107, 71 STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - CONTROL "",IDC_RADIUS1,"CustEdit",WS_TABSTOP,49,5,36,10 - RTEXT "Radius 1:",-1,15,6,31,8 - CONTROL "",IDC_RADSPINNER1,"SpinnerControl",0x0,87,5,7,10 - CONTROL "",IDC_RADIUS2,"CustEdit",WS_TABSTOP,49,18,36,10 - RTEXT "Radius 2:",-1,15,18,31,8 - CONTROL "",IDC_RADSPINNER2,"SpinnerControl",0x0,87,18,7,10 - CONTROL "Cap Pos 1:",IDC_LBL_POS1,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,31,39,8 - CONTROL "",IDC_ED_POS1_X,"CustEdit",WS_TABSTOP,7,42,20,10 - CONTROL "",IDC_SP_POS1_X,"SpinnerControl",0x0,28,42,7,10 - CONTROL "",IDC_ED_POS1_Y,"CustEdit",WS_TABSTOP,40,42,20,10 - CONTROL "",IDC_SP_POS1_Y,"SpinnerControl",0x0,61,42,7,10 - CONTROL "",IDC_ED_POS1_Z,"CustEdit",WS_TABSTOP,73,42,20,10 - CONTROL "",IDC_SP_POS1_Z,"SpinnerControl",0x0,94,42,7,10 - CONTROL "Cap Pos 2:",IDC_LBL_POS2,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,56,39,8 - CONTROL "",IDC_ED_POS2_X,"CustEdit",WS_TABSTOP,7,68,20,10 - CONTROL "",IDC_SP_POS2_X,"SpinnerControl",0x0,28,68,7,10 - CONTROL "",IDC_ED_POS2_Y,"CustEdit",WS_TABSTOP,40,68,20,10 - CONTROL "",IDC_SP_POS2_Y,"SpinnerControl",0x0,61,68,7,10 - CONTROL "",IDC_ED_POS2_Z,"CustEdit",WS_TABSTOP,73,68,20,10 - CONTROL "",IDC_SP_POS2_Z,"SpinnerControl",0x0,94,68,7,10 + CONTROL "",IDC_LENGTHEDIT,"CustEdit",WS_TABSTOP,50,29,36,10 + CONTROL "",IDC_WIDTHEDIT,"CustEdit",WS_TABSTOP,50,42,36,10 + CONTROL "",IDC_HEIGHTEDIT,"CustEdit",WS_TABSTOP,50,55,36,10 + CONTROL "",IDC_LENSPINNER,"SpinnerControl",0x0,87,29,7,10 + CONTROL "",IDC_WIDTHSPINNER,"SpinnerControl",0x0,87,42,7,10 + CONTROL "",IDC_HEIGHTSPINNER,"SpinnerControl",0x0,87,55,7,10 + RTEXT "Length:",IDC_STATIC,24,29,25,8 + RTEXT "Height:",IDC_STATIC,25,55,24,8 + RTEXT "Width:",IDC_STATIC,26,42,23,8 + COMBOBOX IDC_CB_MATERIAL,12,13,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,4,83,8 +END + +IDD_RB_MOD_PANEL1 DIALOGEX 0, 0, 107, 15 +STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + LTEXT "Box",IDC_STATIC,7,2,77,8 +END + +IDD_RB_MOD_PANEL2 DIALOGEX 0, 0, 107, 22 +STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + LTEXT "Sphere",IDC_STATIC,7,2,77,8 +END + +IDD_RB_MOD_PANEL3 DIALOGEX 0, 0, 107, 21 +STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + LTEXT "Capsule",IDC_STATIC,7,2,77,8 +END + +IDD_RB_MOD_PANEL4 DIALOGEX 0, 0, 107, 105 +STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + LISTBOX IDC_LIST1,6,12,94,71,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "Add",IDC_ADD,"CustButton",WS_TABSTOP,6,86,47,12 + CONTROL "Remove",IDC_REMOVE,"CustButton",WS_TABSTOP,55,86,46,12 + LTEXT "Collision Meshes:",IDC_STATIC,7,2,77,8 END @@ -235,9 +280,9 @@ BEGIN IDD_PANEL, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 100 + RIGHTMARGIN, 105 TOPMARGIN, 7 - BOTTOMMARGIN, 353 + BOTTOMMARGIN, 326 END IDD_ANIM_PANEL, DIALOG @@ -248,18 +293,24 @@ BEGIN BOTTOMMARGIN, 34 END - IDD_RigidBody, DIALOG + IDD_RIGIDBODY, DIALOG BEGIN LEFTMARGIN, 4 RIGHTMARGIN, 102 TOPMARGIN, 7 - BOTTOMMARGIN, 233 + BOTTOMMARGIN, 211 END IDD_CAPSULEPARAM, DIALOG BEGIN RIGHTMARGIN, 108 - BOTTOMMARGIN, 85 + BOTTOMMARGIN, 73 + END + + IDD_BOXPARAM1, DIALOG + BEGIN + RIGHTMARGIN, 106 + BOTTOMMARGIN, 46 END END #endif // APSTUDIO_INVOKED @@ -454,73 +505,8 @@ BEGIN 0 END -IDD_RigidBody DLGINIT +IDD_RIGIDBODY DLGINIT BEGIN - IDC_CB_MATERIAL, 0x403, 6, 0 -0x7453, 0x6e6f, 0x0065, - IDC_CB_MATERIAL, 0x403, 6, 0 -0x6c43, 0x746f, 0x0068, - IDC_CB_MATERIAL, 0x403, 5, 0 -0x6944, 0x7472, "\000" - IDC_CB_MATERIAL, 0x403, 6, 0 -0x6c47, 0x7361, 0x0073, - IDC_CB_MATERIAL, 0x403, 6, 0 -0x7247, 0x7361, 0x0073, - IDC_CB_MATERIAL, 0x403, 6, 0 -0x654d, 0x6174, 0x006c, - IDC_CB_MATERIAL, 0x403, 8, 0 -0x724f, 0x6167, 0x696e, 0x0063, - IDC_CB_MATERIAL, 0x403, 5, 0 -0x6b53, 0x6e69, "\000" - IDC_CB_MATERIAL, 0x403, 6, 0 -0x6157, 0x6574, 0x0072, - IDC_CB_MATERIAL, 0x403, 5, 0 -0x6f57, 0x646f, "\000" - IDC_CB_MATERIAL, 0x403, 12, 0 -0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, - IDC_CB_MATERIAL, 0x403, 12, 0 -0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, - IDC_CB_MATERIAL, 0x403, 11, 0 -0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" - IDC_CB_MATERIAL, 0x403, 6, 0 -0x6843, 0x6961, 0x006e, - IDC_CB_MATERIAL, 0x403, 5, 0 -0x6e53, 0x776f, "\000" - IDC_CB_MATERIAL, 0x403, 13, 0 -0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 13, 0 -0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 12, 0 -0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, - IDC_CB_MATERIAL, 0x403, 13, 0 -0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 13, 0 -0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 13, 0 -0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 15, 0 -0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 12, 0 -0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, - IDC_CB_MATERIAL, 0x403, 13, 0 -0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 12, 0 -0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, - IDC_CB_MATERIAL, 0x403, 19, 0 -0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, -"\000" - IDC_CB_MATERIAL, 0x403, 19, 0 -0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, -"\000" - IDC_CB_MATERIAL, 0x403, 18, 0 -0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, - - IDC_CB_MATERIAL, 0x403, 13, 0 -0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" - IDC_CB_MATERIAL, 0x403, 12, 0 -0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, - IDC_CB_MATERIAL, 0x403, 9, 0 -0x6c45, 0x7665, 0x7461, 0x726f, "\000" IDC_CB_LAYER, 0x403, 13, 0 0x6e55, 0x6469, 0x6e65, 0x6974, 0x6966, 0x6465, "\000" IDC_CB_LAYER, 0x403, 7, 0 @@ -638,6 +624,216 @@ BEGIN 0 END +IDD_SPHEREPARAM2 DLGINIT +BEGIN + IDC_CB_MATERIAL, 0x403, 6, 0 +0x7453, 0x6e6f, 0x0065, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6c43, 0x746f, 0x0068, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6944, 0x7472, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6c47, 0x7361, 0x0073, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x7247, 0x7361, 0x0073, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x654d, 0x6174, 0x006c, + IDC_CB_MATERIAL, 0x403, 8, 0 +0x724f, 0x6167, 0x696e, 0x0063, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6b53, 0x6e69, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6157, 0x6574, 0x0072, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6f57, 0x646f, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, + IDC_CB_MATERIAL, 0x403, 11, 0 +0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6843, 0x6961, 0x006e, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6e53, 0x776f, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 15, 0 +0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 19, 0 +0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, +"\000" + IDC_CB_MATERIAL, 0x403, 19, 0 +0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, +"\000" + IDC_CB_MATERIAL, 0x403, 18, 0 +0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, + + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 9, 0 +0x6c45, 0x7665, 0x7461, 0x726f, "\000" + 0 +END + +IDD_CAPSULEPARAM DLGINIT +BEGIN + IDC_CB_MATERIAL, 0x403, 6, 0 +0x7453, 0x6e6f, 0x0065, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6c43, 0x746f, 0x0068, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6944, 0x7472, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6c47, 0x7361, 0x0073, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x7247, 0x7361, 0x0073, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x654d, 0x6174, 0x006c, + IDC_CB_MATERIAL, 0x403, 8, 0 +0x724f, 0x6167, 0x696e, 0x0063, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6b53, 0x6e69, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6157, 0x6574, 0x0072, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6f57, 0x646f, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, + IDC_CB_MATERIAL, 0x403, 11, 0 +0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6843, 0x6961, 0x006e, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6e53, 0x776f, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 15, 0 +0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 19, 0 +0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, +"\000" + IDC_CB_MATERIAL, 0x403, 19, 0 +0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, +"\000" + IDC_CB_MATERIAL, 0x403, 18, 0 +0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, + + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 9, 0 +0x6c45, 0x7665, 0x7461, 0x726f, "\000" + 0 +END + +IDD_BOXPARAM1 DLGINIT +BEGIN + IDC_CB_MATERIAL, 0x403, 6, 0 +0x7453, 0x6e6f, 0x0065, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6c43, 0x746f, 0x0068, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6944, 0x7472, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6c47, 0x7361, 0x0073, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x7247, 0x7361, 0x0073, + IDC_CB_MATERIAL, 0x403, 6, 0 +0x654d, 0x6174, 0x006c, + IDC_CB_MATERIAL, 0x403, 8, 0 +0x724f, 0x6167, 0x696e, 0x0063, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6b53, 0x6e69, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6157, 0x6574, 0x0072, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6f57, 0x646f, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, + IDC_CB_MATERIAL, 0x403, 11, 0 +0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" + IDC_CB_MATERIAL, 0x403, 6, 0 +0x6843, 0x6961, 0x006e, + IDC_CB_MATERIAL, 0x403, 5, 0 +0x6e53, 0x776f, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 13, 0 +0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 15, 0 +0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 19, 0 +0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, +"\000" + IDC_CB_MATERIAL, 0x403, 19, 0 +0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, +"\000" + IDC_CB_MATERIAL, 0x403, 18, 0 +0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, + + IDC_CB_MATERIAL, 0x403, 13, 0 +0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" + IDC_CB_MATERIAL, 0x403, 12, 0 +0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, + IDC_CB_MATERIAL, 0x403, 9, 0 +0x6c45, 0x7665, 0x7461, 0x726f, "\000" + 0 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -652,57 +848,63 @@ BEGIN IDS_PARAMS "Parameters" IDS_SPIN "Spin" IDS_ANIM_PARAMS "Animation" - IDS_RB_Capsule "bhkCapsule" + IDS_RB_CAPSULE "bhkCapsule" END STRINGTABLE BEGIN + IDS_RB_CAPSULE_CLASS "bhkCapsule" + IDS_RB_RIGIDBODY_PARAM "Rigid Body Parameters" + IDS_RB_CAP_POS1 "Cap Position 1" + IDS_RB_CAP_POS2 "Cap Position 2" + IDS_DS_MASS "Mass" + IDS_DS_FRICTION "Friction" + IDS_DS_RESTITUTION "Restitution" + IDS_DS_LINEAR_DAMPING "Linear Damping" + IDS_DS_ANGULAR_DAMPING "Angular Damping" + IDS_DS_MAX_LINEAR_VELOCITY "Max Linear Velocity" + IDS_DS_MAX_ANGULAR_VELOCITY "Max Angular Velocity" + IDS_DS_PENETRATION_DEPTH "Penetration Depth" + IDS_DS_MOTION_SYSTEM "Motion System" + IDS_DS_QUALITY_TYPE "Quality Type" + IDS_RB_PARAMETERS "Parameters" IDS_RB_RADIUS "Radius" - IDS_RB_SEGS "Segments" END STRINGTABLE BEGIN + IDS_RB_SEGS "Segments" + IDS_RB_SMOOTH "Smooth" + IDS_RB_PRIMITIVES "Standard Primitives" + IDS_RB_SPHERE "bhkSphere" IDS_RB_RADIUS1 "Radius 1" IDS_RB_RADIUS2 "Radius 2" -END - -STRINGTABLE -BEGIN - IDS_RB_SPHERE "bhkSphere" -END - -STRINGTABLE -BEGIN IDS_RB_SPHERE_CLASS "bhkSphere" -END - -STRINGTABLE -BEGIN - IDS_RB_PRIMITIVES "Standard Primitives" -END - -STRINGTABLE -BEGIN IDS_DS_PARAMCHG "Parameter Change" + IDS_DS_LAYER "Layer" + IDS_DS_MATERIAL "Material" + IDS_DS_NODE "Node" + IDS_DS_PRIORITY "Priority" + IDS_DS_COLLISION "Collision" + IDS_PICKNODE "picknode" + IDS_PICKNODE_PROMPT "Pick the Collision Mesh that is associated with this mesh." + IDS_RB_BOX "bhkBox" END STRINGTABLE BEGIN - IDS_RB_PARAMETERS "Parameters" -END - -STRINGTABLE -BEGIN - IDS_RB_SMOOTH "Smooth" -END - -STRINGTABLE -BEGIN - IDS_RB_CAPSULE_CLASS "bhkCapsule" - IDS_RB_RIGIDBODY_PARAM "Rigid Body Parameters" - IDS_RB_CAP_POS1 "Cap Position 1" - IDS_RB_CAP_POS2 "Cap Position 2" + IDS_RB_BOX_CLASS "bhkBox" + IDS_RB_CLASS_NAME "bhkRigidBody" + IDS_DS_LENGTH "Length" + IDS_DS_WIDTH "Width" + IDS_DS_HEIGHT "Height" + IDS_ADD_MESH "Add Collision Mesh" + IDS_MESHLIST "MeshList" + IDS_BV_BOUNDING_TYPE "Bounding Volume Type" + IDS_RB_MOD_PANEL1 "Axis Aligned Box" + IDS_RB_MOD_PANEL2 "Sphere" + IDS_RB_MOD_PANEL3 "Capsule" + IDS_RB_MOD_PANEL4 "Proxy Mesh" END #endif // English (U.S.) resources diff --git a/NifProps/bhkBoxObj.cpp b/NifProps/bhkBoxObj.cpp new file mode 100644 index 0000000..9079331 --- /dev/null +++ b/NifProps/bhkBoxObj.cpp @@ -0,0 +1,811 @@ +/********************************************************************** +*< +FILE: bhkBoxObj.cpp + +DESCRIPTION: Collision Box Object Implementation + +CREATED BY: tazpn (Theo) + +HISTORY: + V1.0 - Derived from 3ds max prim box example + +*> Copyright (c) 2006, All Rights Reserved. +**********************************************************************/ +#pragma warning( disable:4800 ) +#include <max.h> +#include "MAX_Mem.h" +#include <map> +#include "NifProps.h" +#include "iparamm.h" +#include "Simpobj.h" +#include "surf_api.h" +#include "notify.h" +#include "macroRec.h" +#include "bhkRigidBodyInterface.h" +#include "NifGui.h" +#include "NifStrings.h" + +#ifndef _countof +#define _countof(x) (sizeof(x)/sizeof((x)[0])) +#endif + +const Class_ID bhkBoxObject_CLASS_ID = Class_ID(0x86e19816, BHKRIGIDBODYCLASS_DESC.PartB()); + +static ParamBlockDesc2* GetbhkBoxParamBlockDesc(); + +class bhkBoxObject : public SimpleObject2 +{ +public: + // Class vars + static IParamMap2 *pmapParam; + static IObjParam *ip; + + bhkBoxObject(BOOL loading); + ~bhkBoxObject(); + + // From Object + int CanConvertToType(Class_ID obtype); + Object* ConvertToType(TimeValue t, Class_ID obtype); + void GetCollapseTypes(Tab<Class_ID> &clist,Tab<TSTR*> &nlist); + + CreateMouseCallBack* GetCreateMouseCallBack(); + void BeginEditParams( IObjParam *ip, ULONG flags,Animatable *prev); + void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next); + RefTargetHandle Clone(RemapDir& remap); + TCHAR *GetObjectName() { return GetString(IDS_RB_BOX); } + + int NumParamBlocks() { return 1; } // return number of ParamBlocks in this instance + IParamBlock2* GetParamBlock(int i) { return pblock2; } // return i'th ParamBlock + IParamBlock2* GetParamBlockByID(BlockID id) { return (pblock2->ID() == id) ? pblock2 : NULL; } // return id'd ParamBlock + + // Animatable methods + void DeleteThis() {delete this;} + Class_ID ClassID() { return bhkBoxObject_CLASS_ID; } + SClass_ID SuperClassID() { return HELPER_CLASS_ID; } + + // From SimpleObject + void BuildMesh(TimeValue t); + BOOL OKtoDisplay(TimeValue t); + void InvalidateUI(); + + int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags); + + void UpdateUI(); +}; + +//--- ClassDescriptor and class vars --------------------------------- + +// The class descriptor for box +class bhkBoxClassDesc : public ClassDesc2 +{ +public: + bhkBoxClassDesc(); + int IsPublic() { return 1; } + void * Create(BOOL loading = FALSE) { + return new bhkBoxObject(loading); + } + const TCHAR * ClassName() { return GetString(IDS_RB_BOX_CLASS); } + SClass_ID SuperClassID() { return HELPER_CLASS_ID; } + Class_ID ClassID() { return bhkBoxObject_CLASS_ID; } + const TCHAR* Category() { return "NifTools"; } + + const TCHAR* InternalName() { return _T("bhkBox"); } // returns fixed parsable name (scripter-visible name) + HINSTANCE HInstance() { return hInstance; } // returns owning module handle +}; + +extern ClassDesc2* GetbhkBoxDesc(); + +// in prim.cpp - The dll instance handle +extern HINSTANCE hInstance; + +IParamMap2 *bhkBoxObject::pmapParam = NULL; +IObjParam *bhkBoxObject::ip = NULL; + +//--- Parameter map/block descriptors ------------------------------- + +// Parameter and ParamBlock IDs +enum { box_params, }; // pblock ID +enum +{ + PB_MATERIAL, + PB_LENGTH, + PB_WIDTH, + PB_HEIGHT, +}; + +enum { box_params_panel, }; + +static ParamBlockDesc2 param_blk ( + box_params, _T("parameters"), 0, NULL, P_AUTO_CONSTRUCT + P_AUTO_UI + P_MULTIMAP, 0, + //rollout + 1, + box_params, IDD_BOXPARAM1, IDS_PARAMS, 0, 0, NULL, + + // params + PB_MATERIAL, _T("material"), TYPE_INT, P_ANIMATABLE, IDS_DS_MATERIAL, + p_default, NP_DEFAULT_HVK_MATERIAL, + end, + + PB_LENGTH, _T("length"), TYPE_FLOAT, P_ANIMATABLE, IDS_DS_LENGTH, + p_default, 0.0, + p_range, 0.0, float(1.0E30), + p_ui, box_params, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_LENGTHEDIT, IDC_LENSPINNER, SPIN_AUTOSCALE, + end, + + PB_WIDTH, _T("width"), TYPE_FLOAT, P_ANIMATABLE, IDS_DS_WIDTH, + p_default, 0.0, + p_range, 0.0, float(1.0E30), + p_ui, box_params, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_WIDTHEDIT, IDC_WIDTHSPINNER, SPIN_AUTOSCALE, + end, + + PB_HEIGHT, _T("height"), TYPE_FLOAT, P_ANIMATABLE, IDS_DS_HEIGHT, + p_default, 0.0, + p_range, float(-1.0E30), float(1.0E30), + p_ui, box_params, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_HEIGHTEDIT, IDC_HEIGHTSPINNER, SPIN_AUTOSCALE, + end, + end + ); + +// bug in pb desc? forces us to use this rather than in inline version +static bhkBoxClassDesc boxDesc; +extern ClassDesc2* GetbhkBoxDesc() { return &boxDesc; } +bhkBoxClassDesc::bhkBoxClassDesc() { + param_blk.SetClassDesc(this); +} + +class BoxParamDlgProc : public ParamMap2UserDlgProc { +public: + bhkBoxObject *so; + HWND thishWnd; + NpComboBox mCbMaterial; + + BoxParamDlgProc(bhkBoxObject *s) {so=s;thishWnd=NULL;} + BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); + void Update(TimeValue t); + void DeleteThis() {delete this;} + + //--- ParamDlgProc -------------------------------- + void TurnSpinner(HWND hWnd,int SpinNum,BOOL ison) + { + ISpinnerControl *spin2 = GetISpinner(GetDlgItem(hWnd,SpinNum)); + if (ison) spin2->Enable();else spin2->Disable(); + ReleaseISpinner(spin2); + }; + +}; + +void BoxParamDlgProc::Update(TimeValue t) +{ + if (!thishWnd) + return; + return; +} + +BOOL BoxParamDlgProc::DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + thishWnd=hWnd; + switch (msg) + { + case WM_INITDIALOG: + { + mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL)); + for (const char **str = NpHvkMaterialNames; *str; ++str) + mCbMaterial.add(*str); + + int sel = NP_DEFAULT_HVK_MATERIAL; + Interval valid; + so->pblock2->GetValue( PB_MATERIAL, 0, sel, valid); + mCbMaterial.select( sel ); + + Update(t); + break; + } + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_CB_MATERIAL: + if (HIWORD(wParam)==CBN_SELCHANGE) { + so->pblock2->SetValue( PB_MATERIAL, 0, mCbMaterial.selection() ); + } + break; + } + break; + } + return FALSE; +} +//--- Box methods ------------------------------- + + +bhkBoxObject::bhkBoxObject(BOOL loading) +{ + SetAFlag(A_PLUGIN1); + boxDesc.MakeAutoParamBlocks(this); + assert(pblock2); +} + +bhkBoxObject::~bhkBoxObject() +{ + param_blk.SetUserDlgProc(); + if (pmapParam) { + pmapParam = NULL; + } +} + +void bhkBoxObject::BeginEditParams(IObjParam *ip,ULONG flags,Animatable *prev) +{ + SimpleObject::BeginEditParams(ip,flags,prev); + + //if (pmapParam == NULL) { + // pmapParam = CreateCPParamMap2( + // 0, + // pblock2, + // GetCOREInterface(), + // hInstance, + // MAKEINTRESOURCE(IDD_BOXPARAM1), + // GetString(IDS_PARAMS), + // 0); + //} + boxDesc.BeginEditParams(ip,this,flags,prev); + param_blk.SetUserDlgProc(new BoxParamDlgProc(this)); + pmapParam = pblock2->GetMap(box_params); + + pmapParam->GetIRollup()->Hide(1); + + + this->ip = ip; + + //if(pmapParam) { + // // A callback for the type in. + // pmapParam->SetUserDlgProc(new BoxParamDlgProc(this)); + //} + +} + +void bhkBoxObject::EndEditParams( IObjParam *ip, ULONG flags,Animatable *next ) +{ + param_blk.SetUserDlgProc(); + + SimpleObject::EndEditParams(ip,flags,next); + this->ip = NULL; + pmapParam = NULL; + //if (pmapParam && flags&END_EDIT_REMOVEUI ) { + // DestroyCPParamMap2 (pmapParam); + // pmapParam = NULL; + //} + + // tear down the appropriate auto-rollouts + boxDesc.EndEditParams(ip, this, flags, next); +} + +void bhkBoxObject::UpdateUI() +{ + if (ip == NULL) + return; + BoxParamDlgProc* dlg = static_cast<BoxParamDlgProc*>(pmapParam->GetUserDlgProc()); + dlg->Update(ip->GetTime()); +} + +enum +{ + POSX = 0, // right + POSY = 1, // back + POSZ = 2, // top + NEGX = 3, // left + NEGY = 4, // front + NEGZ = 5, // bottom +}; + +int direction(Point3 *v) { + Point3 a = v[0]-v[2]; + Point3 b = v[1]-v[0]; + Point3 n = CrossProd(a,b); + switch(MaxComponent(n)) { + case 0: return (n.x<0)?NEGX:POSX; + case 1: return (n.y<0)?NEGY:POSY; + case 2: return (n.z<0)?NEGZ:POSZ; + } + return 0; +} + +void bhkBoxObject::BuildMesh(TimeValue t) +{ + extern void BuildBox(Mesh&mesh, float l, float w, float h); + + float l, w, h; + ivalid = FOREVER; + pblock2->GetValue(PB_LENGTH,t,l,ivalid); + pblock2->GetValue(PB_WIDTH,t,w,ivalid); + pblock2->GetValue(PB_HEIGHT,t,h,ivalid); + BuildBox(mesh, l, w, h); +} + +// Remap the sub-object material numbers so that the top face is the first one +// The order now is: +// Top / Bottom / Left/ Right / Front / Back +static int mapDir[6] ={ 3, 5, 0, 2, 4, 1 }; + +// vertices ( a b c d ) are in counter clockwise order when viewd from +// outside the surface unless bias!=0 in which case they are clockwise +static void MakeQuad(int nverts, Face *f, int a, int b , int c , int d, int sg, int bias) { + int sm = 1<<sg; + assert(a<nverts); + assert(b<nverts); + assert(c<nverts); + assert(d<nverts); + if (bias) { + f[0].setVerts( b, a, c); + f[0].setSmGroup(sm); + f[0].setEdgeVisFlags(1,0,1); + f[1].setVerts( d, c, a); + f[1].setSmGroup(sm); + f[1].setEdgeVisFlags(1,0,1); + } else { + f[0].setVerts( a, b, c); + f[0].setSmGroup(sm); + f[0].setEdgeVisFlags(1,1,0); + f[1].setVerts( c, d, a); + f[1].setSmGroup(sm); + f[1].setEdgeVisFlags(1,1,0); + } +} +#define MAKE_QUAD(na,nb,nc,nd,sm,b) {MakeQuad(nverts,&(mesh.faces[nf]),na, nb, nc, nd, sm, b);nf+=2;} + +void BuildBox(Mesh&mesh, float l, float w, float h) +{ + int ix,iy,iz,nf,kv,mv,nlayer,topStart,midStart; + int nverts,nv,nextk,nextm,wsp1; + int nfaces; + Point3 va,vb,p; + BOOL bias = 0; + const int lsegs = 1, wsegs = 1, hsegs = 1; + + // Start the validity interval at forever and whittle it down. + if (h<0.0f) bias = 1; + + // Number of verts + // bottom : (lsegs+1)*(wsegs+1) + // top : (lsegs+1)*(wsegs+1) + // sides : (2*lsegs+2*wsegs)*(hsegs-1) + + // Number of rectangular faces. + // bottom : (lsegs)*(wsegs) + // top : (lsegs)*(wsegs) + // sides : 2*(hsegs*lsegs)+2*(wsegs*lsegs) + + wsp1 = wsegs + 1; + nlayer = 2*(lsegs+wsegs); + topStart = (lsegs+1)*(wsegs+1); + midStart = 2*topStart; + + nverts = midStart+nlayer*(hsegs-1); + nfaces = 4*(lsegs*wsegs + hsegs*lsegs + wsegs*hsegs); + + mesh.setNumVerts(nverts); + mesh.setNumFaces(nfaces); + mesh.InvalidateTopologyCache(); + + nv = 0; + + vb = Point3(w,l,h)/float(2); + va = -vb; + + float dx = w/wsegs; + float dy = l/lsegs; + float dz = h/hsegs; + + // do bottom vertices. + p.z = va.z; + p.y = va.y; + for(iy=0; iy<=lsegs; iy++) { + p.x = va.x; + for (ix=0; ix<=wsegs; ix++) { + mesh.setVert(nv++, p); + p.x += dx; + } + p.y += dy; + } + + nf = 0; + + // do bottom faces. + for(iy=0; iy<lsegs; iy++) { + kv = iy*(wsegs+1); + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv, kv+wsegs+1, kv+wsegs+2, kv+1, 1, bias); + kv++; + } + } + assert(nf==lsegs*wsegs*2); + + // do top vertices. + p.z = vb.z; + p.y = va.y; + for(iy=0; iy<=lsegs; iy++) { + p.x = va.x; + for (ix=0; ix<=wsegs; ix++) { + mesh.setVert(nv++, p); + p.x += dx; + } + p.y += dy; + } + + // do top faces (lsegs*wsegs); + for(iy=0; iy<lsegs; iy++) { + kv = iy*(wsegs+1)+topStart; + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv, kv+1, kv+wsegs+2,kv+wsegs+1, 2, bias); + kv++; + } + } + assert(nf==lsegs*wsegs*4); + + // do middle vertices + for(iz=1; iz<hsegs; iz++) { + + p.z = va.z + dz * iz; + + // front edge + p.x = va.x; p.y = va.y; + for (ix=0; ix<wsegs; ix++) { mesh.setVert(nv++, p); p.x += dx; } + + // right edge + p.x = vb.x; p.y = va.y; + for (iy=0; iy<lsegs; iy++) { mesh.setVert(nv++, p); p.y += dy; } + + // back edge + p.x = vb.x; p.y = vb.y; + for (ix=0; ix<wsegs; ix++) { mesh.setVert(nv++, p); p.x -= dx; } + + // left edge + p.x = va.x; p.y = vb.y; + for (iy=0; iy<lsegs; iy++) { mesh.setVert(nv++, p); p.y -= dy; } + } + + if (hsegs==1) { + // do FRONT faces ----------------------- + kv = 0; + mv = topStart; + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv, kv+1, mv+1, mv, 3, bias); + kv++; + mv++; + } + + // do RIGHT faces.----------------------- + kv = wsegs; + mv = topStart + kv; + for (iy=0; iy<lsegs; iy++) { + MAKE_QUAD(kv, kv+wsp1, mv+wsp1, mv, 4, bias); + kv += wsp1; + mv += wsp1; + } + + // do BACK faces.----------------------- + kv = topStart - 1; + mv = midStart - 1; + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv, kv-1, mv-1, mv, 5, bias); + kv --; + mv --; + } + + // do LEFT faces.---------------------- + kv = lsegs*(wsegs+1); // index into bottom + mv = topStart + kv; + for (iy=0; iy<lsegs; iy++) { + MAKE_QUAD(kv, kv-wsp1, mv-wsp1, mv, 6, bias); + kv -= wsp1; + mv -= wsp1; + } + } + + else { + // do front faces. + kv = 0; + mv = midStart; + for(iz=0; iz<hsegs; iz++) { + if (iz==hsegs-1) mv = topStart; + for (ix=0; ix<wsegs; ix++) + MAKE_QUAD(kv+ix, kv+ix+1, mv+ix+1, mv+ix, 3, bias); + kv = mv; + mv += nlayer; + } + + assert(nf==lsegs*wsegs*4 + wsegs*hsegs*2); + + // do RIGHT faces.------------------------- + // RIGHT bottom row: + kv = wsegs; // into bottom layer. + mv = midStart + wsegs; // first layer of mid verts + + + for (iy=0; iy<lsegs; iy++) { + MAKE_QUAD(kv, kv+wsp1, mv+1, mv, 4, bias); + kv += wsp1; + mv ++; + } + + // RIGHT middle part: + kv = midStart + wsegs; + for(iz=0; iz<hsegs-2; iz++) { + mv = kv + nlayer; + for (iy=0; iy<lsegs; iy++) { + MAKE_QUAD(kv+iy, kv+iy+1, mv+iy+1, mv+iy, 4, bias); + } + kv += nlayer; + } + + // RIGHT top row: + kv = midStart + wsegs + (hsegs-2)*nlayer; + mv = topStart + wsegs; + for (iy=0; iy<lsegs; iy++) { + MAKE_QUAD(kv, kv+1, mv+wsp1, mv, 4, bias); + mv += wsp1; + kv++; + } + + assert(nf==lsegs*wsegs*4 + wsegs*hsegs*2 + lsegs*hsegs*2); + + // do BACK faces. --------------------- + // BACK bottom row: + kv = topStart - 1; + mv = midStart + wsegs + lsegs; + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv, kv-1, mv+1, mv, 5, bias); + kv --; + mv ++; + } + + // BACK middle part: + kv = midStart + wsegs + lsegs; + for(iz=0; iz<hsegs-2; iz++) { + mv = kv + nlayer; + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv+ix, kv+ix+1, mv+ix+1, mv+ix, 5, bias); + } + kv += nlayer; + } + + // BACK top row: + kv = midStart + wsegs + lsegs + (hsegs-2)*nlayer; + mv = topStart + lsegs*(wsegs+1)+wsegs; + for (ix=0; ix<wsegs; ix++) { + MAKE_QUAD(kv, kv+1, mv-1, mv, 5, bias); + mv --; + kv ++; + } + + assert(nf==lsegs*wsegs*4 + wsegs*hsegs*4 + lsegs*hsegs*2); + + // do LEFT faces. ----------------- + // LEFT bottom row: + kv = lsegs*(wsegs+1); // index into bottom + mv = midStart + 2*wsegs +lsegs; + for (iy=0; iy<lsegs; iy++) { + nextm = mv+1; + if (iy==lsegs-1) + nextm -= nlayer; + MAKE_QUAD(kv, kv-wsp1, nextm, mv, 6, bias); + kv -=wsp1; + mv ++; + } + + // LEFT middle part: + kv = midStart + 2*wsegs + lsegs; + for(iz=0; iz<hsegs-2; iz++) { + mv = kv + nlayer; + for (iy=0; iy<lsegs; iy++) { + nextm = mv+1; + nextk = kv+iy+1; + if (iy==lsegs-1) { + nextm -= nlayer; + nextk -= nlayer; + } + MAKE_QUAD(kv+iy, nextk, nextm, mv, 6, bias); + mv++; + } + kv += nlayer; + } + + // LEFT top row: + kv = midStart + 2*wsegs + lsegs+ (hsegs-2)*nlayer; + mv = topStart + lsegs*(wsegs+1); + for (iy=0; iy<lsegs; iy++) { + nextk = kv+1; + if (iy==lsegs-1) + nextk -= nlayer; + MAKE_QUAD(kv, nextk, mv-wsp1, mv, 6, bias); + mv -= wsp1; + kv++; + } + } + + mesh.setNumTVerts(0); + mesh.setNumTVFaces(0); + for (nf = 0; nf<nfaces; nf++) { + Face& f = mesh.faces[nf]; + DWORD* nv = f.getAllVerts(); + Point3 v[3]; + for (int ix =0; ix<3; ix++) + v[ix] = mesh.getVert(nv[ix]); + int dir = direction(v); + mesh.setFaceMtlIndex(nf,0); + //mesh.setFaceMtlIndex(nf,mapDir[dir]); + } + + mesh.InvalidateTopologyCache(); +} + +Object* bhkBoxObject::ConvertToType(TimeValue t, Class_ID obtype) +{ + return 0; + //return SimpleObject::ConvertToType(t,obtype); +} + +int bhkBoxObject::CanConvertToType(Class_ID obtype) +{ + return 0; +} + + +void bhkBoxObject::GetCollapseTypes(Tab<Class_ID> &clist,Tab<TSTR*> &nlist) +{ + Object::GetCollapseTypes(clist, nlist); +} + +class BoxObjCreateCallBack: public CreateMouseCallBack { + bhkBoxObject *ob; + Point3 p0,p1; + IPoint2 sp0, sp1; + BOOL square; +public: + int proc( ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ); + void SetObj(bhkBoxObject *obj) { ob = obj; } +}; + +int BoxObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ) { + Point3 d; + if (msg == MOUSE_FREEMOVE) + { + vpt->SnapPreview(m,m,NULL, SNAP_IN_3D); + } + + else if (msg==MOUSE_POINT||msg==MOUSE_MOVE) { + switch(point) { + case 0: + // Find the node and plug in the wire color + { + ULONG handle; + ob->NotifyDependents(FOREVER, (PartID)&handle, REFMSG_GET_NODE_HANDLE); + INode *node = GetCOREInterface()->GetINodeByHandle(handle); + if (node) node->SetWireColor(RGB(255, 0, 0)); + } + + sp0 = m; + ob->pblock2->SetValue(PB_WIDTH,0,0.0f); + ob->pblock2->SetValue(PB_LENGTH,0,0.0f); + ob->pblock2->SetValue(PB_HEIGHT,0,0.0f); + ob->suspendSnap = TRUE; + p0 = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D); + p1 = p0 + Point3(.01,.01,.01); + mat.SetTrans(float(.5)*(p0+p1)); + break; + case 1: + sp1 = m; + p1 = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D); + p1.z = p0.z +(float).01; + if (flags&MOUSE_CTRL) { + mat.SetTrans(p0); + } else { + mat.SetTrans(float(.5)*(p0+p1)); + } + d = p1-p0; + + square = FALSE; + if (flags&MOUSE_CTRL) { + // Constrain to square base + float len; + if (fabs(d.x) > fabs(d.y)) len = d.x; + else len = d.y; + d.x = d.y = 2.0f * len; + square = TRUE; + } + + ob->pblock2->SetValue(PB_WIDTH,0,float(fabs(d.x))); + ob->pblock2->SetValue(PB_LENGTH,0,float(fabs(d.y))); + ob->pblock2->SetValue(PB_HEIGHT,0,float(fabs(d.z))); + ob->pmapParam->Invalidate(); + + if (msg==MOUSE_POINT && (Length(sp1-sp0)<3 || Length(d)<0.1f)) { + return CREATE_ABORT; + } + break; + case 2: +#ifdef _OSNAP + p1.z = p0.z + vpt->SnapLength(vpt->GetCPDisp(p0,Point3(0,0,1),sp1,m,TRUE)); +#else + p1.z = p0.z + vpt->SnapLength(vpt->GetCPDisp(p1,Point3(0,0,1),sp1,m)); +#endif + if (!square) + mat.SetTrans(float(.5)*(p0+p1)); + + d = p1-p0; + if (square) + { + // Constrain to square base + float len; + if (fabs(d.x) > fabs(d.y)) len = d.x; + else len = d.y; + d.x = d.y = 2.0f * len; + } + + ob->pblock2->SetValue(PB_WIDTH,0,float(fabs(d.x))); + ob->pblock2->SetValue(PB_LENGTH,0,float(fabs(d.y))); + ob->pblock2->SetValue(PB_HEIGHT,0,float(d.z)); + ob->pmapParam->Invalidate(); + + if (msg==MOUSE_POINT) + { + ob->suspendSnap = FALSE; + return CREATE_STOP; + } + break; + } + } + else + if (msg == MOUSE_ABORT) { + return CREATE_ABORT; + } + + return TRUE; +} + +static BoxObjCreateCallBack boxCreateCB; + +CreateMouseCallBack* bhkBoxObject::GetCreateMouseCallBack() +{ + boxCreateCB.SetObj(this); + return(&boxCreateCB); +} + + +BOOL bhkBoxObject::OKtoDisplay(TimeValue t) +{ + return TRUE; +} + +void bhkBoxObject::InvalidateUI() +{ + param_blk.InvalidateUI(pblock2->LastNotifyParamID()); + if (pmapParam) pmapParam->Invalidate(); +} + +RefTargetHandle bhkBoxObject::Clone(RemapDir& remap) +{ + bhkBoxObject* newob = new bhkBoxObject(FALSE); + newob->ReplaceReference(0,remap.CloneRef(pblock2)); + newob->ivalid.SetEmpty(); + BaseClone(this, newob, remap); + return(newob); +} + +int bhkBoxObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) +{ + Matrix3 m; + Color color = Color(inode->GetWireColor()); + GraphicsWindow *gw = vpt->getGW(); + Material *mtl = gw->getMaterial(); + m = inode->GetObjectTM(t); + gw->setTransform(m); + DWORD rlim = gw->getRndLimits(); + gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_Z_BUFFER); + if (inode->Selected()) + gw->setColor( LINE_COLOR, GetSelColor()); + else if(!inode->IsFrozen() && !inode->Dependent()) + gw->setColor( LINE_COLOR, color); + + //UpdateMesh(t); + mesh.render( gw, mtl, NULL, COMP_ALL); + gw->setRndLimits(rlim); + return 0; +} \ No newline at end of file diff --git a/NifProps/bhkCapsuleObj.cpp b/NifProps/bhkCapsuleObj.cpp index 9474be2..4e98bcd 100644 --- a/NifProps/bhkCapsuleObj.cpp +++ b/NifProps/bhkCapsuleObj.cpp @@ -22,25 +22,23 @@ HISTORY: #include "notify.h" #include "macroRec.h" #include "bhkRigidBodyInterface.h" +#include "NifGui.h" +#include "NifStrings.h" + #ifndef _countof #define _countof(x) (sizeof(x)/sizeof((x)[0])) #endif static void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, - float radius1, float radius2, Point3 cap1, Point3 cap2); + float radius1, float radius2, float length); -const Class_ID BHKCAPSULEOBJECT_CLASS_ID = Class_ID(0x7f8f629a, 0x1d88470a); +const Class_ID BHKCAPSULEOBJECT_CLASS_ID = Class_ID(0x7f8f629a, BHKRIGIDBODYCLASS_DESC.PartB()); -class bhkCapsuleObject : public SimpleObject, public IParamArray, public bhkRigidBodyIfcHelper +class bhkCapsuleObject : public SimpleObject2 { public: // Class vars - static IParamMap *pmapParam; - static float crtRadius; - static float crtRadius1; - static float crtRadius2; - static Point3 crtCapPos1; - static Point3 crtCapPos2; + static IParamMap2 *pmapParam; static IObjParam *ip; bhkCapsuleObject(BOOL loading); @@ -55,33 +53,24 @@ public: void BeginEditParams( IObjParam *ip, ULONG flags,Animatable *prev); void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next); RefTargetHandle Clone(RemapDir& remap); - TCHAR *GetObjectName() { return GetString(IDS_RB_Capsule); } + TCHAR *GetObjectName() { return GetString(IDS_RB_CAPSULE); } // Animatable methods void DeleteThis() {delete this;} Class_ID ClassID() { return BHKCAPSULEOBJECT_CLASS_ID; } SClass_ID SuperClassID() { return HELPER_CLASS_ID; } - // From ReferenceTarget - IOResult Load(ILoad *iload); - IOResult Save(ISave *isave); - - // From ref - int NumRefs() {return 2;} - RefTargetHandle GetReference(int i); - void SetReference(int i, RefTargetHandle rtarg); + int NumParamBlocks() { return 1; } // return number of ParamBlocks in this instance + IParamBlock2* GetParamBlock(int i) { return pblock2; } // return i'th ParamBlock + IParamBlock2* GetParamBlockByID(BlockID id) { return (pblock2->ID() == id) ? pblock2 : NULL; } // return id'd ParamBlock // From SimpleObject void BuildMesh(TimeValue t); BOOL OKtoDisplay(TimeValue t); void InvalidateUI(); - ParamDimension *GetParameterDim(int pbIndex); - TSTR GetParameterName(int pbIndex); void UpdateUI(); - - BaseInterface* GetInterface(Interface_ID id); - + int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags); }; class CapsuleObjCreateCallBack : public CreateMouseCallBack { @@ -94,152 +83,97 @@ public: }; static CapsuleObjCreateCallBack CapsuleCreateCB; -// Misc stuff -#define MAX_SEGMENTS 200 -#define MIN_SEGMENTS 4 - -#define MIN_RADIUS float(0) -#define MAX_RADIUS float(1.0E30) - -#define MIN_SMOOTH 0 -#define MAX_SMOOTH 1 - -#define DEF_SEGMENTS 32 // 16 -#define DEF_RADIUS float(0.0) - -#define SMOOTH_ON 1 -#define SMOOTH_OFF 0 - -#define MIN_SLICE float(-1.0E30) -#define MAX_SLICE float( 1.0E30) - - //--- ClassDescriptor and class vars --------------------------------- -static BOOL sInterfaceAdded = FALSE; - // The class descriptor for Capsule class bhkCapsuleClassDesc : public ClassDesc2 { public: + bhkCapsuleClassDesc(); int IsPublic() { return 1; } void * Create(BOOL loading = FALSE) { - AddInterface (GetbhkRigidBodyInterfaceDesc()); return new bhkCapsuleObject(loading); } const TCHAR * ClassName() { return GetString(IDS_RB_CAPSULE_CLASS); } SClass_ID SuperClassID() { return HELPER_CLASS_ID; } Class_ID ClassID() { return BHKCAPSULEOBJECT_CLASS_ID; } const TCHAR* Category() { return "NifTools"; } - void ResetClassParams(BOOL fileReset); + + const TCHAR* InternalName() { return _T("bhkCapsule"); } // returns fixed parsable name (scripter-visible name) + HINSTANCE HInstance() { return hInstance; } // returns owning module handle }; -static bhkCapsuleClassDesc CapsuleDesc; -extern ClassDesc2* GetbhkCapsuleDesc() { return &CapsuleDesc; } +extern ClassDesc2* GetbhkCapsuleDesc(); // in prim.cpp - The dll instance handle extern HINSTANCE hInstance; -IParamMap *bhkCapsuleObject::pmapParam = NULL; +IParamMap2 *bhkCapsuleObject::pmapParam = NULL; IObjParam *bhkCapsuleObject::ip = NULL; -float bhkCapsuleObject::crtRadius1 = 0.0f; -float bhkCapsuleObject::crtRadius2 = 0.0f; -Point3 bhkCapsuleObject::crtCapPos1; -Point3 bhkCapsuleObject::crtCapPos2; - - -void bhkCapsuleClassDesc::ResetClassParams(BOOL fileReset) -{ - bhkCapsuleObject::crtRadius1 = 0.0f; - bhkCapsuleObject::crtRadius2 = 0.0f; - bhkCapsuleObject::crtCapPos1.Set(0,0,0); - bhkCapsuleObject::crtCapPos2.Set(0,0,0); -} //--- Parameter map/block descriptors ------------------------------- // Parameter block indices +enum { cap_params, }; + enum CapsuleParamIndicies { + PB_MATERIAL, PB_RADIUS1, PB_RADIUS2, - PB_CAP_POS1, - PB_CAP_POS2, + PB_LENGTH, }; +enum { box_params_panel, }; + +static ParamBlockDesc2 param_blk ( + cap_params, _T("bhkCapsuleParameters"), 0, NULL, P_AUTO_CONSTRUCT|P_AUTO_UI, 0, + //rollout + IDD_CAPSULEPARAM, IDS_PARAMS, 0, 0, NULL, + + // params + PB_MATERIAL, _T("material"), TYPE_INT, P_ANIMATABLE, IDS_DS_MATERIAL, + p_default, NP_DEFAULT_HVK_MATERIAL, + end, + + PB_RADIUS1, _T("radius1"), TYPE_FLOAT, P_ANIMATABLE, IDS_RB_RADIUS1, + p_default, 0.0, + p_range, float(0), float(1.0E30), + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_RADIUS1, IDC_RADSPINNER1, SPIN_AUTOSCALE, + end, + + PB_RADIUS2, _T("radius2"), TYPE_FLOAT, P_ANIMATABLE, IDS_RB_RADIUS2, + p_default, 0.0, + p_range, float(0), float(1.0E30), + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_RADIUS2, IDC_RADSPINNER2, SPIN_AUTOSCALE, + end, + + PB_LENGTH, _T("length"), TYPE_FLOAT, P_ANIMATABLE, IDS_DS_LENGTH, + p_default, 0.0, + p_range, float(-1.0E30), float(1.0E30), + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_LENGTHEDIT, IDC_LENSPINNER, SPIN_AUTOSCALE, + end, + + end + ); + +// static ClassDesc must be declared after static paramblock +static bhkCapsuleClassDesc capsuleDesc; +extern ClassDesc2* GetbhkCapsuleDesc() { return &capsuleDesc; } +bhkCapsuleClassDesc::bhkCapsuleClassDesc() { + param_blk.SetClassDesc(this); +} -// -// -// Parameters - -static ParamUIDesc descParam[] = { - // Radius 1 - ParamUIDesc( - PB_RADIUS1, - EDITTYPE_UNIVERSE, - IDC_RADIUS1,IDC_RADSPINNER1, - MIN_RADIUS,MAX_RADIUS, - SPIN_AUTOSCALE), - - // Radius 2 - ParamUIDesc( - PB_RADIUS2, - EDITTYPE_UNIVERSE, - IDC_RADIUS2,IDC_RADSPINNER2, - MIN_RADIUS,MAX_RADIUS, - SPIN_AUTOSCALE), - - ParamUIDesc( - PB_CAP_POS1, - EDITTYPE_UNIVERSE, - IDC_ED_POS1_X,IDC_SP_POS1_X, - IDC_ED_POS1_Y,IDC_SP_POS1_Y, - IDC_ED_POS1_Z,IDC_SP_POS1_Z, - float(-1.0E30),float(1.0E30), - SPIN_AUTOSCALE), - - ParamUIDesc( - PB_CAP_POS2, - EDITTYPE_UNIVERSE, - IDC_ED_POS2_X,IDC_SP_POS2_X, - IDC_ED_POS2_Y,IDC_SP_POS2_Y, - IDC_ED_POS2_Z,IDC_SP_POS2_Z, - float(-1.0E30),float(1.0E30), - SPIN_AUTOSCALE), - -}; -const int PARAMDESC_LENGTH = _countof(descParam); - -static ParamBlockDescID descVer0[] = { - { TYPE_FLOAT, NULL, TRUE, 0 }, - { TYPE_FLOAT, NULL, TRUE, 1 }, - { TYPE_POINT3, NULL, TRUE, 2 }, - { TYPE_POINT3, NULL, TRUE, 3 } -}; -const int PBLOCK_LENGTH = _countof(descVer0); -static ParamBlockDescID *curDescVer = descVer0; - -// Array of old versions -//static ParamVersionDesc versions[] = { -// ParamVersionDesc(descVer0,_countof(descVer0),0), -//}; -//const int NUM_OLDVERSIONS = _countof(versions); -static ParamVersionDesc* versions = NULL; -const int NUM_OLDVERSIONS = 0; - -// Current version -const int CURRENT_VERSION = NUM_OLDVERSIONS + 1; -static ParamVersionDesc curVersion(descVer0,_countof(descVer0),CURRENT_VERSION); - -class CapsuleParamDlgProc : public ParamMapUserDlgProc { +class CapsuleParamDlgProc : public ParamMap2UserDlgProc { public: bhkCapsuleObject *so; HWND thishWnd; + NpComboBox mCbMaterial; CapsuleParamDlgProc(bhkCapsuleObject *s) {so=s;thishWnd=NULL;} - BOOL DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); + BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); void Update(TimeValue t); void DeleteThis() {delete this;} @@ -260,20 +194,34 @@ void CapsuleParamDlgProc::Update(TimeValue t) return; } -BOOL CapsuleParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) +BOOL CapsuleParamDlgProc::DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { thishWnd=hWnd; switch (msg) { case WM_INITDIALOG: { + mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL)); + for (const char **str = NpHvkMaterialNames; *str; ++str) + mCbMaterial.add(*str); + + int sel = NP_DEFAULT_HVK_MATERIAL; + Interval valid; + so->pblock2->GetValue( PB_MATERIAL, 0, sel, valid); + mCbMaterial.select( sel ); + Update(t); break; } case WM_COMMAND: - //switch (LOWORD(wParam)) - //{ - //} + switch (LOWORD(wParam)) + { + case IDC_CB_MATERIAL: + if (HIWORD(wParam)==CBN_SELCHANGE) { + so->pblock2->SetValue( PB_MATERIAL, 0, mCbMaterial.selection() ); + } + break; + } break; } return FALSE; @@ -285,115 +233,38 @@ BOOL CapsuleParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg, bhkCapsuleObject::bhkCapsuleObject(BOOL loading) { SetAFlag(A_PLUGIN1); - ReplaceReference(0, CreateParameterBlock(curDescVer, PBLOCK_LENGTH, CURRENT_VERSION)); - assert(pblock); - ReplaceReference(1, GetRBBlock()); - - pblock->SetValue(PB_RADIUS1,0,crtRadius1); - pblock->SetValue(PB_RADIUS2,0,crtRadius2); - pblock->SetValue(PB_CAP_POS1,0,crtCapPos1); - pblock->SetValue(PB_CAP_POS2,0,crtCapPos2); + capsuleDesc.MakeAutoParamBlocks(this); + assert(pblock2); } bhkCapsuleObject::~bhkCapsuleObject() { + param_blk.SetUserDlgProc(); CapsuleCreateCB.SetObj(NULL); if (pmapParam) { - pmapParam->SetUserDlgProc(NULL); - DestroyCPParamMap(pmapParam); pmapParam = NULL; } } -#define NEWMAP_CHUNKID 0x0100 - -IOResult bhkCapsuleObject::Load(ILoad *iload) -{ - ClearAFlag(A_PLUGIN1); - - IOResult res; - while (IO_OK==(res=iload->OpenChunk())) - { - switch (iload->CurChunkID()) - { - case NEWMAP_CHUNKID: - SetAFlag(A_PLUGIN1); - break; - } - iload->CloseChunk(); - if (res!=IO_OK) return res; - } - return IO_OK; -} - -IOResult bhkCapsuleObject::Save(ISave *isave) -{ - if (TestAFlag(A_PLUGIN1)) { - isave->BeginChunk(NEWMAP_CHUNKID); - isave->EndChunk(); - } - return IO_OK; -} - -RefTargetHandle bhkCapsuleObject::GetReference(int i) -{ - if (i == 1) - return GetRBBlock(); - return pblock; -} - -void bhkCapsuleObject::SetReference(int i, RefTargetHandle rtarg) -{ - if (i == 1) - return; - pblock=(IParamBlock*)rtarg; -} - -BaseInterface* bhkCapsuleObject::GetInterface(Interface_ID id) -{ - if (id == BHKRIGIDBODYINTERFACE_DESC) - return this; - return SimpleObject::GetInterface(id); -} - - - void bhkCapsuleObject::BeginEditParams(IObjParam *ip,ULONG flags,Animatable *prev) { SimpleObject::BeginEditParams(ip,flags,prev); - // Gotta make a new one. - if (NULL == pmapParam) - { - pmapParam = CreateCPParamMap( - descParam,PARAMDESC_LENGTH, - pblock, - ip, - hInstance, - MAKEINTRESOURCE(IDD_CAPSULEPARAM), - GetString(IDS_RB_PARAMETERS), - 0); - } + capsuleDesc.BeginEditParams(ip,this,flags,prev); + param_blk.SetUserDlgProc(new CapsuleParamDlgProc(this)); + pmapParam = pblock2->GetMap(cap_params); this->ip = ip; - - if(pmapParam) { - // A callback for the type in. - pmapParam->SetUserDlgProc(new CapsuleParamDlgProc(this)); - } - BeginEditRBParams(ip, flags, prev); } void bhkCapsuleObject::EndEditParams( IObjParam *ip, ULONG flags,Animatable *next ) { + param_blk.SetUserDlgProc(); SimpleObject::EndEditParams(ip,flags,next); this->ip = NULL; + pmapParam = NULL; - if (pmapParam && flags&END_EDIT_REMOVEUI ) { - pmapParam->SetUserDlgProc(NULL); - DestroyCPParamMap(pmapParam); - pmapParam = NULL; - } - EndEditRBParams(ip, flags, next); + // tear down the appropriate auto-rollouts + capsuleDesc.EndEditParams(ip, this, flags, next); } void bhkCapsuleObject::BuildMesh(TimeValue t) @@ -406,17 +277,13 @@ void bhkCapsuleObject::BuildMesh(TimeValue t) //FixHeight(pblock,t,(pmapParam?pmapParam->GetHWnd():NULL),increate); ivalid = FOREVER; - float radius1, radius2; - Point3 pos1, pos2; - pblock->GetValue(PB_RADIUS1,t,radius1,ivalid); - pblock->GetValue(PB_RADIUS2,t,radius2,ivalid); - pblock->GetValue(PB_CAP_POS1,t,pos1,ivalid); - pblock->GetValue(PB_CAP_POS2,t,pos2,ivalid); - LimitValue(radius1, MIN_RADIUS, MAX_RADIUS); - LimitValue(radius2, MIN_RADIUS, MAX_RADIUS); - if (radius2 == MIN_RADIUS) radius2 = radius1; - - if (radius1 == 0) + float radius1, radius2, length; + pblock2->GetValue(PB_RADIUS1,t,radius1,ivalid); + pblock2->GetValue(PB_RADIUS2,t,radius2,ivalid); + pblock2->GetValue(PB_LENGTH,t,length,ivalid); + if (radius2 == 0.0f) radius2 = radius1; + + if (radius1 == 0.0f) { mesh.setNumVerts(0); mesh.setNumFaces(0); @@ -426,7 +293,7 @@ void bhkCapsuleObject::BuildMesh(TimeValue t) } else { - BuildScubaMesh(mesh, segs, smooth, hsegs, radius2, radius1, pos2, pos1); + BuildScubaMesh(mesh, segs, smooth, hsegs, radius2, radius1, length); } } @@ -465,13 +332,19 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I switch(point) { case 0: // only happens with MOUSE_POINT msg - ob->pblock->SetValue(PB_RADIUS1,0,0.0f); - ob->pblock->SetValue(PB_RADIUS2,0,0.0f); + // Find the node and plug in the wire color + { + ULONG handle; + ob->NotifyDependents(FOREVER, (PartID)&handle, REFMSG_GET_NODE_HANDLE); + INode *node = GetCOREInterface()->GetINodeByHandle(handle); + if (node) node->SetWireColor(RGB(255, 0, 0)); + } + ob->pblock2->SetValue(PB_RADIUS1,0,0.0f); + ob->pblock2->SetValue(PB_RADIUS2,0,0.0f); ob->suspendSnap = TRUE; sp[0] = m; p[0] = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D); - ob->pblock->SetValue(PB_CAP_POS1,0,p[0]); - ob->pblock->SetValue(PB_CAP_POS2,0,p[0]); + ob->pblock2->SetValue(PB_LENGTH,0,0.0f); mat.SetTrans(p[0]); break; @@ -483,8 +356,8 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I r = Length(p[1]-p[0]); mat.SetTrans(p[0]); - ob->pblock->SetValue(PB_RADIUS1,0,r); - ob->pblock->SetValue(PB_RADIUS2,0,r); + ob->pblock2->SetValue(PB_RADIUS1,0,r); + ob->pblock2->SetValue(PB_RADIUS2,0,r); ob->pmapParam->Invalidate(); if (flags&MOUSE_CTRL) @@ -506,25 +379,21 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I //mat.PreRotateZ(HALFPI); sp[2] = m; p[2] = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D); - r = Length(p[1]-p[0]); + r = Length(p[2]-p[1]); mat.SetTrans(p[0]); - ob->pblock->SetValue(PB_CAP_POS2,0,p[2]); + ob->pblock2->SetValue(PB_LENGTH,0,r); ob->pmapParam->Invalidate(); - //if (flags&MOUSE_CTRL) - //{ - // float ang = (float)atan2(p1.y-p[0].y,p1.x-p[0].x); - // mat.PreRotateZ(ob->ip->SnapAngle(ang)); - //} - //if (msg==MOUSE_POINT) - //{ - // ob->suspendSnap = FALSE; - // return (Length(m-sp[0])<3 || Length(p1-p[0])<0.1f)?CREATE_ABORT:CREATE_STOP; - //} + // Stop unless Ctrl is selected then we size the final radius + if (msg==MOUSE_POINT && !(flags&MOUSE_CTRL) ) + { + ob->suspendSnap = FALSE; + return CREATE_STOP; + } break; - case 3: // Get second point + case 3: // Size the second cap mat.IdentityMatrix(); //mat.PreRotateZ(HALFPI); sp[3] = m; @@ -532,13 +401,13 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I if (flags&MOUSE_CTRL) // ignore radius { r = Length(p[1]-p[0]); - ob->pblock->SetValue(PB_RADIUS2,0,r); + ob->pblock2->SetValue(PB_RADIUS2,0,r); } else { // start radius at r1 r = Length((p[3]-p[2]) + (p[1]-p[0])); - ob->pblock->SetValue(PB_RADIUS2,0,r); + ob->pblock2->SetValue(PB_RADIUS2,0,r); } ob->pmapParam->Invalidate(); if (msg==MOUSE_POINT) @@ -567,7 +436,7 @@ CreateMouseCallBack* bhkCapsuleObject::GetCreateMouseCallBack() BOOL bhkCapsuleObject::OKtoDisplay(TimeValue t) { float radius; - pblock->GetValue(PB_RADIUS1,t,radius,FOREVER); + pblock2->GetValue(PB_RADIUS1,t,radius,FOREVER); if (radius==0.0f) return FALSE; else return TRUE; } @@ -577,40 +446,6 @@ void bhkCapsuleObject::InvalidateUI() if (pmapParam) pmapParam->Invalidate(); } -ParamDimension *bhkCapsuleObject::GetParameterDim(int pbIndex) -{ - switch (pbIndex) - { - case PB_RADIUS1: - return stdWorldDim; - case PB_RADIUS2: - return stdWorldDim; - case PB_CAP_POS1: - return stdWorldDim; - case PB_CAP_POS2: - return stdWorldDim; - default: - return defaultDim; - } -} - -TSTR bhkCapsuleObject::GetParameterName(int pbIndex) -{ - switch (pbIndex) - { - case PB_RADIUS1: - return TSTR(GetString(IDS_RB_RADIUS1)); - case PB_RADIUS2: - return TSTR(GetString(IDS_RB_RADIUS2)); - case PB_CAP_POS1: - return TSTR(GetString(IDS_RB_CAP_POS1)); - case PB_CAP_POS2: - return TSTR(GetString(IDS_RB_CAP_POS2)); - default: - return TSTR(_T("")); - } -} - RefTargetHandle bhkCapsuleObject::Clone(RemapDir& remap) { bhkCapsuleObject* newob = new bhkCapsuleObject(FALSE); @@ -642,7 +477,7 @@ void AddFace(Face *f,int a,int b,int c,int evis,int smooth_group) } void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, - float radius1, float radius2, Point3 cap1, Point3 cap2) + float radius1, float radius2, float cylh) { Point3 p; int ix,jx,ic = 1; @@ -691,7 +526,6 @@ void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, mesh.setSmoothFlags(smooth != 0); // bottom vertex - float cylh = (cap1 - cap2).Length(); float height = cylh + radius1 + radius2; mesh.setVert(nv, Point3(0.0f,0.0f,height)); mesh.setVert(nverts-1, Point3(0.0f,0.0f,0.0f)); @@ -828,7 +662,7 @@ void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, t0++;t1++; } for (i=0;i<nverts;i++) - mesh.verts[i].z -= radius2; + mesh.verts[i].z -= (radius2 + cylh/2.0f); if (edgelstr) delete []edgelstr; if (edgelstl) delete []edgelstl; @@ -837,174 +671,23 @@ void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, mesh.InvalidateTopologyCache(); } -#if 0 -void BuildCylinderMesh(Mesh &mesh, - int segs, int smooth, int llsegs, int capsegs, - float radius1, float radius2, float height, - int doPie, float pie1, float pie2) +int bhkCapsuleObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { - Point3 p; - int ix,na,nb,nc,nd,jx,kx, ic = 1; - int nf=0,nv=0, lsegs; - float delta,ang, u; - float totalPie, startAng = 0.0f; - - lsegs = llsegs-1 + 2*capsegs; - - // Make pie2 < pie1 and pie1-pie2 < TWOPI - while (pie1 < pie2) pie1 += TWOPI; - while (pie1 > pie2+TWOPI) pie1 -= TWOPI; - if (pie1==pie2) totalPie = TWOPI; - else totalPie = pie1-pie2; - - delta = (float)2.0*PI/(float)segs; - - if (height<0) delta = -delta; - - int nverts; - int nfaces; - nverts = 2+segs*(lsegs); - nfaces = 2*segs*(lsegs); - mesh.setNumVerts(nverts); - mesh.setNumFaces(nfaces); - mesh.setSmoothFlags(smooth != 0); - mesh.setNumTVerts(0); - mesh.setNumTVFaces(0); - - // bottom vertex - mesh.setVert(nv, Point3(0.0,0.0,0.0)); - nv++; - - // Bottom cap vertices - for(ix=0; ix<capsegs; ix++) { - - // Put center vertices all the way up - p.z = 0.0f; - u = float(ix+1)/float(capsegs); - ang = startAng; - for (jx = 0; jx<segs; jx++) { - p.x = (float)cos(ang)*radius1*u; - p.y = (float)sin(ang)*radius1*u; - mesh.setVert(nv, p); - nv++; - ang += delta; - } - } - - // Middle vertices - for(ix=1; ix<llsegs; ix++) { - - // Put center vertices all the way up - float u = float(ix)/float(llsegs); - float rad = (radius1*(1.0f-u) + radius2*u); - p.z = height*((float)ix/float(llsegs)); - ang = startAng; - for (jx = 0; jx<segs; jx++) { - p.x = (float)cos(ang)*rad; - p.y = (float)sin(ang)*rad; - mesh.setVert(nv, p); - nv++; - ang += delta; - } - } - - // Top cap vertices - for(ix=0; ix<capsegs; ix++) { - - // Put center vertices all the way up - p.z = height; - u = 1.0f-float(ix)/float(capsegs); - ang = startAng; - for (jx = 0; jx<segs; jx++) { - p.x = (float)cos(ang)*radius2*u; - p.y = (float)sin(ang)*radius2*u; - mesh.setVert(nv, p); - nv++; - ang += delta; - } - } - - /* top vertex */ - mesh.setVert(nv, (float)0.0, (float)0.0, height); - nv++; - - // Now make faces --- - - BitArray startSliceFaces; - BitArray endSliceFaces; - BitArray topCapFaces; - BitArray botCapFaces; - - // Make bottom cap - - for(ix=1; ix<=segs; ++ix) { - nc=(ix==segs)?1:ix+1; - mesh.faces[nf].setEdgeVisFlags(capsegs>1,1,capsegs>1); - mesh.faces[nf].setSmGroup(1); - mesh.faces[nf].setVerts(0,nc,ix); - mesh.faces[nf].setMatID(1); - nf++; - } - - int topCapStartFace = 0; - - /* Make midsection */ - for(ix=0; ix<lsegs-1; ++ix) { - jx=ix*segs+1; - for(kx=0; kx<segs; ++kx) { - DWORD grp = 0; - int mtlid; - BOOL inSlice = FALSE; - - if (kx==segs) { - mtlid = 4; - grp = (1<<2); - inSlice = TRUE; - } else if (ix < capsegs-1 || ix >= capsegs+llsegs-1) { - grp = 1; - mtlid = (ix<capsegs-1)?0:1; - } else { - mtlid = 2; - if (smooth) { - grp = (1<<3); - } - } - - na = jx+kx; - nb = na+segs; - nc = (kx==(segs-1))? jx+segs: nb+1; - nd = (kx==(segs-1))? jx : na+1; - - mesh.faces[nf].setEdgeVisFlags(0,!inSlice,1); - mesh.faces[nf].setSmGroup(grp); - mesh.faces[nf].setVerts(na,nc,nb); - mesh.faces[nf].setMatID(mtlid); - nf++; - - mesh.faces[nf].setEdgeVisFlags(!inSlice,1,0); - mesh.faces[nf].setSmGroup(grp); - mesh.faces[nf].setVerts(na,nd,nc); - mesh.faces[nf].setMatID(mtlid); - nf++; - } - } - - //Make Top cap - na = mesh.getNumVerts()-1; - jx = (lsegs-1)*segs+1; - - for(ix=0; ix<segs; ++ix) { - nb = jx+ix; - nc = (ix==segs-1)? jx: nb+1; - mesh.faces[nf].setEdgeVisFlags(capsegs>1,1,capsegs>1); - mesh.faces[nf].setSmGroup( 1); - mesh.faces[nf].setVerts(na,nb,nc); - mesh.faces[nf].setMatID(0); - nf++; - } - - assert(nf==mesh.numFaces); - assert(nv==mesh.numVerts); - mesh.InvalidateTopologyCache(); -} -#endif \ No newline at end of file + Matrix3 m; + Color color = Color(inode->GetWireColor()); + GraphicsWindow *gw = vpt->getGW(); + Material *mtl = gw->getMaterial(); + m = inode->GetObjectTM(t); + gw->setTransform(m); + DWORD rlim = gw->getRndLimits(); + gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY/*|GW_Z_BUFFER*/); + if (inode->Selected()) + gw->setColor( LINE_COLOR, GetSelColor()); + else if(!inode->IsFrozen() && !inode->Dependent()) + gw->setColor( LINE_COLOR, color); + + UpdateMesh(t); + mesh.render( gw, mtl, NULL, COMP_ALL); + gw->setRndLimits(rlim); + return 0; +} \ No newline at end of file diff --git a/NifProps/bhkRigidBodyInterface.cpp b/NifProps/bhkRigidBodyInterface.cpp index 24c62f1..ddc99fa 100644 --- a/NifProps/bhkRigidBodyInterface.cpp +++ b/NifProps/bhkRigidBodyInterface.cpp @@ -30,7 +30,7 @@ HISTORY: FPInterfaceDesc thebhkRigidBodyInterface( BHKRIGIDBODYINTERFACE_DESC, _T("bhkRigidBody"), -1/*IDS_OPS*/, 0, FP_CORE, properties, - bhkRigidBodyInterface::get_material, bhkRigidBodyInterface::set_material, _T("Material"), 0, TYPE_ENUM, bhkRigidBodyInterface::enum_material, + //bhkRigidBodyInterface::get_material, bhkRigidBodyInterface::set_material, _T("Material"), 0, TYPE_ENUM, bhkRigidBodyInterface::enum_material, bhkRigidBodyInterface::get_layer, bhkRigidBodyInterface::set_layer, _T("Layer"), 0, TYPE_ENUM, bhkRigidBodyInterface::enum_layer, bhkRigidBodyInterface::get_mass, bhkRigidBodyInterface::set_mass, _T("Mass"), 0, TYPE_FLOAT, bhkRigidBodyInterface::get_friction, bhkRigidBodyInterface::set_friction, _T("Friction"), 0, TYPE_FLOAT, @@ -238,7 +238,7 @@ static ParamUIDesc descRigidBodyParam[] = { const int descRigidBodyParamLength = _countof(descRigidBodyParam); static ParamBlockDescID gRigidBlockParamDesc[] = { - { TYPE_INT, NULL, FALSE, PB_RB_MATERIAL }, + //{ TYPE_INT, NULL, FALSE, PB_RB_MATERIAL }, { TYPE_INT, NULL, FALSE, PB_RB_LAYER }, { TYPE_FLOAT, NULL, FALSE, PB_RB_MASS }, { TYPE_FLOAT, NULL, FALSE, PB_RB_FRICTION }, @@ -258,7 +258,7 @@ public: bhkRigidBodyInterface *so; HWND thishWnd; NpComboBox mCbLayer; - NpComboBox mCbMaterial; + //NpComboBox mCbMaterial; NpComboBox mCbMotionSystem; NpComboBox mCbQualityType; @@ -283,7 +283,7 @@ void RigidBodyParamDlgProc::Update(TimeValue t) return; - mCbMaterial.select(max(0, min(so->GetMaterial(t), mCbMaterial.count()-1))); + //mCbMaterial.select(max(0, min(so->GetMaterial(t), mCbMaterial.count()-1))); mCbLayer.select(max(0, min(so->GetLayer(t), mCbLayer.count()-1))); mCbMotionSystem.select(max(0, min(so->GetMotionSystem(t), mCbMotionSystem.count()-1))); mCbQualityType.select(max(0, min(so->GetQualityType(t), mCbQualityType.count()-1))); @@ -297,9 +297,9 @@ BOOL RigidBodyParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT ms { case WM_INITDIALOG: { - mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL)); - for (const char **str = NpHvkMaterialNames; *str; ++str) - mCbMaterial.add(*str); + //mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL)); + //for (const char **str = NpHvkMaterialNames; *str; ++str) + // mCbMaterial.add(*str); mCbLayer.init(GetDlgItem(hWnd, IDC_CB_LAYER)); for (const char **str = NpHvkLayerNames; *str; ++str) @@ -319,11 +319,11 @@ BOOL RigidBodyParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT ms case WM_COMMAND: switch (LOWORD(wParam)) { - case IDC_CB_MATERIAL: - if (HIWORD(wParam)==CBN_SELCHANGE) { - so->SetMaterial( mCbMaterial.selection(), t ); - } - break; + //case IDC_CB_MATERIAL: + // if (HIWORD(wParam)==CBN_SELCHANGE) { + // so->SetMaterial( mCbMaterial.selection(), t ); + // } + // break; case IDC_CB_LAYER: if (HIWORD(wParam)==CBN_SELCHANGE) { @@ -356,7 +356,7 @@ IObjParam *bhkRigidBodyIfcHelper::rbip = NULL; bhkRigidBodyIfcHelper::bhkRigidBodyIfcHelper() { rbpblock = CreateParameterBlock(gRigidBlockParamDesc, descRigidBodyDescIDLength, 1); - rbpblock->SetValue(PB_RB_MATERIAL,0,NP_DEFAULT_HVK_MATERIAL); + //rbpblock->SetValue(PB_RB_MATERIAL,0,NP_DEFAULT_HVK_MATERIAL); rbpblock->SetValue(PB_RB_LAYER,0,NP_DEFAULT_HVK_LAYER); rbpblock->SetValue(PB_RB_MASS,0,NP_DEFAULT_HVK_MASS); rbpblock->SetValue(PB_RB_FRICTION,0,NP_DEFAULT_HVK_FRICTION); @@ -395,7 +395,7 @@ void bhkRigidBodyIfcHelper::BeginEditRBParams(IObjParam *ip,ULONG flags,Animatab rbpblock, ip, hInstance, - MAKEINTRESOURCE(IDD_RigidBody), + MAKEINTRESOURCE(IDD_RIGIDBODY), GetString(IDS_RB_RIGIDBODY_PARAM), 0); } @@ -417,17 +417,17 @@ void bhkRigidBodyIfcHelper::EndEditRBParams( IObjParam *ip, ULONG flags,Animatab } -void bhkRigidBodyIfcHelper::SetMaterial(int value, TimeValue time) -{ - rbpblock->SetValue(PB_RB_MATERIAL,time,value); -} - -int bhkRigidBodyIfcHelper::GetMaterial(TimeValue time, Interval& valid) const -{ - int value = NP_DEFAULT_HVK_MATERIAL; - rbpblock->GetValue(PB_RB_MATERIAL,time,value,valid); - return value; -} +//void bhkRigidBodyIfcHelper::SetMaterial(int value, TimeValue time) +//{ +// rbpblock->SetValue(PB_RB_MATERIAL,time,value); +//} +// +//int bhkRigidBodyIfcHelper::GetMaterial(TimeValue time, Interval& valid) const +//{ +// int value = NP_DEFAULT_HVK_MATERIAL; +// rbpblock->GetValue(PB_RB_MATERIAL,time,value,valid); +// return value; +//} void bhkRigidBodyIfcHelper::SetLayer(int value, TimeValue time) { diff --git a/NifProps/bhkRigidBodyInterface.h b/NifProps/bhkRigidBodyInterface.h index 28cab3e..4756f4f 100644 --- a/NifProps/bhkRigidBodyInterface.h +++ b/NifProps/bhkRigidBodyInterface.h @@ -23,14 +23,16 @@ HISTORY: //! The unique instance of the rigid body interface extern CoreExport FPInterfaceDesc gbhkRigidBodyDesc; -#define BHKRIGIDBODYINTERFACE_DESC Interface_ID(0x056aad53, 0x52c54024) +#define BHKRIGIDBODYCLASS_DESC Class_ID(0x00000000, 0x1d88470a) +const Interface_ID BHKRIGIDBODYINTERFACE_DESC(0x056aad53, 0x52c54024); + extern FPInterfaceDesc* GetbhkRigidBodyInterfaceDesc(); class bhkRigidBodyInterface : public FPMixinInterface { public: - virtual void SetMaterial(int value, TimeValue time) = 0; - virtual int GetMaterial(TimeValue time, Interval& valid = FOREVER) const = 0 ; + //virtual void SetMaterial(int value, TimeValue time) = 0; + //virtual int GetMaterial(TimeValue time, Interval& valid = FOREVER) const = 0 ; virtual void SetLayer(int value, TimeValue time) = 0; virtual int GetLayer(TimeValue time, Interval& valid = FOREVER) const = 0 ; @@ -84,7 +86,7 @@ public: //Function Map For Mixin Interface //************************************************* BEGIN_FUNCTION_MAP - PROP_TFNS(get_material, GetMaterial, set_material, SetMaterial, TYPE_INT); + //PROP_TFNS(get_material, GetMaterial, set_material, SetMaterial, TYPE_INT); PROP_TFNS(get_layer, GetLayer, set_layer, SetLayer, TYPE_INT); PROP_TFNS(get_mass, GetMass, set_mass, SetMass, TYPE_FLOAT); PROP_TFNS(get_friction, GetFriction, set_friction, SetFriction, TYPE_FLOAT); @@ -107,7 +109,7 @@ public: // Parameter block indices enum RigidBodyParamIndicies { - PB_RB_MATERIAL, + //PB_RB_MATERIAL, PB_RB_LAYER, PB_RB_MASS, PB_RB_FRICTION, @@ -131,8 +133,8 @@ public: void BeginEditRBParams(IObjParam *ip,ULONG flags,Animatable *prev); void EndEditRBParams(IObjParam *ip,ULONG flags,Animatable *next); - virtual void SetMaterial(int value, TimeValue time); - virtual int GetMaterial(TimeValue time, Interval& valid = FOREVER) const ; + //virtual void SetMaterial(int value, TimeValue time); + //virtual int GetMaterial(TimeValue time, Interval& valid = FOREVER) const ; virtual void SetLayer(int value, TimeValue time); virtual int GetLayer(TimeValue time, Interval& valid = FOREVER) const ; diff --git a/NifProps/bhkRigidBodyModifer.cpp b/NifProps/bhkRigidBodyModifer.cpp new file mode 100644 index 0000000..48c50f3 --- /dev/null +++ b/NifProps/bhkRigidBodyModifer.cpp @@ -0,0 +1,763 @@ +#pragma warning( disable:4800 ) + +#include <map> +#include "NifProps.h" +#include "NifStrings.h" +#include "NifPlugins.h" +#include "NifGui.h" +#include "bhkRigidBodyInterface.h" + +using namespace std; + +#define PBLOCK_REF 0 +const Class_ID BHKRIGIDBODYMODIFIER_CLASS_ID = Class_ID(0x398fd801, 0x303e44e5); +class PickObjectMode; + +extern void BuildBox(Mesh&mesh, float l, float w, float h); +extern void BuildSphere(Mesh&mesh, float radius, int segs=32, int smooth=1, float startAng = 0.0f); +extern void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, + float radius1, float radius2, float cylh); + +void CalcAxisAlignedBox(Mesh& mesh, Box3& box) +{ + int nv = mesh.getNumVerts(); + box.IncludePoints(mesh.getVertPtr(0), nv, NULL); +} + +// Calculate bounding sphere using minimum-volume axis-align bounding box. Its fast but not a very good fit. +void CalcAxisAlignedSphere(Mesh& mesh, Point3& center, float& radius) +{ + //--Calculate center & radius--// + + //Set lows and highs to first vertex + int nv = mesh.getNumVerts(); + + Point3 lows = mesh.getVert(0); + Point3 highs = mesh.getVert(0); + + //Iterate through the vertices, adjusting the stored values + //if a vertex with lower or higher values is found + for ( unsigned int i = 0; i < nv; ++i ) { + const Point3 & v = mesh.getVert(i); + + if ( v.x > highs.x ) highs.x = v.x; + else if ( v.x < lows.x ) lows.x = v.x; + + if ( v.y > highs.y ) highs.y = v.y; + else if ( v.y < lows.y ) lows.y = v.y; + + if ( v.z > highs.z ) highs.z = v.z; + else if ( v.z < lows.z ) lows.z = v.z; + } + + //Now we know the extent of the shape, so the center will be the average + //of the lows and highs + center = (highs + lows) / 2.0f; + + //The radius will be the largest distance from the center + Point3 diff; + float dist2(0.0f), maxdist2(0.0f); + for ( unsigned int i = 0; i < nv; ++i ) { + const Point3 & v = mesh.getVert(i); + + diff = center - v; + dist2 = diff.x * diff.x + diff.y * diff.y + diff.z * diff.z; + if ( dist2 > maxdist2 ) maxdist2 = dist2; + }; + radius = sqrt(maxdist2); +} + +// Calculate bounding sphere using average position of the points. Better fit but slower. +void CalcCenteredSphere(Mesh& mesh, Point3& center, float& radius) +{ + size_t nv = mesh.getNumVerts(); + Point3 sum; + for (size_t i=0; i<nv; ++i) + sum += mesh.getVert(i); + center = sum / float(nv); + float radsq = 0.0f; + for (size_t i=0; i<nv; ++i){ + Point3 diff = mesh.getVert(i) - center; + float mag = diff.LengthSquared(); + radsq = max(radsq, mag); + } + radius = Sqrt(radsq); +} + + +class bhkValidatorClass : public PBValidator +{ +public: + class bhkRigidBodyModifier *mod; +private: + BOOL Validate(PB2Value &v) + { + INode *node = (INode*) v.r; + if (node->TestForLoop(FOREVER,(ReferenceMaker *) mod)!=REF_SUCCEED) return FALSE; + + ObjectState os = node->EvalWorldState(0); + //Allow only tri object derived objects + if (os.obj->CanConvertToType(triObjectClassID) && os.obj->SuperClassID() != SHAPE_CLASS_ID) { + return TRUE; + } + // and out objects which support the RigidBodyInterface + //if (os.obj->SuperClassID() == HELPER_CLASS_ID && NULL != GetInterface(BHKRIGIDBODYINTERFACE_DESC)) { + // return TRUE; + //} + if (os.obj->SuperClassID() == HELPER_CLASS_ID && os.obj->ClassID().PartB() == BHKRIGIDBODYCLASS_DESC.PartB() ) { + return TRUE; + } + return FALSE; + }; +}; + +enum { bv_type_none, bv_type_box, bv_type_sphere, bv_type_capsule, bv_type_mesh }; // pblock ID + +class bhkRigidBodyModifier : public Modifier, public bhkRigidBodyIfcHelper +{ + +public: + + bhkRigidBodyModifier(); + ~bhkRigidBodyModifier(); + + void DeleteThis() { delete this; } + void GetClassName(TSTR& s) { s = "bhkRigidBodyModifier"; } + virtual Class_ID ClassID() { return BHKRIGIDBODYMODIFIER_CLASS_ID; } + RefTargetHandle Clone(RemapDir& remap); + TCHAR *GetObjectName() { return "bhkRigidBodyModifier"; } + + // From modifier + ChannelMask ChannelsUsed() {return PART_GEOM|PART_TOPO;} + ChannelMask ChannelsChanged() {return PART_GEOM;} +// ChannelMask ChannelsUsed() { return 0; } +// ChannelMask ChannelsChanged() { return 0; } + Class_ID InputType() { return mapObjectClassID; } + void ModifyObject (TimeValue t, ModContext &mc, ObjectState *os, INode *node); + Interval LocalValidity(TimeValue t) { return GetValidity(t); } + Interval GetValidity (TimeValue t); + BOOL DependOnTopology(ModContext &mc) { return TRUE; } + void NotifyInputChanged(Interval changeInt, PartID partID, RefMessage message, ModContext *mc); + + void BeginEditParams (IObjParam *ip, ULONG flags,Animatable *prev); + void EndEditParams (IObjParam *ip,ULONG flags,Animatable *next); + + int Display(TimeValue t, INode* inode, ViewExp *vpt, int flagst, ModContext *mc); + + + void SelectionSetChanged(Interface *ip,IUtil *iu); + + void selectionChanged(); + void saveState(); + BOOL dlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + + // ParamBlock2 access: + int NumParamBlocks () { return 1; } + IParamBlock2* GetParamBlock(int i) + { + if (i == 0) return pblock; + return NULL; + } + IParamBlock2* GetParamBlockByID(BlockID id) { + if (pblock->ID() == id) return pblock; + return NULL; + } + + CreateMouseCallBack* GetCreateMouseCallBack() {return NULL;} + + virtual int NumRefs(); + virtual RefTargetHandle GetReference(int i); + virtual void SetReference(int i, RefTargetHandle rtarg); + virtual RefResult NotifyRefChanged(Interval,RefTargetHandle,PartID &,RefMessage); + + int NumSubs() {return 1;} + Animatable* SubAnim(int i) { return GetReference(i); } + TSTR SubAnimName(int i) {return GetString (IDS_PARAMS);} + + BOOL SetObject(INode *newNode); + INode* GetObject(); + + void UpdateBVDialogs(); + + BaseInterface *GetInterface(Interface_ID id) { + if (id == BHKRIGIDBODYINTERFACE_DESC) + return this; + return Modifier::GetInterface(id); + } + +public: + friend class PickObjectMode; + + StdMat2* collMat; + Mesh mesh; + + PickObjectMode *pickObMode; + IParamBlock2 *pblock; + IParamMap2 *pmapParam; + IParamMap2 *pbvParams[4]; //box, sphere, capsule, proxy + + Interface *mIP; + Tab<INode*> mNodes; + + NpComboBox mCbLayer; + NpComboBox mCbMaterial; + NpComboBox mCbMotionSystem; + NpComboBox mCbQualityType; + bhkValidatorClass validator; + ICustButton *iPickButton; + + void enableGUI(BOOL object, BOOL hvk, BOOL anim); +}; + +extern ClassDesc2* GetbhkRigidBodyModifierDesc(); +static ParamBlockDesc2& get_havok_param_blk(); + +class bhkRigidBodyModifierClassDesc : public ClassDesc2 +{ + public: + bhkRigidBodyModifierClassDesc() { + get_havok_param_blk().SetClassDesc(this); + } + int IsPublic() { return TRUE; } + void * Create(BOOL loading = FALSE) { + return new bhkRigidBodyModifier(); + } + const TCHAR * ClassName() { return GetString(IDS_RB_CLASS_NAME); } + SClass_ID SuperClassID() { return OSM_CLASS_ID; } + Class_ID ClassID() { return BHKRIGIDBODYMODIFIER_CLASS_ID; } + const TCHAR* Category() { return GetString(IDS_CATEGORY); } + + const TCHAR* InternalName() { return _T("bhkRigidBodyModifier"); } + HINSTANCE HInstance() { return hInstance; } +}; + + + +// Parameter and ParamBlock IDs +enum { havok_params, bv_box, bv_sphere, bv_capsule, bv_mesh}; // pblock ID +enum { PB_BOUND_TYPE, PB_MESHLIST, }; +enum { havok_params_panel, }; + +class BVTypePBAccessor : public PBAccessor +{ +public: + + void Set(PB2Value& v, ReferenceMaker* owner, ParamID id, int tabIndex, TimeValue t) // set from v + { + bhkRigidBodyModifier* p = (bhkRigidBodyModifier*)owner; + switch (id) + { + case PB_BOUND_TYPE: + { + switch (v.i) + { + case bv_type_none: + // Delete mesh. + break; + + case bv_type_box: // Box + + //BuildBox(mesh,,,) + break; + + case bv_type_sphere: // Sphere + //BuildSphere(); + break; + + case bv_type_capsule: // Capsule + //BuildScubaMesh(); + break; + + case bv_type_mesh: + break; + } + } + } + } +}; + + +static BVTypePBAccessor bv_type_accessor; + + +static ParamBlockDesc2 havok_param_blk ( + havok_params, _T("BoundingVolumes"), 0, NULL, P_AUTO_CONSTRUCT + P_AUTO_UI + P_MULTIMAP, PBLOCK_REF, + //rollout + 2, + havok_params, IDD_RB_MOD_PANEL, IDS_PARAMS, 0, 0, NULL, + bv_mesh, IDD_RB_MOD_PANEL4, IDS_RB_MOD_PANEL4, 0, 0, NULL, + + PB_BOUND_TYPE, _T("boundType"), TYPE_INT, 0, IDS_BV_BOUNDING_TYPE, + p_default, 0, + p_range, 0, 4, + p_ui, havok_params, TYPE_RADIO, 5, IDC_RDO_NO_COLL, IDC_RDO_AXIS_ALIGNED_BOX, IDC_RDO_SPHERE, IDC_RDO_CAPSULE, IDC_RDO_PROXY_MESH, + p_accessor, &bv_type_accessor, + end, + + PB_MESHLIST, _T("meshList"), TYPE_INODE_TAB, 0, P_AUTO_UI|P_VARIABLE_SIZE, IDS_MESHLIST, + p_ui, bv_mesh, TYPE_NODELISTBOX, IDC_LIST1,IDC_ADD,0,IDC_REMOVE, + end, + +#if 0 + // params + PB_RB_LAYER, _T("Layer"), TYPE_INT, 0, IDS_DS_LAYER, + p_default, NP_DEFAULT_HVK_LAYER, + end, + + PB_RB_MATERIAL, _T("Material"), TYPE_INT, 0, IDS_DS_MATERIAL, + p_default, NP_DEFAULT_HVK_MATERIAL, + end, + + PB_RB_MASS, _T("mass"), TYPE_FLOAT, 0, IDS_DS_MASS, + p_default, NP_DEFAULT_HVK_MASS, + p_range, 0.0, 1000.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_MASS, IDC_SP_MASS, SPIN_AUTOSCALE, + end, + + PB_RB_FRICTION, _T("friction"), TYPE_FLOAT, 0, IDS_DS_FRICTION, + p_default, NP_DEFAULT_HVK_FRICTION, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_FRICTION, IDC_SP_FRICTION, SPIN_AUTOSCALE, + end, + + PB_RB_RESTITUTION, _T("restitution"), TYPE_FLOAT, 0, IDS_DS_RESTITUTION, + p_default, NP_DEFAULT_HVK_RESTITUTION, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_RESTITUTION, IDC_SP_RESTITUTION, SPIN_AUTOSCALE, + end, + + PB_RB_LINEAR_DAMPING, _T("linear_damping"), TYPE_FLOAT, 0, IDS_DS_LINEAR_DAMPING, + p_default, NP_DEFAULT_HVK_LINEAR_DAMPING, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_LINEAR_DAMPING, IDC_SP_LINEAR_DAMPING, SPIN_AUTOSCALE, + end, + + PB_RB_ANGULAR_DAMPING, _T("angular_damping"), TYPE_FLOAT, 0, IDS_DS_ANGULAR_DAMPING, + p_default, NP_DEFAULT_HVK_ANGULAR_DAMPING, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_ANGULAR_DAMPING, IDC_SP_ANGULAR_DAMPING, SPIN_AUTOSCALE, + end, + + PB_RB_MAX_LINEAR_VELOCITY, _T("max_linear_velocity"), TYPE_FLOAT, 0, IDS_DS_MAX_LINEAR_VELOCITY, + p_default, NP_DEFAULT_HVK_MAX_LINEAR_VELOCITY, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_MAX_LINEAR_VELOCITY, IDC_SP_MAX_LINEAR_VELOCITY, SPIN_AUTOSCALE, + end, + + PB_RB_MAX_ANGULAR_VELOCITY, _T("max_angular_velocity"), TYPE_FLOAT, 0, IDS_DS_MAX_ANGULAR_VELOCITY, + p_default, NP_DEFAULT_HVK_MAX_ANGULAR_VELOCITY, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_MAX_ANGULAR_VELOCITY, IDC_SP_MAX_ANGULAR_VELOCITY, SPIN_AUTOSCALE, + end, + + PB_RB_PENETRATION_DEPTH, _T("penetration_depth"), TYPE_FLOAT, 0, IDS_DS_PENETRATION_DEPTH, + p_default, NP_DEFAULT_HVK_PENETRATION_DEPTH, + p_range, 0.0, 10.0, + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_ED_PENETRATION_DEPTH, IDC_SP_PENETRATION_DEPTH, SPIN_AUTOSCALE, + end, + + PB_RB_MOTION_SYSTEM, _T("motion_system"), TYPE_INT, 0, IDS_DS_MOTION_SYSTEM, + p_default, NP_DEFAULT_HVK_MOTION_SYSTEM, + end, + + PB_RB_QUALITY_TYPE, _T("quality_type"), TYPE_INT, 0, IDS_DS_QUALITY_TYPE, + p_default, NP_DEFAULT_HVK_QUALITY_TYPE, + end, +#endif + + + //PB_HK_NODE, _T("node"), TYPE_INODE, 0, IDS_DS_NODE, + // p_ui, TYPE_PICKNODEBUTTON, IDC_PICK_NODE, + // p_prompt, IDS_PICKNODE_PROMPT, + // //p_validator, &validator, + end, + end + ); + +static bhkRigidBodyModifierClassDesc bhkRigidBodyModifierDesc; +ClassDesc2* GetbhkRigidBodyModifierDesc() { return &bhkRigidBodyModifierDesc; } +ParamBlockDesc2& get_havok_param_blk() { + return havok_param_blk; +} + + +class PickObjectMode : + public PickModeCallback, + public PickNodeCallback { +public: + bhkRigidBodyModifier *mod; + + BOOL HitTest(IObjParam *ip,HWND hWnd,ViewExp *vpt,IPoint2 m,int flags); + BOOL Pick(IObjParam *ip,ViewExp *vpt); + void EnterMode(IObjParam *ip); + void ExitMode(IObjParam *ip); + BOOL RightClick(IObjParam *ip,ViewExp *vpt) {return TRUE;} + BOOL Filter(INode *node); + PickNodeCallback *GetFilter() {return this;} +}; + +//--- PickObjectMode ------------------------------------------------ + +BOOL PickObjectMode::Filter(INode *node) +{ + if (node) { + node->BeginDependencyTest(); + mod->NotifyDependents(FOREVER,0,REFMSG_TEST_DEPENDENCY); + if (node->EndDependencyTest()) { + return FALSE; + } + ////added code for looptest + //if (node->TestForLoop(FOREVER,(ReferenceMaker *) mod)!=REF_SUCCEED) + // return FALSE; + + for (int i = 0;i < mod->pblock->Count(PB_MESHLIST); i++) { + INode *tnode = NULL; + mod->pblock->GetValue(PB_MESHLIST,0,tnode,FOREVER,i); + if (node == tnode) + return FALSE; + } + + ObjectState os = node->EvalWorldState(0); + //added code such that lines are not selected + if ( (os.obj->IsSubClassOf(triObjectClassID) || os.obj->CanConvertToType(triObjectClassID)) + && (os.obj->SuperClassID() != SHAPE_CLASS_ID) + ) + { + return TRUE; + } + if (os.obj->SuperClassID() == HELPER_CLASS_ID && os.obj->ClassID().PartB() == BHKRIGIDBODYCLASS_DESC.PartB() ) { + return TRUE; + } + } + return FALSE; +} + +BOOL PickObjectMode::HitTest( + IObjParam *ip,HWND hWnd,ViewExp *vpt,IPoint2 m,int flags) +{ + INode *node = mod->mIP->PickNode(hWnd,m, this); //added "this" argument such that the Filter above is used + return node?TRUE:FALSE; +} + +BOOL PickObjectMode::Pick(IObjParam *ip,ViewExp *vpt) +{ + BOOL rv = FALSE; + if (INode *node = vpt->GetClosestHit()) { + theHold.Begin(); + ObjectState os = node->EvalWorldState(0); + if (os.obj->CanConvertToType(triObjectClassID)) { + mod->pblock->Append(PB_MESHLIST,1,&node,1); + rv = TRUE; + } + theHold.Accept(GetString(IDS_ADD_MESH)); + } + return rv; +} + +void PickObjectMode::EnterMode(IObjParam *ip) +{mod->iPickButton->SetCheck(TRUE);} + +void PickObjectMode::ExitMode(IObjParam *ip) +{mod->iPickButton->SetCheck(FALSE);} + +static PickObjectMode thePickMode; + +class bhkRigidBodyModifierDlgProc : public ParamMap2UserDlgProc { +public: + bhkRigidBodyModifier *mod; + bhkRigidBodyModifierDlgProc(bhkRigidBodyModifier* m) {mod = m;} + BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); + void DeleteThis() {delete this;} +}; + +BOOL bhkRigidBodyModifierDlgProc::DlgProc (TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + //mod->iPickButton = GetICustButton(GetDlgItem(hWnd, IDC_ADD)); + //mod->iPickButton->SetType(CBT_CHECK); + //mod->iPickButton->SetHighlightColor(GREEN_WASH); + break; + + case WM_DESTROY: + if (mod && mod->iPickButton != NULL) { + ReleaseICustButton(mod->iPickButton); + mod->iPickButton = NULL; + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_ADD: + { + thePickMode.mod = mod; + GetCOREInterface()->SetPickMode(&thePickMode); + break; + } + } + break; + + default: + return FALSE; + } + + return TRUE; +} + +//--- bhkRigidBodyModifier ------------------------------------------------------- + +bhkRigidBodyModifier::bhkRigidBodyModifier() +{ + mIP = NULL; + pblock = NULL; + pmapParam = NULL; + pickObMode = NULL; + validator.mod = this; + iPickButton = NULL; + bhkRigidBodyModifierDesc.MakeAutoParamBlocks(this); + + collMat = NewDefaultStdMat(); + collMat->SetDiffuse(Color(1.0f, 0.0f, 0.0f), 0); + collMat->SetWire(TRUE); +} + +bhkRigidBodyModifier::~bhkRigidBodyModifier() +{ + havok_param_blk.SetUserDlgProc(); +#if 0 + if (NULL != pickObMode) { + delete pickObMode; + pickObMode = NULL; + } +#endif + if (pmapParam) { + DestroyCPParamMap2 (pmapParam); + pmapParam = NULL; + } +} + +RefTargetHandle bhkRigidBodyModifier::Clone(RemapDir& remap) { + bhkRigidBodyModifier *mod = new bhkRigidBodyModifier(); + mod->ReplaceReference(0,remap.CloneRef(GetReference(0))); + mod->ReplaceReference(1,remap.CloneRef(GetReference(1))); + BaseClone(this, mod, remap); + return mod; +} + + +int bhkRigidBodyModifier::NumRefs() +{ + return 2; +} + +RefTargetHandle bhkRigidBodyModifier::GetReference(int i) +{ + if (i==0) return pblock; + if (i==1) return GetRBBlock(); + return NULL; +} + +void bhkRigidBodyModifier::SetReference(int i, RefTargetHandle rtarg) +{ + if (i==0) pblock = (IParamBlock2*)rtarg; +} + +RefResult bhkRigidBodyModifier::NotifyRefChanged( + Interval changeInt, + RefTargetHandle hTarget, + PartID& partID, + RefMessage message) +{ + switch (message) + { + case REFMSG_CHANGE: + ParamID changing_param = pblock->LastNotifyParamID(); + havok_param_blk.InvalidateUI(changing_param); + if (changing_param == PB_MESHLIST) + { + if (partID == PART_TOPO) { + NotifyDependents(FOREVER,GEOM_CHANNEL,REFMSG_CHANGE); + } + } + break; + } + return REF_SUCCEED; +} + +Interval bhkRigidBodyModifier::GetValidity (TimeValue t) { + Interval ret = FOREVER; + pblock->GetValidity (t, ret); + return ret; +} + +void bhkRigidBodyModifier::ModifyObject (TimeValue t, ModContext &mc, ObjectState *os, INode *inode) +{ +OutputDebugString("bhkRigidBodyModifier::ModifyObject\n"); + + Box3 box; box.Init(); + if (TriObject *tri = (TriObject *)os->obj->ConvertToType(t, Class_ID(TRIOBJ_CLASS_ID, 0))) + { + CalcAxisAlignedBox(tri->GetMesh(), box); + BuildBox(mesh, box.Max().x-box.Min().x, box.Max().y-box.Min().y, box.Max().z-box.Min().z); + } + //Modifier::ModifyObject(t, mc, os, inode); +} +void bhkRigidBodyModifier::NotifyInputChanged(Interval changeInt, PartID partID, RefMessage message, ModContext *mc) +{ + OutputDebugString("bhkRigidBodyModifier::NotifyInputChanged\n"); + Modifier::NotifyInputChanged(changeInt, partID, message, mc); + +} + +struct ParamMapInfo +{ + MapID mapid; + DWORD idd; + DWORD ids; +}; +static ParamMapInfo pminfo[] = { + {bv_box, IDD_RB_MOD_PANEL1, IDS_RB_MOD_PANEL1}, + {bv_sphere, IDD_RB_MOD_PANEL2, IDS_RB_MOD_PANEL2}, + {bv_capsule,IDD_RB_MOD_PANEL3, IDS_RB_MOD_PANEL3}, + {bv_mesh, IDD_RB_MOD_PANEL4, IDS_RB_MOD_PANEL4}, +}; + +void bhkRigidBodyModifier::UpdateBVDialogs() +{ + //if (NULL != pmapParam) + //{ + // int bvType = pblock2->GetInt(PB_BOUND_TYPE); + // if (bvType > 0) // none + // { + // int adjBvType = bvType - 1; //adjusted bvtype (ignoring none). + // for (int i=0; i<_countof(pminfo), ++i){ + // if (pbvParams[i] != NULL && adjBvType != i) { + // DestroyCPParamMap2( pbvParams[i] ); + // pbvParams[i] = 0; + // } + // } + // Interface *ifc = GetCOREInterface(); + // if (pbvParams[adjBvType] == NULL) { + // pbvParams[adjBvType] = CreateCPParamMap2( pminfo[adjBvType], pblock2, ifc, hInstance, + // MAKEINTRESOURCE(pminfo[adjBvType]), GetString([adjBvType]), 0); + // } + // } + //} + //else + //{ + // // hide em all + // for (int i=0; i<_countof(pminfo), ++i){ + // if (pbvParams[i] != NULL) { + // DestroyCPParamMap2( pbvParams[i] ); + // pbvParams[i] = 0; + // } + // } + //} +} + +void bhkRigidBodyModifier::BeginEditParams(IObjParam *ip, ULONG flags,Animatable *prev) +{ + Modifier::BeginEditParams(ip, flags, prev); + mIP = ip; + + TimeValue t = ip->GetTime(); + NotifyDependents(Interval(t,t), PART_ALL, REFMSG_BEGIN_EDIT); + NotifyDependents(Interval(t,t), PART_ALL, REFMSG_MOD_DISPLAY_ON); + SetAFlag(A_MOD_BEING_EDITED); + + bhkRigidBodyModifierDesc.BeginEditParams(ip,this,flags,prev); + //havok_param_blk.SetUserDlgProc(bv_mesh, new bhkRigidBodyModifierDlgProc(this)); + + pmapParam = pblock->GetMap(havok_params); + UpdateBVDialogs(); + //pmapParam->GetIRollup()->Hide(1); + //pmapParam->GetIRollup()->Hide(3); + + BeginEditRBParams(ip, flags, prev); + + mNodes.ZeroCount(); +} + +void bhkRigidBodyModifier::EndEditParams (IObjParam *ip,ULONG flags,Animatable *next) +{ + Modifier::EndEditParams(ip,flags,next); + //saveState(); + mNodes.ZeroCount(); + mIP = NULL; + + // NOTE: This flag must be cleared before sending the REFMSG_END_EDIT + ClearAFlag(A_MOD_BEING_EDITED); + TimeValue t = ip->GetTime(); + NotifyDependents(Interval(t,t), PART_ALL, REFMSG_END_EDIT); + NotifyDependents(Interval(t,t), PART_ALL, REFMSG_MOD_DISPLAY_OFF); + + havok_param_blk.SetUserDlgProc(); + + if (flags&END_EDIT_REMOVEUI) { + pmapParam = NULL; + UpdateBVDialogs(); + } + + if (iPickButton != NULL) { + ReleaseICustButton(iPickButton); + iPickButton = NULL; + } + + // For PB2 we ask the ClassDesc2 to take care of the EndEditParams - NH + bhkRigidBodyModifierDesc.EndEditParams(ip,this,flags,next); + EndEditRBParams(ip, flags, next); +} + +class CollisionWireMtl: public Material +{ +public: + CollisionWireMtl(); +}; +static CollisionWireMtl swMtl; +CollisionWireMtl::CollisionWireMtl():Material() +{ + Ks[0] = Kd[0] = 1.0f; + Ks[1] = Kd[1] = 0.0f; + Ks[2] = Kd[2] = 0.0f; + shininess = (float)0.0; + shadeLimit = GW_WIREFRAME|GW_BACKCULL; + selfIllum = (float)1.0; +} + +int bhkRigidBodyModifier::Display(TimeValue t, INode* inode, ViewExp *vpt, int flagst, ModContext *mc) +{ + //OutputDebugString("bhkRigidBodyModifier::Display\n"); + if (!Modifier::IsEnabled()) + return 0; + + Matrix3 m; + GraphicsWindow *gw = vpt->getGW(); + + int wrgb = inode->GetWireColor(); + inode->SetWireColor( RGB(255,0,0) ); + + Material *mtl = &swMtl; + //gw->setTransform(mat); + if (inode->Selected()) + gw->setColor( LINE_COLOR, GetSelColor()); + else if(!inode->IsFrozen()) + gw->setColor(LINE_COLOR,GetUIColor(COLOR_SPACE_WARPS)); + + m = inode->GetObjectTM(t); + gw->setTransform(m); + DWORD rlim = gw->getRndLimits(); + gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY/*|GW_Z_BUFFER*/); + + //UpdateMesh(t); + gw->setMaterial(swMtl); + gw->setColor(LINE_COLOR, 1.0f, 0.0f, 0.0f); + gw->setColor(FILL_COLOR, 1.0f, 0.0f, 0.0f); + mesh.render( gw, mtl, NULL, COMP_ALL); + + inode->SetWireColor(wrgb); + gw->setRndLimits(rlim); + + return 0; +} \ No newline at end of file diff --git a/NifProps/bhkSphereObj.cpp b/NifProps/bhkSphereObj.cpp index 9971cb5..f0ac610 100644 --- a/NifProps/bhkSphereObj.cpp +++ b/NifProps/bhkSphereObj.cpp @@ -22,20 +22,22 @@ HISTORY: #include "notify.h" #include "macroRec.h" #include "bhkRigidBodyInterface.h" +#include "NifGui.h" +#include "NifStrings.h" + #ifndef _countof #define _countof(x) (sizeof(x)/sizeof((x)[0])) #endif -const Class_ID bhkSphereObject_CLASS_ID = Class_ID(0x8d532427, 0x8b4c64c7); +const Class_ID bhkSphereObject_CLASS_ID = Class_ID(0x8d532427, BHKRIGIDBODYCLASS_DESC.PartB()); + +extern void BuildSphere(Mesh&mesh, float radius, int segs=32, int smooth=1, float startAng = 0.0f); -class bhkSphereObject : public SimpleObject, public IParamArray, public bhkRigidBodyIfcHelper +class bhkSphereObject : public SimpleObject2 { public: // Class vars - static IParamMap *pmapParam; - static int dlgSegments; - static int dlgSmooth; - static float crtRadius; + static IParamMap2 *pmapParam; static IObjParam *ip; bhkSphereObject(BOOL loading); @@ -60,27 +62,17 @@ public: Class_ID ClassID() { return bhkSphereObject_CLASS_ID; } SClass_ID SuperClassID() { return HELPER_CLASS_ID; } - // From ReferenceTarget - IOResult Load(ILoad *iload); - IOResult Save(ISave *isave); - - // From ref - int NumRefs() {return 2;} - RefTargetHandle GetReference(int i); - void SetReference(int i, RefTargetHandle rtarg); + int NumParamBlocks() { return 1; } // return number of ParamBlocks in this instance + IParamBlock2* GetParamBlock(int i) { return pblock2; } // return i'th ParamBlock + IParamBlock2* GetParamBlockByID(BlockID id) { return (pblock2->ID() == id) ? pblock2 : NULL; } // return id'd ParamBlock // From SimpleObject void BuildMesh(TimeValue t); BOOL OKtoDisplay(TimeValue t); void InvalidateUI(); - ParamDimension *GetParameterDim(int pbIndex); - TSTR GetParameterName(int pbIndex); - void SetParams(float rad, int segs, BOOL smooth=TRUE); void UpdateUI(); - - BaseInterface* GetInterface(Interface_ID id); - + int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags); }; @@ -94,121 +86,107 @@ public: #define MIN_SMOOTH 0 #define MAX_SMOOTH 1 -#define DEF_SEGMENTS 32 // 16 -#define DEF_RADIUS float(0.0) - -#define SMOOTH_ON 1 -#define SMOOTH_OFF 0 - -#define MIN_SLICE float(-1.0E30) -#define MAX_SLICE float( 1.0E30) - //--- ClassDescriptor and class vars --------------------------------- -static BOOL sInterfaceAdded = FALSE; - // The class descriptor for sphere class bhkSphereClassDesc : public ClassDesc2 { public: + bhkSphereClassDesc(); int IsPublic() { return 1; } void * Create(BOOL loading = FALSE) { - AddInterface (GetbhkRigidBodyInterfaceDesc()); return new bhkSphereObject(loading); } const TCHAR * ClassName() { return GetString(IDS_RB_SPHERE_CLASS); } SClass_ID SuperClassID() { return HELPER_CLASS_ID; } Class_ID ClassID() { return bhkSphereObject_CLASS_ID; } const TCHAR* Category() { return "NifTools"; } - void ResetClassParams(BOOL fileReset); + + const TCHAR* InternalName() { return _T("bhkSphere"); } // returns fixed parsable name (scripter-visible name) + HINSTANCE HInstance() { return hInstance; } // returns owning module handle }; -static bhkSphereClassDesc sphereDesc; -extern ClassDesc2* GetbhkSphereDesc() { return &sphereDesc; } +extern ClassDesc2* GetbhkSphereDesc(); + +class SphereObjCreateCallBack : public CreateMouseCallBack { + IPoint2 sp0; + bhkSphereObject *ob; + Point3 p0; +public: + int proc( ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat); + void SetObj(bhkSphereObject *obj) {ob = obj;} +}; +static SphereObjCreateCallBack sphereCreateCB; // in prim.cpp - The dll instance handle extern HINSTANCE hInstance; -int bhkSphereObject::dlgSegments = DEF_SEGMENTS; -int bhkSphereObject::dlgSmooth = SMOOTH_ON; -IParamMap *bhkSphereObject::pmapParam = NULL; +IParamMap2 *bhkSphereObject::pmapParam = NULL; IObjParam *bhkSphereObject::ip = NULL; -float bhkSphereObject::crtRadius = 0.0f; - -void bhkSphereClassDesc::ResetClassParams(BOOL fileReset) -{ - bhkSphereObject::dlgSegments = DEF_SEGMENTS; - bhkSphereObject::dlgSmooth = SMOOTH_ON; - bhkSphereObject::crtRadius = 0.0f; -} //--- Parameter map/block descriptors ------------------------------- +enum { sphere_params, }; + // Parameter block indices enum SphereParamIndicies { - PB_RADIUS = 0, - PB_SEGS = 1, - PB_SMOOTH = 2, + PB_MATERIAL, + PB_RADIUS, + PB_SEGS, + PB_SMOOTH, }; +enum { box_params_panel, }; -// -// -// Parameters +static ParamBlockDesc2 param_blk ( + sphere_params, _T("bhkSphereParameters"), 0, NULL, P_AUTO_CONSTRUCT|P_AUTO_UI, 0, + //rollout + IDD_SPHEREPARAM2, IDS_PARAMS, 0, 0, NULL, -static ParamUIDesc descParam[] = { - // Radius - ParamUIDesc( - PB_RADIUS, - EDITTYPE_UNIVERSE, - IDC_RADIUS,IDC_RADSPINNER, - MIN_RADIUS,MAX_RADIUS, - SPIN_AUTOSCALE), + // params + PB_MATERIAL, _T("material"), TYPE_INT, P_ANIMATABLE, IDS_DS_MATERIAL, + p_default, NP_DEFAULT_HVK_MATERIAL, + end, - // Segments - ParamUIDesc( - PB_SEGS, - EDITTYPE_INT, - IDC_SEGMENTS,IDC_SEGSPINNER, - (float)MIN_SEGMENTS,(float)MAX_SEGMENTS, - 0.1f), + PB_RADIUS, _T("radius"), TYPE_FLOAT, P_ANIMATABLE, IDS_RB_RADIUS, + p_default, 0.0, + p_range, float(0), float(1.0E30), + p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_RADIUS, IDC_RADSPINNER, SPIN_AUTOSCALE, + end, - // Smooth - ParamUIDesc(PB_SMOOTH,TYPE_SINGLECHEKBOX,IDC_OBSMOOTH), -}; -const int PARAMDESC_LENGTH = _countof(descParam); + PB_SEGS, _T("segments"), TYPE_INT, P_ANIMATABLE, IDS_RB_SEGS, + p_default, 32, + p_range, MIN_SEGMENTS, MAX_SEGMENTS, + p_ui, TYPE_SPINNER, EDITTYPE_POS_INT, IDC_SEGMENTS, IDC_SEGSPINNER, 1.0f, + end, -static ParamBlockDescID descVer0[] = { - { TYPE_FLOAT, NULL, TRUE, 0 }, - { TYPE_INT, NULL, TRUE, 1 }, - { TYPE_INT, NULL, TRUE, 2 } -}; -const int PBLOCK_LENGTH = _countof(descVer0); -static ParamBlockDescID *curDescVer = descVer0; - -// Array of old versions -//static ParamVersionDesc versions[] = { -// ParamVersionDesc(descVer0,_countof(descVer0),0), -//}; -//const int NUM_OLDVERSIONS = _countof(versions); -static ParamVersionDesc* versions = NULL; -const int NUM_OLDVERSIONS = 0; - -// Current version -const int CURRENT_VERSION = NUM_OLDVERSIONS + 1; -static ParamVersionDesc curVersion(descVer0,_countof(descVer0),CURRENT_VERSION); - -class SphereParamDlgProc : public ParamMapUserDlgProc { + PB_SMOOTH, _T("smooth"), TYPE_INT, P_ANIMATABLE, IDS_RB_SMOOTH, + p_default, TRUE, + p_ui, TYPE_SINGLECHEKBOX, IDC_OBSMOOTH, + end, + + end + ); + +// static ClassDesc must be declared after static paramblock +static bhkSphereClassDesc sphereDesc; +extern ClassDesc2* GetbhkSphereDesc() { return &sphereDesc; } +bhkSphereClassDesc::bhkSphereClassDesc() { + param_blk.SetClassDesc(this); +} + +class SphereParamDlgProc : public ParamMap2UserDlgProc { public: bhkSphereObject *so; HWND thishWnd; + NpComboBox mCbMaterial; SphereParamDlgProc(bhkSphereObject *s) {so=s;thishWnd=NULL;} - BOOL DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); + BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); void Update(TimeValue t); void DeleteThis() {delete this;} @@ -229,20 +207,34 @@ void SphereParamDlgProc::Update(TimeValue t) return; } -BOOL SphereParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) +BOOL SphereParamDlgProc::DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { thishWnd=hWnd; switch (msg) { case WM_INITDIALOG: { + mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL)); + for (const char **str = NpHvkMaterialNames; *str; ++str) + mCbMaterial.add(*str); + + int sel = NP_DEFAULT_HVK_MATERIAL; + Interval valid; + so->pblock2->GetValue( PB_MATERIAL, 0, sel, valid); + mCbMaterial.select( sel ); + Update(t); break; } case WM_COMMAND: - //switch (LOWORD(wParam)) - //{ - //} + switch (LOWORD(wParam)) + { + case IDC_CB_MATERIAL: + if (HIWORD(wParam)==CBN_SELCHANGE) { + so->pblock2->SetValue( PB_MATERIAL, 0, mCbMaterial.selection() ); + } + break; + } break; } return FALSE; @@ -254,138 +246,83 @@ BOOL SphereParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,W bhkSphereObject::bhkSphereObject(BOOL loading) { SetAFlag(A_PLUGIN1); - ReplaceReference(0, CreateParameterBlock(curDescVer, PBLOCK_LENGTH, CURRENT_VERSION)); - assert(pblock); - ReplaceReference(1, GetRBBlock()); - - pblock->SetValue(PB_RADIUS,0,crtRadius); - pblock->SetValue(PB_SMOOTH,0,dlgSmooth); - pblock->SetValue(PB_SEGS,0,dlgSegments); + sphereDesc.MakeAutoParamBlocks(this); + assert(pblock2); } bhkSphereObject::~bhkSphereObject() { -} - -#define NEWMAP_CHUNKID 0x0100 - -IOResult bhkSphereObject::Load(ILoad *iload) -{ - ClearAFlag(A_PLUGIN1); - - IOResult res; - while (IO_OK==(res=iload->OpenChunk())) - { - switch (iload->CurChunkID()) - { - case NEWMAP_CHUNKID: - SetAFlag(A_PLUGIN1); - break; - } - iload->CloseChunk(); - if (res!=IO_OK) return res; - } - return IO_OK; -} - -IOResult bhkSphereObject::Save(ISave *isave) -{ - if (TestAFlag(A_PLUGIN1)) { - isave->BeginChunk(NEWMAP_CHUNKID); - isave->EndChunk(); + param_blk.SetUserDlgProc(); + sphereCreateCB.SetObj(NULL); + if (pmapParam) { + pmapParam = NULL; } - return IO_OK; } -RefTargetHandle bhkSphereObject::GetReference(int i) -{ - if (i == 1) - return GetRBBlock(); - return pblock; -} - -void bhkSphereObject::SetReference(int i, RefTargetHandle rtarg) -{ - if (i == 1) - return; - pblock=(IParamBlock*)rtarg; -} - -BaseInterface* bhkSphereObject::GetInterface(Interface_ID id) -{ - if (id == BHKRIGIDBODYINTERFACE_DESC) - return this; - return SimpleObject::GetInterface(id); -} - - - void bhkSphereObject::BeginEditParams(IObjParam *ip,ULONG flags,Animatable *prev) { SimpleObject::BeginEditParams(ip,flags,prev); // Gotta make a new one. - if (NULL == pmapParam) - { - pmapParam = CreateCPParamMap( - descParam,PARAMDESC_LENGTH, - pblock, - ip, - hInstance, - MAKEINTRESOURCE(IDD_SPHEREPARAM2), - GetString(IDS_RB_PARAMETERS), - 0); - } + //if (NULL == pmapParam) + //{ + // pmapParam = CreateCPParamMap2( + // 0, + // pblock2, + // GetCOREInterface(), + // hInstance, + // MAKEINTRESOURCE(IDD_SPHEREPARAM2), + // GetString(IDS_RB_PARAMETERS), + // 0); + //} this->ip = ip; - - if(pmapParam) { - // A callback for the type in. - pmapParam->SetUserDlgProc(new SphereParamDlgProc(this)); - } - BeginEditRBParams(ip, flags, prev); + sphereDesc.BeginEditParams(ip,this,flags,prev); + param_blk.SetUserDlgProc(new SphereParamDlgProc(this)); + pmapParam = pblock2->GetMap(sphere_params); + //if(pmapParam) { + // // A callback for the type in. + // pmapParam->SetUserDlgProc(new SphereParamDlgProc(this)); + //} } void bhkSphereObject::EndEditParams( IObjParam *ip, ULONG flags,Animatable *next ) { + param_blk.SetUserDlgProc(); + SimpleObject::EndEditParams(ip,flags,next); this->ip = NULL; - - if (flags&END_EDIT_REMOVEUI ) { - DestroyCPParamMap(pmapParam); - pmapParam = NULL; - } - EndEditRBParams(ip, flags, next); - - // Save these values in class variables so the next object created will inherit them. - pblock->GetValue(PB_SEGS,ip->GetTime(),dlgSegments,FOREVER); - pblock->GetValue(PB_SMOOTH,ip->GetTime(),dlgSmooth,FOREVER); + pmapParam = NULL; + + //if (pmapParam && flags&END_EDIT_REMOVEUI ) { + // DestroyCPParamMap2(pmapParam); + // pmapParam = NULL; + //} + // tear down the appropriate auto-rollouts + sphereDesc.EndEditParams(ip, this, flags, next); } -void bhkSphereObject::SetParams(float rad, int segs, BOOL smooth) +void bhkSphereObject::BuildMesh(TimeValue t) { - pblock->SetValue(PB_RADIUS,0, rad); - pblock->SetValue(PB_SEGS,0, segs); - pblock->SetValue(PB_SMOOTH,0, smooth); -} + float radius; int segs; int smooth; + float startAng = 0.0f; + if (TestAFlag(A_PLUGIN1)) startAng = HALFPI; -void bhkSphereObject::BuildMesh(TimeValue t) + // Start the validity interval at forever and whittle it down. + ivalid = FOREVER; + pblock2->GetValue(PB_RADIUS, t, radius, ivalid); + pblock2->GetValue(PB_SEGS, t, segs, ivalid); + pblock2->GetValue(PB_SMOOTH, t, smooth, ivalid); + BuildSphere(mesh, radius, segs, smooth, startAng); +} + +extern void BuildSphere(Mesh&mesh, float radius, int segs, int smooth, float startAng) { Point3 p; int ix,na,nb,nc,nd,jx,kx; int nf=0,nv=0; float delta, delta2; float a,alt,secrad,secang,b,c; - int segs, smooth; - float radius; float hemi = 0.0f; - BOOL genUVs = TRUE; - float startAng = 0.0f; - if (TestAFlag(A_PLUGIN1)) startAng = HALFPI; - // Start the validity interval at forever and whittle it down. - ivalid = FOREVER; - pblock->GetValue(PB_RADIUS, t, radius, ivalid); - pblock->GetValue(PB_SEGS, t, segs, ivalid); - pblock->GetValue(PB_SMOOTH, t, smooth, ivalid); LimitValue(segs, MIN_SEGMENTS, MAX_SEGMENTS); LimitValue(smooth, MIN_SMOOTH, MAX_SMOOTH); LimitValue(radius, MIN_RADIUS, MAX_RADIUS); @@ -504,15 +441,6 @@ void bhkSphereObject::GetCollapseTypes(Tab<Class_ID> &clist,Tab<TSTR*> &nlist) Object::GetCollapseTypes(clist, nlist); } -class SphereObjCreateCallBack : public CreateMouseCallBack { - IPoint2 sp0; - bhkSphereObject *ob; - Point3 p0; -public: - int proc( ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat); - void SetObj(bhkSphereObject *obj) {ob = obj;} -}; - int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ) { float r; @@ -528,7 +456,14 @@ int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IP switch(point) { case 0: // only happens with MOUSE_POINT msg - ob->pblock->SetValue(PB_RADIUS,0,0.0f); + // Find the node and plug in the wire color + { + ULONG handle; + ob->NotifyDependents(FOREVER, (PartID)&handle, REFMSG_GET_NODE_HANDLE); + INode *node = GetCOREInterface()->GetINodeByHandle(handle); + if (node) node->SetWireColor(RGB(255, 0, 0)); + } + ob->pblock2->SetValue(PB_RADIUS,0,0.0f); ob->suspendSnap = TRUE; sp0 = m; p0 = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D); @@ -541,7 +476,7 @@ int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IP r = Length(p1-p0); mat.SetTrans(p0); - ob->pblock->SetValue(PB_RADIUS,0,r); + ob->pblock2->SetValue(PB_RADIUS,0,r); ob->pmapParam->Invalidate(); if (flags&MOUSE_CTRL) @@ -567,8 +502,6 @@ int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IP return TRUE; } -static SphereObjCreateCallBack sphereCreateCB; - CreateMouseCallBack* bhkSphereObject::GetCreateMouseCallBack() { sphereCreateCB.SetObj(this); @@ -579,7 +512,7 @@ CreateMouseCallBack* bhkSphereObject::GetCreateMouseCallBack() BOOL bhkSphereObject::OKtoDisplay(TimeValue t) { float radius; - pblock->GetValue(PB_RADIUS,t,radius,FOREVER); + pblock2->GetValue(PB_RADIUS,t,radius,FOREVER); if (radius==0.0f) return FALSE; else return TRUE; } @@ -588,14 +521,14 @@ BOOL bhkSphereObject::OKtoDisplay(TimeValue t) int bhkSphereObject::IntersectRay(TimeValue t, Ray& ray, float& at, Point3& norm) { int smooth; - pblock->GetValue(PB_SMOOTH,t,smooth,FOREVER); + pblock2->GetValue(PB_SMOOTH,t,smooth,FOREVER); float r; float a, b, c, ac4, b2, at1, at2; float root; BOOL neg1, neg2; - pblock->GetValue(PB_RADIUS,t,r,FOREVER); + pblock2->GetValue(PB_RADIUS,t,r,FOREVER); a = DotProd(ray.dir,ray.dir); b = DotProd(ray.dir,ray.p) * 2.0f; @@ -631,35 +564,6 @@ void bhkSphereObject::InvalidateUI() if (pmapParam) pmapParam->Invalidate(); } -ParamDimension *bhkSphereObject::GetParameterDim(int pbIndex) -{ - switch (pbIndex) - { - case PB_RADIUS: - return stdWorldDim; - case PB_SEGS: - return stdSegmentsDim; - case PB_SMOOTH: - return stdNormalizedDim; - default: - return defaultDim; - } -} - -TSTR bhkSphereObject::GetParameterName(int pbIndex) -{ - switch (pbIndex) - { - case PB_RADIUS: - return TSTR(GetString(IDS_RB_RADIUS)); - case PB_SEGS: - return TSTR(GetString(IDS_RB_SEGS)); - case PB_SMOOTH: - return TSTR(GetString(IDS_RB_SMOOTH)); - default: - return TSTR(_T("")); - } -} RefTargetHandle bhkSphereObject::Clone(RemapDir& remap) { @@ -677,3 +581,24 @@ void bhkSphereObject::UpdateUI() SphereParamDlgProc* dlg = static_cast<SphereParamDlgProc*>(pmapParam->GetUserDlgProc()); dlg->Update(ip->GetTime()); } + +int bhkSphereObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) +{ + Matrix3 m; + Color color = Color(inode->GetWireColor()); + GraphicsWindow *gw = vpt->getGW(); + Material *mtl = gw->getMaterial(); + m = inode->GetObjectTM(t); + gw->setTransform(m); + DWORD rlim = gw->getRndLimits(); + gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY/*|GW_Z_BUFFER*/); + if (inode->Selected()) + gw->setColor( LINE_COLOR, GetSelColor()); + else if(!inode->IsFrozen() && !inode->Dependent()) + gw->setColor( LINE_COLOR, color); + + UpdateMesh(t); + mesh.render( gw, mtl, NULL, COMP_ALL); + gw->setRndLimits(rlim); + return 0; +} \ No newline at end of file diff --git a/NifProps/resource.h b/NifProps/resource.h index 53b8d4f..16b569e 100755 --- a/NifProps/resource.h +++ b/NifProps/resource.h @@ -2,7 +2,6 @@ // Microsoft Visual C++ generated include file. // Used by NifProps.rc // -#define IDD_SPHEREPARAM2 101 #define IDC_RADIUS 1000 #define IDC_SEGMENTS 1001 #define IDC_RADIUS1 1002 @@ -12,6 +11,17 @@ #define IDC_OBSMOOTH 1006 #define IDC_RADSPINNER1 1007 #define IDC_RADSPINNER2 1008 +#define IDC_LENSPINNER 1009 +#define IDC_HEIGHTEDIT 1010 +#define IDC_WIDTHSPINNER 1011 +#define IDC_HEIGHTSPINNER 1012 +#define IDC_LIST1 1023 +#define IDC_ADD 1024 +#define IDC_REMOVE 1025 +#define IDC_RDO_NO_COLL 1117 +#define IDC_RDO_SPHERE 1119 +#define IDC_RDO_CAPSULE 1120 +#define IDC_RDO_PROXY_MESH 1121 #define IDC_ED_POS1_X 1700 #define IDC_SP_POS1_X 1701 #define IDC_ED_POS1_Y 1702 @@ -25,37 +35,88 @@ #define IDC_ED_POS2_Z 1710 #define IDC_SP_POS2_Z 1711 #define IDC_LBL_POS1 1712 -#define IDS_LIBDESCRIPTION 11001 +#define IDC_PICK_NODE 1713 +#define IDC_SLIDER1 1714 +#define IDC_RDO_AXIS_ALIGNED_BOX 1715 +#define IDC_LENGTHEDIT 3009 +#define IDC_WIDTHEDIT 3010 #define IDD_PANEL 11001 +#define IDS_LIBDESCRIPTION 11001 #define IDC_LBL_BSXFLAGS 11001 -#define IDS_CATEGORY 11002 #define IDD_ANIM_PANEL 11002 +#define IDS_CATEGORY 11002 #define IDC_ED_BSXFLAGS 11002 +#define IDD_RIGIDBODY 11003 #define IDS_CLASS_NAME 11003 #define IDC_ED_STRINGSEXTRA 11003 -#define IDD_RigidBody 11003 +#define IDD_CAPSULEPARAM 11004 #define IDS_PARAMS 11004 #define IDC_LBL_STRINGSEXTRA 11004 -#define IDD_CAPSULEPARAM 11004 +#define IDD_RB_MOD_PANEL 11005 #define IDS_SPIN 11005 #define IDC_GRP_OBJECT 11005 +#define IDD_BOXPARAM 11006 #define IDS_ANIM_PARAMS 11006 #define IDC_CHK_ISCOLL 11006 +#define IDD_BOXPARAM1 11006 +#define IDD_SPHEREPARAM2 11007 #define IDC_GRP_HAVOK 11007 #define IDC_HVK_BEGIN 11007 -#define IDS_RB_Capsule 11007 #define IDS_RB_CAPSULE 11007 -#define IDS_RB_Capsule 11007 #define IDC_LBL_MATERIAL 11008 #define IDS_RB_CAPSULE_CLASS 11008 +#define IDD_RB_MOD_PANEL1 11008 #define IDC_CB_MATERIAL 11009 #define IDS_RB_RIGIDBODY_PARAM 11009 +#define IDD_RB_MOD_PANEL2 11009 #define IDC_LBL_LAYER 11010 #define IDS_RB_CAP_POS1 11010 +#define IDD_RB_MOD_PANEL3 11010 #define IDC_CB_LAYER 11011 #define IDS_RB_CAP_POS2 11011 +#define IDD_RB_MOD_PANEL4 11011 #define IDC_LBL_CENTER 11012 +#define IDS_DS_MASS 11012 #define IDC_LBL_POS2 11013 +#define IDS_DS_FRICTION 11013 +#define IDS_DS_RESTITUTION 11014 +#define IDS_DS_LINEAR_DAMPING 11015 +#define IDS_DS_ANGULAR_DAMPING 11016 +#define IDS_DS_MAX_LINEAR_VELOCITY 11017 +#define IDS_DS_MAX_ANGULAR_VELOCITY 11018 +#define IDS_DS_PENETRATION_DEPTH 11019 +#define IDS_DS_MOTION_SYSTEM 11020 +#define IDS_DS_QUALITY_TYPE 11021 +#define IDS_RB_PARAMETERS 11022 +#define IDS_RB_RADIUS 11023 +#define IDS_RB_SEGS 11024 +#define IDS_RB_SMOOTH 11025 +#define IDS_RB_PRIMITIVES 11026 +#define IDS_RB_SPHERE 11027 +#define IDS_RB_RADIUS1 11028 +#define IDS_RB_RADIUS2 11029 +#define IDS_RB_SPHERE_CLASS 11030 +#define IDS_DS_PARAMCHG 11031 +#define IDS_DS_LAYER 11032 +#define IDS_DS_MATERIAL 11033 +#define IDS_DS_NODE 11034 +#define IDS_DS_PRIORITY 11035 +#define IDS_DS_COLLISION 11036 +#define IDS_PICKNODE 11037 +#define IDS_PICKNODE_PROMPT 11038 +#define IDS_RB_BOX 11039 +#define IDS_RB_BOX_CLASS 11040 +#define IDS_RB_CLASS_NAME 11041 +#define IDS_DS_LENGTH 11042 +#define IDS_DS_WIDTH 11043 +#define IDS_DS_HEIGHT 11044 +#define IDS_ADD_MESH 11045 +#define IDS_MESHLIST 11046 +#define IDS_BV_BOUNDING_TYPE 11047 +#define IDS_RB_MOD_PANEL1 11048 +#define IDS_RB_MOD_PANEL2 11049 +#define IDS_RB_MOD_PANEL3 11050 +#define IDS_RB_MOD_PANEL4 11051 #define IDC_ED_CENTER_X 11490 #define IDC_SP_CENTER_X 11491 #define IDC_ED_CENTER_Y 11492 @@ -96,24 +157,14 @@ #define IDC_ED_ANIM_PRIORITY 11601 #define IDC_SP_ANIM_PRIORITY 11602 #define IDC_ANIM_END 11602 -#define IDS_RB_PARAMETERS 30028 -#define IDS_RB_RADIUS 30045 -#define IDS_RB_SEGS 30046 -#define IDS_RB_SMOOTH 30048 -#define IDS_RB_PRIMITIVES 30264 -#define IDS_RB_SPHERE 30503 -#define IDS_RB_RADIUS1 30516 -#define IDS_RB_RADIUS2 30517 -#define IDS_RB_SPHERE_CLASS 31298 -#define IDS_DS_PARAMCHG 31316 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1713 +#define _APS_NEXT_CONTROL_VALUE 1716 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif -- GitLab