123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- //-----------------------------------------------------------------------------
- // 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 _PREFAB_H_
- #define _PREFAB_H_
- #ifndef _SCENEOBJECT_H_
- #include "scene/sceneObject.h"
- #endif
- #ifndef _PATH_H_
- #include "core/util/path.h"
- #endif
- #ifndef _UNDO_H_
- #include "util/undo.h"
- #endif
- #ifndef _TDICTIONARY_H_
- #include "core/util/tDictionary.h"
- #endif
- class BaseMatInstance;
- class Prefab : public SceneObject
- {
- typedef SceneObject Parent;
-
- enum MaskBits
- {
- TransformMask = Parent::NextFreeMask << 0,
- FileMask = Parent::NextFreeMask << 1,
- NextFreeMask = Parent::NextFreeMask << 2
- };
- public:
- Prefab();
- virtual ~Prefab();
- DECLARE_CONOBJECT(Prefab);
-
- static void initPersistFields();
- // SimObject
- virtual bool onAdd();
- virtual void onRemove();
- virtual void onEditorEnable();
- virtual void onEditorDisable();
- virtual void inspectPostApply();
- // NetObject
- U32 packUpdate( NetConnection *conn, U32 mask, BitStream *stream );
- void unpackUpdate( NetConnection *conn, BitStream *stream );
- // SceneObject
- virtual void setTransform( const MatrixF &mat );
- virtual void setScale(const VectorF & scale);
- // Prefab
- /// If the passed object is a child of any Prefab return that Prefab.
- /// Note that this call is only valid if the editor is open and when
- /// passed server-side objects.
- static Prefab* getPrefabByChild( SimObject *child );
- /// Returns false if the passed object is of a type that is not allowed
- /// as a child within a Prefab.
- static bool isValidChild( SimObject *child, bool logWarnings );
- ///
- void render( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat );
- ///
- void setFile(StringTableEntry file );
- /// Removes all children from this Prefab and puts them into a SimGroup
- /// which is added to the Scene and returned to the caller.
- SimGroup* explode();
- bool buildPolyList(PolyListContext context, AbstractPolyList* polyList, const Box3F &box, const SphereF& sphere);
- bool buildExportPolyList(ColladaUtils::ExportData* exportData, const Box3F &box, const SphereF &);
- virtual void getUtilizedAssets(Vector<StringTableEntry>* usedAssetsList);
- S32 getChildGroup() {
- if (mChildGroup.isValid())
- return mChildGroup->getId();
- return 0;
- }
- protected:
- void _closeFile( bool removeFileNotify );
- void _loadFile( bool addFileNotify );
- void _updateChildTransform( SceneObject* child );
- void _updateChildren();
- void _onFileChanged( const Torque::Path &path );
- static bool protectedSetFile( void *object, const char *index, const char *data );
- /// @name Callbacks
- /// @{
- DECLARE_CALLBACK( void, onLoad, ( SimGroup *children ) );
- /// @}
- protected:
- /// Prefab file which defines our children objects.
- StringTableEntry mFilename;
- /// Group which holds all children objects.
- SimObjectPtr<SimGroup> mChildGroup;
- /// Structure to keep track of child object initial transform and scale
- struct Transform
- {
- MatrixF mat;
- VectorF scale;
- Transform() : mat(true), scale(Point3F::One) { }
- Transform( const MatrixF& m, const VectorF& s ) : mat(m), scale(s) { }
- };
- typedef Map<SimObjectId,Transform> ChildToMatMap;
- /// Lookup from a child object's id to its transform in
- /// this Prefab's object space.
- ChildToMatMap mChildMap;
- typedef Map<SimObjectId,SimObjectId> ChildToPrefabMap;
- /// Lookup from a SimObject to its parent Prefab if it has one.
- static ChildToPrefabMap smChildToPrefabMap;
- };
- class ExplodePrefabUndoAction : public UndoAction
- {
- typedef UndoAction Parent;
- friend class WorldEditor;
- public:
- ExplodePrefabUndoAction( Prefab *prefab );
- // UndoAction
- virtual void undo();
- virtual void redo();
- protected:
- SimGroup *mGroup;
- SimObjectId mPrefabId;
- };
- #endif // _PREFAB_H_
|