mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-06-01 18:46:39 +00:00
final setup for assimp Added assimp importers and exporters, removed defaulting to all Added compression to tshape added dts version to tshape and cmake Update assimpShapeLoader.cpp quick fix fix previewing dsq ground work automatically export dsq files for animations Groundwork Adds the same sort of model for registering loaders and exporters as is set out on gbitmap Added a bit more safety around the assimp matrix fix to convert incoming models to torques coordinate system.
267 lines
11 KiB
C++
267 lines
11 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2012 GarageGames, LLC
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef _GUISHAPEEDPREVIEW_H_
|
|
#define _GUISHAPEEDPREVIEW_H_
|
|
|
|
#include "gui/worldEditor/editTSCtrl.h"
|
|
#include "ts/tsShapeInstance.h"
|
|
|
|
class LightInfo;
|
|
|
|
class GuiShapeEdPreview : public EditTSCtrl
|
|
{
|
|
struct Thread
|
|
{
|
|
TSThread* key; //!< TSThread key
|
|
String seqName; //!< Name of the sequence for this thread
|
|
S32 direction; //!< Playback direction: -1 (reverse), 0 (paused), 1 (forward)
|
|
bool pingpong; //!< Pingpong flag (auto-reverse direction at start/end)
|
|
|
|
Thread()
|
|
{
|
|
init();
|
|
}
|
|
|
|
void init()
|
|
{
|
|
key = NULL;
|
|
direction = 1.0f;
|
|
pingpong = false;
|
|
}
|
|
};
|
|
|
|
struct MountedShape
|
|
{
|
|
enum eMountType
|
|
{
|
|
Object, //!< Mount origin of shape to target node
|
|
Image, //!< Mount 'mountPoint' or origin of shape to target node
|
|
Wheel, //!< Mount origin of shape to target node, ignore target node rotation
|
|
};
|
|
|
|
TSShapeInstance* mShape; //!< The mounted shape instance
|
|
S32 mNode; //!< Index of the node this shape is mounted to
|
|
MatrixF mTransform; //!< Mount offset transform
|
|
eMountType mType; //!< Type of mount
|
|
Thread mThread; //!< Animation thread for the mounted shape
|
|
|
|
MountedShape() : mShape(0), mNode(-1), mTransform(true), mType(Object) { }
|
|
~MountedShape() { delete mShape; }
|
|
};
|
|
|
|
protected:
|
|
typedef EditTSCtrl Parent;
|
|
|
|
// View and node selection
|
|
bool mUsingAxisGizmo;
|
|
bool mEditingSun; //!< True if editing the sun direction, false otherwise
|
|
|
|
S32 mGizmoDragID; //!< Used to track transform changes within a single gizmo drag action
|
|
S32 mSelectedNode; //!< Index of the selected node
|
|
S32 mHoverNode; //!< Index of the node the mouse is over
|
|
Vector<Point3F> mProjectedNodes; //!< Projected screen positions of the model nodes
|
|
|
|
S32 mSelectedObject; //!< Name of the selected object
|
|
S32 mSelectedObjDetail; //!< Detail mesh index of the selected object
|
|
|
|
// Camera
|
|
EulerF mCameraRot;
|
|
bool mRenderCameraAxes;
|
|
Point3F mOrbitPos;
|
|
F32 mOrbitDist;
|
|
F32 mMoveSpeed;
|
|
F32 mZoomSpeed;
|
|
|
|
// Current Detail
|
|
bool mFixedDetail; //!< If false, the detail level will be determined based on camera distance
|
|
S32 mCurrentDL; //!< Current detail level
|
|
S32 mDetailSize; //!< Size of current detail level
|
|
S32 mDetailPolys; //!< Number of polys (triangles) in current detail level
|
|
F32 mPixelSize; //!< Current pixel size
|
|
S32 mNumMaterials; //!< Number of materials in the current detail level
|
|
S32 mNumDrawCalls; //!< Number of draw calls in the current detail level
|
|
S32 mNumBones; //!< Number of bones in the current detail level (skins only)
|
|
S32 mNumWeights; //!< Number of vertex weights in the current detail level (skins only)
|
|
S32 mColMeshes; //!< Number of collision meshes
|
|
S32 mColPolys; //!< Number of collision polygons (all meshes)
|
|
|
|
// Rendering
|
|
Point2I mGridDimension; //!< Dimension of grid in perspective view (eg. 30x30)
|
|
bool mRenderGhost;
|
|
bool mRenderNodes;
|
|
bool mRenderBounds;
|
|
bool mRenderObjBox;
|
|
bool mRenderColMeshes;
|
|
bool mRenderMounts;
|
|
TSShapeInstance* mModel;
|
|
StringTableEntry mModelName;
|
|
|
|
LightInfo* mFakeSun;
|
|
EulerF mSunRot;
|
|
ColorI mSunDiffuseColor;
|
|
ColorI mSunAmbientColor;
|
|
|
|
// Animation and playback control
|
|
Vector<Thread> mThreads;
|
|
F32 mTimeScale;
|
|
S32 mActiveThread;
|
|
S32 mLastRenderTime;
|
|
|
|
// Mounted objects
|
|
Vector<MountedShape*> mMounts;
|
|
|
|
static bool setFieldCurrentDL( void *object, const char *index, const char *data );
|
|
static bool setFieldSunDiffuse( void *object, const char *index, const char *data );
|
|
static bool setFieldSunAmbient( void *object, const char *index, const char *data );
|
|
static bool setFieldSunAngleX( void *object, const char *index, const char *data );
|
|
static bool setFieldSunAngleZ( void *object, const char *index, const char *data );
|
|
|
|
static bool setFieldThreadPos( void *object, const char *index, const char *data );
|
|
static bool setFieldThreadIn( void *object, const char *index, const char *data );
|
|
static bool setFieldThreadOut( void *object, const char *index, const char *data );
|
|
static bool setFieldThreadDir( void *object, const char *index, const char *data );
|
|
static bool setFieldThreadPingPong( void *object, const char *index, const char *data );
|
|
|
|
static const char *getFieldThreadPos( void *object, const char *data );
|
|
static const char *getFieldThreadIn( void *object, const char *data );
|
|
static const char *getFieldThreadOut( void *object, const char *data );
|
|
static const char *getFieldThreadDir( void *object, const char *data );
|
|
static const char *getFieldThreadPingPong( void *object, const char *data );
|
|
|
|
// Generic mouse event handlers
|
|
void handleMouseDown(const GuiEvent& event, GizmoMode mode);
|
|
void handleMouseUp(const GuiEvent& event, GizmoMode mode);
|
|
void handleMouseMove(const GuiEvent& event, GizmoMode mode);
|
|
void handleMouseDragged(const GuiEvent& event, GizmoMode mode);
|
|
|
|
// Node picking
|
|
S32 collideNode(const Gui3DMouseEvent& event) const;
|
|
void updateProjectedNodePoints();
|
|
|
|
void updateSun();
|
|
void updateDetailLevel(const SceneRenderState* state);
|
|
void updateThreads(F32 delta);
|
|
|
|
// Rendering
|
|
void renderGrid() override;
|
|
void renderNodes() const;
|
|
void renderNodeAxes(S32 index, const LinearColorF& nodeColor) const;
|
|
void renderNodeName(S32 index, const LinearColorF& textColor) const;
|
|
void renderSunDirection() const;
|
|
void renderCollisionMeshes() const;
|
|
|
|
public:
|
|
bool onWake() override;
|
|
|
|
void setDisplayType(S32 type) override;
|
|
|
|
/// @name Mouse event handlers
|
|
///@{
|
|
void onMouseDown(const GuiEvent& event) override { handleMouseDown(event, NoneMode); }
|
|
void onMouseUp(const GuiEvent& event) override { handleMouseUp(event, NoneMode); }
|
|
void onMouseMove(const GuiEvent& event) override { handleMouseMove(event, NoneMode); }
|
|
void onMouseDragged(const GuiEvent& event) override { handleMouseDragged(event, NoneMode); }
|
|
|
|
void onMiddleMouseDown(const GuiEvent& event) override { handleMouseDown(event, MoveMode); }
|
|
void onMiddleMouseUp(const GuiEvent& event) override { handleMouseUp(event, MoveMode); }
|
|
void onMiddleMouseDragged(const GuiEvent& event) override { handleMouseDragged(event, MoveMode); }
|
|
|
|
void onRightMouseDown(const GuiEvent& event) override { handleMouseDown(event, RotateMode); }
|
|
void onRightMouseUp(const GuiEvent& event) override { handleMouseUp(event, RotateMode); }
|
|
void onRightMouseDragged(const GuiEvent& event) override { handleMouseDragged(event, RotateMode); }
|
|
|
|
void on3DMouseWheelUp(const Gui3DMouseEvent& event) override;
|
|
void on3DMouseWheelDown(const Gui3DMouseEvent& event) override;
|
|
///@}
|
|
|
|
// Setters/Getters
|
|
TSShapeInstance* getModel() { return mModel; }
|
|
|
|
void setCurrentDetail(S32 dl);
|
|
bool setObjectModel(const char * modelName);
|
|
bool findCompanionShape(const Torque::Path& dsqPath, Torque::Path& outShapePath);
|
|
bool setObjectShapeAsset(const char* assetId);
|
|
|
|
void _onResourceChanged(const Torque::Path& path);
|
|
|
|
/// @name Threads
|
|
///@{
|
|
void addThread();
|
|
void removeThread(S32 slot);
|
|
S32 getThreadCount() const { return mThreads.size(); }
|
|
void setTimeScale(F32 scale);
|
|
void setActiveThreadSequence(const char* seqName, F32 duration, F32 pos, bool play);
|
|
void setThreadSequence(Thread& thread, TSShapeInstance* shape, const char * seqName, F32 duration=0.0f, F32 pos=0.0f, bool play=false);
|
|
const char* getThreadSequence() const;
|
|
void refreshThreadSequences();
|
|
|
|
DECLARE_CALLBACK( void, onThreadPosChanged, ( F32 pos, bool inTransition ) );
|
|
///@}
|
|
|
|
/// @name Mounting
|
|
///@{
|
|
bool mountShape(const char* modelName, const char* nodeName, const char* mountType, S32 slot=-1);
|
|
void setMountNode(S32 mountSlot, const char* nodeName);
|
|
const char* getMountThreadSequence(S32 mountSlot) const;
|
|
void setMountThreadSequence(S32 mountSlot, const char* seqName);
|
|
F32 getMountThreadPos(S32 mountSlot) const;
|
|
void setMountThreadPos(S32 mountSlot, F32 pos);
|
|
F32 getMountThreadDir(S32 mountSlot) const;
|
|
void setMountThreadDir(S32 mountSlot, F32 dir);
|
|
void unmountShape(S32 mountSlot);
|
|
void unmountAll();
|
|
///@}
|
|
|
|
void refreshShape();
|
|
void updateNodeTransforms();
|
|
|
|
void get3DCursor(GuiCursor *& cursor, bool& visible, const Gui3DMouseEvent& event_) override;
|
|
|
|
void fitToShape();
|
|
void setOrbitPos( const Point3F& pos );
|
|
|
|
void exportToCollada( const String& path );
|
|
|
|
/// @name Rendering
|
|
///@{
|
|
bool getCameraTransform(MatrixF* cameraMatrix) override;
|
|
void computeSceneBounds(Box3F& bounds) override;
|
|
|
|
bool getMeshHidden(const char* name) const;
|
|
void setMeshHidden(const char* name, bool hidden);
|
|
void setAllMeshesHidden(bool hidden);
|
|
|
|
void renderWorld(const RectI& updateRect) override;
|
|
void renderGui(Point2I offset, const RectI& updateRect) override;
|
|
///@}
|
|
|
|
DECLARE_CONOBJECT(GuiShapeEdPreview);
|
|
DECLARE_CATEGORY( "Gui Editor" );
|
|
|
|
static void initPersistFields();
|
|
|
|
GuiShapeEdPreview();
|
|
~GuiShapeEdPreview();
|
|
};
|
|
|
|
#endif
|