| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- //
- // Copyright (c) 2008-2017 the Urho3D project.
- //
- // 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.
- //
- #pragma once
- #include "../Container/ArrayPtr.h"
- #include "../Container/Ptr.h"
- #include "../Graphics/GraphicsDefs.h"
- #include "../Graphics/Skeleton.h"
- #include "../Math/BoundingBox.h"
- #include "../Resource/Resource.h"
- namespace Atomic
- {
- class Geometry;
- class IndexBuffer;
- class Graphics;
- class VertexBuffer;
- /// Vertex buffer morph data.
- struct VertexBufferMorph
- {
- /// Vertex elements.
- unsigned elementMask_;
- /// Number of vertices.
- unsigned vertexCount_;
- /// Morphed vertices data size as bytes.
- unsigned dataSize_;
- /// Morphed vertices. Stored packed as <index, data> pairs.
- SharedArrayPtr<unsigned char> morphData_;
- };
- /// Definition of a model's vertex morph.
- struct ModelMorph
- {
- /// Morph name.
- String name_;
- /// Morph name hash.
- StringHash nameHash_;
- /// Current morph weight.
- float weight_;
- /// Morph data per vertex buffer.
- HashMap<unsigned, VertexBufferMorph> buffers_;
- };
- /// Description of vertex buffer data for asynchronous loading.
- struct VertexBufferDesc
- {
- /// Vertex count.
- unsigned vertexCount_;
- /// Vertex declaration.
- PODVector<VertexElement> vertexElements_;
- /// Vertex data size.
- unsigned dataSize_;
- /// Vertex data.
- SharedArrayPtr<unsigned char> data_;
- };
- /// Description of index buffer data for asynchronous loading.
- struct IndexBufferDesc
- {
- /// Index count.
- unsigned indexCount_;
- /// Index size.
- unsigned indexSize_;
- /// Index data size.
- unsigned dataSize_;
- /// Index data.
- SharedArrayPtr<unsigned char> data_;
- };
- /// Description of a geometry for asynchronous loading.
- struct GeometryDesc
- {
- /// Primitive type.
- PrimitiveType type_;
- /// Vertex buffer ref.
- unsigned vbRef_;
- /// Index buffer ref.
- unsigned ibRef_;
- /// Index start.
- unsigned indexStart_;
- /// Index count.
- unsigned indexCount_;
- };
- // ATOMIC BEGIN
- static const unsigned MODEL_VERSION = 1;
- // ATOMIC END
- /// 3D model resource.
- class ATOMIC_API Model : public ResourceWithMetadata
- {
- ATOMIC_OBJECT(Model, ResourceWithMetadata);
- public:
- /// Construct.
- Model(Context* context);
- /// Destruct.
- virtual ~Model();
- /// Register object factory.
- static void RegisterObject(Context* context);
- /// Load resource from stream. May be called from a worker thread. Return true if successful.
- virtual bool BeginLoad(Deserializer& source);
- /// Finish resource loading. Always called from the main thread. Return true if successful.
- virtual bool EndLoad();
- /// Save resource. Return true if successful.
- virtual bool Save(Serializer& dest) const;
- /// Set local-space bounding box.
- void SetBoundingBox(const BoundingBox& box);
- /// Set vertex buffers and their morph ranges.
- bool SetVertexBuffers(const Vector<SharedPtr<VertexBuffer> >& buffers, const PODVector<unsigned>& morphRangeStarts,
- const PODVector<unsigned>& morphRangeCounts);
- /// Set index buffers.
- bool SetIndexBuffers(const Vector<SharedPtr<IndexBuffer> >& buffers);
- /// Set number of geometries.
- void SetNumGeometries(unsigned num);
- /// Set number of LOD levels in a geometry.
- bool SetNumGeometryLodLevels(unsigned index, unsigned num);
- /// Set geometry.
- bool SetGeometry(unsigned index, unsigned lodLevel, Geometry* geometry);
- /// Set geometry center.
- bool SetGeometryCenter(unsigned index, const Vector3& center);
- /// Set skeleton.
- void SetSkeleton(const Skeleton& skeleton);
- /// Set bone mappings when model has more bones than the skinning shader can handle.
- void SetGeometryBoneMappings(const Vector<PODVector<unsigned> >& mappings);
- /// Set vertex morphs.
- void SetMorphs(const Vector<ModelMorph>& morphs);
- /// Clone the model. The geometry data is deep-copied and can be modified in the clone without affecting the original.
- SharedPtr<Model> Clone(const String& cloneName = String::EMPTY) const;
- /// Return bounding box.
- const BoundingBox& GetBoundingBox() const { return boundingBox_; }
- /// Return skeleton.
- Skeleton& GetSkeleton() { return skeleton_; }
- /// Return vertex buffers.
- const Vector<SharedPtr<VertexBuffer> >& GetVertexBuffers() const { return vertexBuffers_; }
- /// Return index buffers.
- const Vector<SharedPtr<IndexBuffer> >& GetIndexBuffers() const { return indexBuffers_; }
- /// Return number of geometries.
- unsigned GetNumGeometries() const { return geometries_.Size(); }
- /// Return number of LOD levels in geometry.
- unsigned GetNumGeometryLodLevels(unsigned index) const;
- /// Return geometry pointers.
- const Vector<Vector<SharedPtr<Geometry> > >& GetGeometries() const { return geometries_; }
- /// Return geometry center points.
- const PODVector<Vector3>& GetGeometryCenters() const { return geometryCenters_; }
- /// Return geometry by index and LOD level. The LOD level is clamped if out of range.
- Geometry* GetGeometry(unsigned index, unsigned lodLevel) const;
- /// Return geometry center by index.
- const Vector3& GetGeometryCenter(unsigned index) const
- {
- return index < geometryCenters_.Size() ? geometryCenters_[index] : Vector3::ZERO;
- }
- /// Return geometery bone mappings.
- const Vector<PODVector<unsigned> >& GetGeometryBoneMappings() const { return geometryBoneMappings_; }
- /// Return vertex morphs.
- const Vector<ModelMorph>& GetMorphs() const { return morphs_; }
- /// Return number of vertex morphs.
- unsigned GetNumMorphs() const { return morphs_.Size(); }
- /// Return vertex morph by index.
- const ModelMorph* GetMorph(unsigned index) const;
- /// Return vertex morph by name.
- const ModelMorph* GetMorph(const String& name) const;
- /// Return vertex morph by name hash.
- const ModelMorph* GetMorph(StringHash nameHash) const;
- /// Return vertex buffer morph range start.
- unsigned GetMorphRangeStart(unsigned bufferIndex) const;
- /// Return vertex buffer morph range vertex count.
- unsigned GetMorphRangeCount(unsigned bufferIndex) const;
- // ATOMIC BEGIN
- bool SetGeometryName(unsigned index, const String& name);
- const String& GetGeometryName(unsigned index) const;
- const Vector<String>& GetGeometryNames() const { return geometryNames_; }
- // ATOMIC END
- private:
- /// Bounding box.
- BoundingBox boundingBox_;
- /// Skeleton.
- Skeleton skeleton_;
- /// Vertex buffers.
- Vector<SharedPtr<VertexBuffer> > vertexBuffers_;
- /// Index buffers.
- Vector<SharedPtr<IndexBuffer> > indexBuffers_;
- /// Geometries.
- Vector<Vector<SharedPtr<Geometry> > > geometries_;
- /// Geometry bone mappings.
- Vector<PODVector<unsigned> > geometryBoneMappings_;
- /// Geometry centers.
- PODVector<Vector3> geometryCenters_;
- /// Vertex morphs.
- Vector<ModelMorph> morphs_;
- /// Vertex buffer morph range start.
- PODVector<unsigned> morphRangeStarts_;
- /// Vertex buffer morph range vertex count.
- PODVector<unsigned> morphRangeCounts_;
- /// Vertex buffer data for asynchronous loading.
- Vector<VertexBufferDesc> loadVBData_;
- /// Index buffer data for asynchronous loading.
- Vector<IndexBufferDesc> loadIBData_;
- /// Geometry definitions for asynchronous loading.
- Vector<PODVector<GeometryDesc> > loadGeometries_;
- // ATOMIC BEGIN
- Vector<String> geometryNames_;
- // ATOMIC END
- };
- }
|