/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef TETRAEDGE_TE_TE_MODEL_H #define TETRAEDGE_TE_TE_MODEL_H #include "common/array.h" #include "common/ptr.h" #include "common/stream.h" #include "tetraedge/te/te_timer.h" #include "tetraedge/te/te_trs.h" #include "tetraedge/te/te_mesh.h" #include "tetraedge/te/te_model_animation.h" #include "tetraedge/te/te_model_vertex_animation.h" #include "tetraedge/te/te_tiled_texture.h" #include "tetraedge/te/te_intrusive_ptr.h" #include "tetraedge/te/te_quaternion.h" #include "tetraedge/te/te_resource.h" namespace Tetraedge { class TeModelVertexAnimation; class TeModelAnimation; class TeMesh; class TeModel : public Te3DObject2, public TeResource { public: class BonesBlender { public: // Note: original takes a TeModel & but ignores it. BonesBlender(TeIntrusivePtr anim, float seconds); float coef(); TeIntrusivePtr _anim; TeTimer _timer; float _seconds; }; class MeshBlender { public: MeshBlender(const Common::String &s1, const Common::String &s2, float amount, TeModel *model); Common::String _name; uint _meshNo; float _amount; TeTimer _timer; }; struct Bone { Common::String _name; short _parentBone; TeTRS _trs; }; struct weightElement { float _weight; unsigned short _x; }; TeModel(); virtual ~TeModel(); void addMesh(Common::SharedPtr mesh) { _meshes.push_back(mesh); } TeIntrusivePtr anim() { return _modelAnim; } void blendAnim(TeIntrusivePtr& anim, float amount, bool repeat); void blendMesh(const Common::String &s1, const Common::String &s2, float amount); int checkFileType(Common::SeekableReadStream &instream) const; void create(); void destroy(); void draw() override; int findModelBone(const Common::String &bname); int findOrAddWeights(const Common::Array &weights); void forceMatrix(const TeMatrix4x4 &matrix); TeTRS getBone(TeIntrusivePtr anim, uint num); void invertNormals(); /* Align the stream to the nearest 4 byte boudary*/ static void loadAlign(Common::SeekableReadStream &stream); static void saveAlign(Common::SeekableWriteStream &stream); bool load(const Common::Path &path); bool load(Common::SeekableReadStream &stream); bool loadWeights(Common::ReadStream &stream, Common::Array &weights); bool loadMesh(Common::SeekableReadStream &stream, TeMesh &mesh); void removeAnim(); void update(); void saveBone(Common::SeekableWriteStream &stream, uint boneno); void saveMesh(Common::SeekableWriteStream &stream, const TeMesh &mesh); void saveModel(Common::SeekableWriteStream &stream, uint num); void saveWeights(Common::SeekableWriteStream &stream, const Common::Array weights); void setAnim(TeIntrusivePtr &anim, bool repeat); virtual void setColor(const TeColor &col) override; void setQuad(const TeIntrusivePtr &tex, const Common::Array &verts, const TeColor &col); void setVertexAnim(TeIntrusivePtr &anim, bool repeat); void setVisibleByName(const Common::String &mname, bool vis); TeMatrix4x4 skinOffset(uint boneno) const; static Common::SeekableReadStream *tryLoadZlibStream(Common::SeekableReadStream &instr); TeSignal2Param &bonesUpdatedSignal() { return _bonesUpdatedSignal; } Common::Array &boneBlenders() { return _boneBlenders; } Common::Array> &meshes() { return _meshes; } TeIntrusivePtr tiledTexture() { return _tiledTexture; } void setEnableLights(bool val) { _enableLights = val; } void setTexturePath(const Common::Path &path) { _texturePath = path; } void setMeshCount(uint count); protected: TeMatrix4x4 lerpElementsMatrix(uint weightNum, const Common::Array &matricies); Common::Path _texturePath; TeIntrusivePtr _tiledTexture; bool _enableLights; bool _matrixForced; bool _skipSkinOffsets; TeMatrix4x4 _forcedMatrix; Common::Array _boneBlenders; Common::Array _meshBlenders; Common::Array _bones; Common::Array _skinOffsets; Common::Array _boneMatricies; Common::Array _lerpedElements; Common::Array> _weightElements; Common::Array> _meshes; TeQuaternion _boneRotation; TeIntrusivePtr _modelAnim; TeIntrusivePtr _modelVertexAnim; TeSignal2Param _bonesUpdatedSignal; }; } // end namespace Tetraedge #endif // TETRAEDGE_TE_TE_MODEL_H