123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- //-----------------------------------------------------------------------------
- // 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 _SCENEPOLYHEDRALOBJECT_H_
- #define _SCENEPOLYHEDRALOBJECT_H_
- #ifndef _MPOLYHEDRON_H_
- #include "math/mPolyhedron.h"
- #endif
- /// Shared interface for polyhedral objects.
- struct IScenePolyhedralObject
- {
- /// Convert the polyhedral object to a raw polyhedron.
- virtual AnyPolyhedron ToAnyPolyhedron() const = 0;
- };
- /// Helper template for mixing a polyhedral volume definition into
- /// the superclass hierarchy of a SceneSpace-derived class.
- template< typename Base, typename P = Polyhedron >
- class ScenePolyhedralObject : public Base, public IScenePolyhedralObject
- {
- public:
- typedef Base Parent;
- typedef P PolyhedronType;
- enum
- {
- MAX_PLANES = 256,
- MAX_POINTS = 256,
- MAX_EDGES = 256
- };
- protected:
- enum
- {
- PolyMask = Parent::NextFreeMask << 0,
- NextFreeMask = Parent::NextFreeMask << 1
- };
- /// Whether the polyhedron corresponds to the object box. If so,
- /// several things can be fast-tracked. For example, serializing the
- /// polyhedron is pointless as it can be easily reconstructed from the
- /// object box on load time. Also, certain operations like containment
- /// tests have significantly faster formulations for AABBs (given that the
- /// input data is transformed into object space) than for general
- /// polyhedrons.
- bool mIsBox;
- /// The polyhedron that defines the volume of the object.
- /// @note Defined in object space by default.
- PolyhedronType mPolyhedron;
- ///
- virtual void _renderObject( ObjectRenderInst* ri, SceneRenderState* state, BaseMatInstance* overrideMat );
- public:
- ScenePolyhedralObject()
- : mIsBox( true ) {}
- ScenePolyhedralObject( const PolyhedronType& polyhedron )
- : mIsBox( false ),
- mPolyhedron( polyhedron ) {}
- /// Return the polyhedron that describes the space.
- const PolyhedronType& getPolyhedron() const { return mPolyhedron; }
- // SimObject.
- virtual bool onAdd();
- virtual void writeFields( Stream& stream, U32 tabStop );
- virtual bool writeField( StringTableEntry name, const char* value );
- static void initPersistFields();
- // NetObject.
- virtual U32 packUpdate( NetConnection* connection, U32 mask, BitStream* stream );
- virtual void unpackUpdate( NetConnection* connection, BitStream* stream );
-
- // SceneObject.
- virtual bool containsPoint( const Point3F& point );
- // IScenePolyhedralObject.
- virtual AnyPolyhedron ToAnyPolyhedron() const { return getPolyhedron(); }
- private:
- static bool _setPlane( void* object, const char* index, const char* data );
- static bool _setPoint( void* object, const char* index, const char* data );
- static bool _setEdge( void* object, const char* index, const char* data );
- };
- #endif // !_SCENEPOLYHEDRALOBJECT_H_
|