From fdcec51cf43b618bd2c5a30be6ce8d44b98a3fc4 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 15 Aug 2014 13:03:53 +0800 Subject: [PATCH 01/67] struct for newmodel --- cocos/3d/CCBundle3D.cpp | 19 ++++++++ cocos/3d/CCBundle3D.h | 7 +++ cocos/3d/CCBundle3DData.h | 99 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 124 insertions(+), 1 deletion(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 77dfb36c08..ddfb3c5c32 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -268,6 +268,25 @@ bool Bundle3D::loadSkeletonData(const std::string& id, Skeleton3DData* skeletond return true; } +//since 3.3, to support reskin +bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) +{ + //TODO + return true; +} + +bool Bundle3D::loadNodes(NodeDatas& nodedatas) +{ + //TODO + return true; +} + +bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) +{ + //TODO + return true; +} + bool Bundle3D::loadJson(const std::string& path) { clear(); diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index 58749abab0..0adc4cd3dc 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -94,6 +94,13 @@ public: * */ virtual bool loadSkeletonData(const std::string& id, Skeleton3DData* skeletondata); + + //since 3.3, to support reskin + virtual bool loadMeshDatas(MeshDatas& meshdatas); + //since 3.3, to support reskin + virtual bool loadNodes(NodeDatas& nodedatas); + //since 3.3, to support reskin + virtual bool loadMaterials(MaterialDatas& materialdatas); protected: diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index e6076f082f..9f69b8b471 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -47,6 +47,66 @@ struct MeshVertexAttrib int attribSizeBytes; }; + +struct ModelNodeData; +/** Node data, since 3.3 */ +struct NodeData +{ + std::string id; + Mat4 transform; + std::vector children; + + virtual ~NodeData() + { + resetData(); + } + virtual void resetData() + { + id.clear(); + transform.setIdentity(); + for (auto& it : children) + { + delete it; + } + children.clear(); + } + virtual ModelNodeData* asModelNodeData() + { + return nullptr; + } +}; + +/** model node data, since 3.3 */ +struct ModelNodeData : public NodeData +{ + std::string subMeshId; + std::string matrialId; + std::vector bones; + std::vector invBindPose; + + virtual ~ModelNodeData() + { + resetData(); + } + virtual void resetData() + { + bones.clear(); + invBindPose.clear(); + NodeData::resetData(); + } + virtual ModelNodeData* asModelNodeData() + { + return this; + } +}; + +/** node datas, since 3.3 */ +struct NodeDatas +{ + std::vector skeleton; //skeleton + std::vector nodes; // nodes, CCNode, Sprite3D or part of Sprite3D +}; + /**mesh data*/ struct MeshData { @@ -54,6 +114,7 @@ struct MeshData std::vector vertex; int vertexSizeInFloat; std::vector subMeshIndices; + std::vector subMeshIds; //subMesh Names (since 3.3) int numIndex; std::vector attribs; int attribCount; @@ -80,6 +141,25 @@ public: } }; +/** mesh datas */ +struct MeshDatas +{ + std::vector meshDatas; + + void resetData() + { + for(auto& it : meshDatas) + { + delete it; + } + meshDatas.clear(); + } + ~MeshDatas() + { + resetData(); + } +}; + /**skin data*/ struct SkinData { @@ -189,7 +269,7 @@ struct Skeleton3DData } }; -/**material data*/ +/**material data, */ struct MaterialData { std::map texturePaths; //submesh id, texture path @@ -199,6 +279,23 @@ struct MaterialData } }; +/**new material, since 3.3 */ +struct NMaterialData +{ + std::string id; + // copy from lv +}; + +/** material datas, since 3.3 */ +struct MaterialDatas +{ + std::vector materials; + void resetData() + { + materials.clear(); + } +}; + /**animation data*/ struct Animation3DData { From 88bb1482e3c7be7ba0192fd487779b5f2429e9b5 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 15 Aug 2014 14:58:30 +0800 Subject: [PATCH 02/67] newmodel --- cocos/3d/CCSprite3D.h | 3 +++ cocos/3d/CCSubMesh.cpp | 14 ++++++++++++++ cocos/3d/CCSubMesh.h | 12 ++++++++++-- cocos/3d/CCSubMeshState.cpp | 12 ++++++++++++ cocos/3d/CCSubMeshState.h | 13 +++++++++++++ 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 9e79ba37ab..7c587c0b8b 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -124,6 +124,9 @@ protected: std::unordered_map _attachments; BlendFunc _blend; + + //since 3.3 + std::vector _meshes; }; extern std::string CC_DLL s_attributeNames[];//attribute names array diff --git a/cocos/3d/CCSubMesh.cpp b/cocos/3d/CCSubMesh.cpp index 330e6e3f2a..9625e10073 100644 --- a/cocos/3d/CCSubMesh.cpp +++ b/cocos/3d/CCSubMesh.cpp @@ -31,6 +31,7 @@ #include "3d/CCObjLoader.h" #include "3d/CCSprite3DMaterial.h" +#include "3d/CCMesh.h" #include "base/ccMacros.h" #include "base/CCEventCustom.h" @@ -50,12 +51,14 @@ SubMesh::SubMesh() , _primitiveType(PrimitiveType::TRIANGLES) , _indexFormat(IndexFormat::INDEX16) , _indexCount(0) +, _mesh(nullptr) { } SubMesh::~SubMesh() { cleanAndFreeBuffers(); + CC_SAFE_RELEASE(_mesh); } SubMesh* SubMesh::create(PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) @@ -68,6 +71,17 @@ SubMesh* SubMesh::create(PrimitiveType primitivetype, IndexFormat indexformat, c return submesh; } +SubMesh* SubMesh::create(Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) +{ + auto submesh = new SubMesh(); + submesh->_primitiveType = primitivetype; + submesh->_indexFormat = indexformat; + submesh->_mesh = mesh; + submesh->autorelease(); + + return submesh; +} + void SubMesh::cleanAndFreeBuffers() { if(glIsBuffer(_indexBuffer)) diff --git a/cocos/3d/CCSubMesh.h b/cocos/3d/CCSubMesh.h index ff8dc0e026..4e3b307e67 100644 --- a/cocos/3d/CCSubMesh.h +++ b/cocos/3d/CCSubMesh.h @@ -54,6 +54,8 @@ enum class PrimitiveType POINTS = GL_POINTS }; +class Mesh; + /** * SubMesh: Defines the way the mesh's vertices how to be connected together. */ @@ -65,6 +67,8 @@ public: /**create submesh from primitivetype indexformat and indices*/ static SubMesh* create(PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); + static SubMesh* create(Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); + /** get primitive type*/ PrimitiveType getPrimitiveType() const { return _primitiveType; } /**get index count*/ @@ -73,7 +77,9 @@ public: IndexFormat getIndexFormat() const { return _indexFormat; } /**get index buffer*/ GLuint getIndexBuffer() const {return _indexBuffer; } - + + /** get mesh */ + Mesh* getMesh() const { return _mesh; } CC_CONSTRUCTOR_ACCESS: @@ -91,8 +97,10 @@ protected: GLuint _indexBuffer; ssize_t _indexCount; + + Mesh* _mesh; //parent mesh, weak ref }; NS_CC_END -#endif // __CCMESH_H_ +#endif // __CCSUBMESH_H_ diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index 639c1e87cd..9f97a941bd 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -49,6 +49,7 @@ SubMeshState::SubMeshState() : _visible(true) , _texture(nullptr) , _skin(nullptr) +, _subMesh(nullptr) { } @@ -56,6 +57,7 @@ SubMeshState::~SubMeshState() { CC_SAFE_RELEASE(_texture); CC_SAFE_RELEASE(_skin); + CC_SAFE_RELEASE(_subMesh); } SubMeshState* SubMeshState::create() @@ -86,4 +88,14 @@ void SubMeshState::setSkin(MeshSkin* skin) } } +void SubMeshState::setSubMesh(SubMesh* subMesh) +{ + if (_subMesh != subMesh) + { + CC_SAFE_RETAIN(subMesh); + CC_SAFE_RELEASE(_subMesh); + _subMesh = subMesh; + } +} + NS_CC_END diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index 26bca6cb17..129a45a67b 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -39,6 +39,7 @@ NS_CC_BEGIN class Texture2D; class MeshSkin; +class SubMesh; /** * SubMeshState: visibility and apperence of submesh */ @@ -60,6 +61,14 @@ public: /**skin getter and setter*/ void setSkin(MeshSkin* skin); MeshSkin* getSkin() const { return _skin; } + + /**sub mesh getter and setter*/ + void setSubMesh(SubMesh* subMesh); + SubMesh* getSubMesh() const { return _subMesh; } + + /**name getter and setter*/ + void setName(const std::string& name) { _name = name; } + const std::string& getName() const { return _name; } CC_CONSTRUCTOR_ACCESS: @@ -70,6 +79,10 @@ protected: Texture2D* _texture; //texture that submesh is using MeshSkin* _skin; //skin bool _visible; // is the submesh visible + + //since 3.3 + std::string _name; + SubMesh* _subMesh; }; NS_CC_END From 4c8b24d11351bed03f6ff2a8912d311bcf204109 Mon Sep 17 00:00:00 2001 From: liuliang Date: Fri, 15 Aug 2014 15:32:15 +0800 Subject: [PATCH 03/67] Modify the binary parsing --- cocos/3d/CCBundle3D.cpp | 112 +++++++++++++++++++++++++++++++++++++- cocos/3d/CCBundle3D.h | 5 +- cocos/3d/CCBundle3DData.h | 10 +++- 3 files changed, 122 insertions(+), 5 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index ddfb3c5c32..53c348c9bf 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -49,6 +49,8 @@ static const char* VERSION = "version"; static const char* ID = "id"; static const char* MESHDATA_MESH = "mesh"; +static const char* MESHDATA_MESHES = "meshes"; +static const char* MESHDATA_PARTS ="parts"; static const char* MESHDATA_DEFAULTPART = "body"; static const char* MESHDATA_VERTEXSIZE = "vertexsize"; static const char* MESHDATA_VERTEX = "vertex"; @@ -69,6 +71,7 @@ static const char* SKINDATA_CHILDREN = "children"; static const char* SKINDATA_TRANSFORM = "tansform"; static const char* MATERIALDATA_MATERIAL = "material"; +static const char* MATERIALDATA_MATERIALS = "materials"; static const char* MATERIALDATA_BASE = "base"; static const char* MATERIALDATA_FILENAME = "filename"; static const char* MATERIALDATA_TEXTURES = "textures"; @@ -271,22 +274,125 @@ bool Bundle3D::loadSkeletonData(const std::string& id, Skeleton3DData* skeletond //since 3.3, to support reskin bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) { - //TODO + if (_isBinary) + { + return loadMeshDatasBinary(meshdatas); + } + else + { + return loadMeshDatasJson(meshdatas); + } return true; } +bool Bundle3D::loadMeshDatasBinary(MeshDatas& meshdatas) +{ + return true; +} +bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) +{ + const rapidjson::Value& mesh_data_array = _jsonReader[MESHDATA_MESHES]; + for (rapidjson::SizeType index = 0; index < mesh_data_array.Size(); index++) + { + MeshData* meshData = new MeshData(); + const rapidjson::Value& mesh_data = mesh_data_array[index]; + // mesh_vertex_attribute + const rapidjson::Value& mesh_vertex_attribute = mesh_data[MESHDATA_ATTRIBUTES]; + MeshVertexAttrib tempAttrib; + meshData->attribCount=mesh_vertex_attribute.Size(); + meshData->attribs.resize(meshData->attribCount); + for (int i = 0; i < mesh_vertex_attribute.Size(); i++) + { + const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; + int size = mesh_vertex_attribute_val[MESHDATA_SIZE].GetInt(); + std::string type = mesh_vertex_attribute_val[MESHDATA_TYPE].GetString(); + std::string attribute = mesh_vertex_attribute_val[MESHDATA_ATTRIBUTE].GetString(); + + tempAttrib.size = size; + tempAttrib.attribSizeBytes = sizeof(float) * size; + tempAttrib.type = parseGLType(type); + tempAttrib.vertexAttrib = parseGLProgramAttribute(attribute); + meshData->attribs[i]=tempAttrib; + } + // mesh vertices + //////////////////////////////////////////////////////////////////////////////////////////////// + const rapidjson::Value& mesh_data_vertex_array = mesh_data[MESHDATA_VERTICES]; + meshData->vertexSizeInFloat=mesh_data_vertex_array.Size(); + for (rapidjson::SizeType i = 0; i < mesh_data_vertex_array.Size(); i++) + { + meshData->vertex.push_back(mesh_data_vertex_array[i].GetDouble()); + } + // mesh part + //////////////////////////////////////////////////////////////////////////////////////////////// + const rapidjson::Value& mesh_part_array = mesh_data[MESHDATA_PARTS]; + for (rapidjson::SizeType i = 0; i < mesh_part_array.Size(); i++) + { + std::vector indexArray; + const rapidjson::Value& mesh_part = mesh_part_array[i]; + meshData->subMeshIds.push_back(mesh_part[ID].GetString()); + // index_number + const rapidjson::Value& indices_val_array = mesh_part[MESHDATA_INDICES]; + for (rapidjson::SizeType j = 0; j < indices_val_array.Size(); j++) + indexArray.push_back((unsigned short)indices_val_array[j].GetUint()); + + meshData->subMeshIndices.push_back(indexArray); + meshData->numIndex=meshData->subMeshIndices.size(); + } + meshdatas.meshDatas.push_back(meshData); + } + return true; +} bool Bundle3D::loadNodes(NodeDatas& nodedatas) { - //TODO return true; } bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) { - //TODO + + if (_isBinary) + { + return loadMaterialsBinary(materialdatas); + } + else + { + return loadMaterialsJson(materialdatas); + } return true; } +bool Bundle3D::loadMaterialsBinary(MaterialDatas& materialdatas) +{ + return true; +} +bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) +{ + if (!_jsonReader.HasMember(MATERIALDATA_MATERIALS)) + return false; + const rapidjson::Value& material_array = _jsonReader[MATERIALDATA_MATERIALS]; + for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) + { + NMaterialData materialData; + const rapidjson::Value& material_val = material_array[i]; + materialData.id = material_val[ID].GetString(); + if (material_val.HasMember(MATERIALDATA_TEXTURES)) + { + const rapidjson::Value& testure_array = material_val[MATERIALDATA_TEXTURES]; + for (rapidjson::SizeType j = 0; j < testure_array.Size(); j++) + { + NTextureData textureData; + const rapidjson::Value& texture_val = testure_array[j]; + std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); + textureData.filename = _modelRelativePath + filename; + textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); + textureData.wrapT = parseGLType(texture_val["wrapModeV"].GetString()); + materialData.textures.push_back(textureData); + } + } + materialdatas.materials.push_back(materialData); + } + return true; +} bool Bundle3D::loadJson(const std::string& path) { clear(); diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index 0adc4cd3dc..c89a37e925 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -97,11 +97,14 @@ public: //since 3.3, to support reskin virtual bool loadMeshDatas(MeshDatas& meshdatas); + bool loadMeshDatasJson(MeshDatas& meshdatas); + bool loadMeshDatasBinary(MeshDatas& meshdatas); //since 3.3, to support reskin virtual bool loadNodes(NodeDatas& nodedatas); //since 3.3, to support reskin virtual bool loadMaterials(MaterialDatas& materialdatas); - + bool loadMaterialsJson(MaterialDatas& materialdatas); + bool loadMaterialsBinary(MaterialDatas& materialdatas); protected: bool loadJson(const std::string& path); diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index 9f69b8b471..8dc1226c84 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -279,17 +279,25 @@ struct MaterialData } }; + /**new material, since 3.3 */ +struct NTextureData +{ + std::string filename; + GLenum wrapS; + GLenum wrapT; +} ; struct NMaterialData { std::string id; + std::vector textures; // copy from lv }; /** material datas, since 3.3 */ struct MaterialDatas { - std::vector materials; + std::vector materials; void resetData() { materials.clear(); From 42916bcbe6cb2fe8a8fa87b120ba9e357917f0e0 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 15 Aug 2014 15:55:21 +0800 Subject: [PATCH 04/67] newmodel --- cocos/3d/CCSkeleton3D.cpp | 10 ++++++++++ cocos/3d/CCSkeleton3D.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index 57d6ea3c4a..e1a99a44f0 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -354,6 +354,16 @@ void Skeleton3D::setRootBone(Bone3D* joint) _rootBone = joint; } +ssize_t Skeleton3D::getRootCount() const +{ + return _rootBones.size(); +} + +Bone3D* Skeleton3D::getRootBone(int index) const +{ + return _rootBones[index]; +} + int Skeleton3D::getBoneIndex(Bone3D* bone) const { int i = 0; diff --git a/cocos/3d/CCSkeleton3D.h b/cocos/3d/CCSkeleton3D.h index 2b8af4bebe..55f31238c2 100644 --- a/cocos/3d/CCSkeleton3D.h +++ b/cocos/3d/CCSkeleton3D.h @@ -200,6 +200,8 @@ public: /**get & set root bone*/ Bone3D* getRootBone() const; void setRootBone(Bone3D* bone); + ssize_t getRootCount() const; + Bone3D* getRootBone(int index) const; /**get bone index*/ int getBoneIndex(Bone3D* bone) const; @@ -227,6 +229,7 @@ protected: Vector _bones; // bones Bone3D* _rootBone; + std::vector _rootBones; }; /** From d09695b118cb839a8c54e2660024b8c2046b4eb5 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 15 Aug 2014 17:41:04 +0800 Subject: [PATCH 05/67] create from data --- cocos/3d/CCMeshSkin.cpp | 18 ++++++++++++++++++ cocos/3d/CCMeshSkin.h | 2 ++ cocos/3d/CCSkeleton3D.cpp | 26 +++++++++++++++++++++++++- cocos/3d/CCSkeleton3D.h | 7 ++++++- cocos/3d/CCSubMeshState.cpp | 11 +++++++++++ cocos/3d/CCSubMeshState.h | 2 ++ 6 files changed, 64 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCMeshSkin.cpp b/cocos/3d/CCMeshSkin.cpp index bedf24ede5..5a889039b1 100644 --- a/cocos/3d/CCMeshSkin.cpp +++ b/cocos/3d/CCMeshSkin.cpp @@ -37,6 +37,7 @@ static int PALETTE_ROWS = 3; MeshSkin::MeshSkin() : _rootBone(nullptr) , _matrixPalette(nullptr) +, _skeleton(nullptr) { } @@ -85,6 +86,23 @@ MeshSkin* MeshSkin::create(Skeleton3D* skeleton, const std::string& filename, co return nullptr; } +MeshSkin* MeshSkin::create(Skeleton3D* skeleton, const std::vector& boneNames, const std::vector& invBindPose) +{ + auto skin = new MeshSkin(); + skin->_skeleton = skeleton; + skeleton->retain(); + + CCASSERT(boneNames.size() == invBindPose.size(), "bone names' num should equals to invBindPose's num"); + for (const auto& it : boneNames) { + auto bone = skeleton->getBoneByName(it); + skin->addSkinBone(bone); + } + skin->_invBindPoses = invBindPose; + skin->autorelease(); + + return skin; +} + bool MeshSkin::initFromSkinData(const SkinData& skindata) { ssize_t i = 0; diff --git a/cocos/3d/CCMeshSkin.h b/cocos/3d/CCMeshSkin.h index bd5ff24245..83ebd8048f 100644 --- a/cocos/3d/CCMeshSkin.h +++ b/cocos/3d/CCMeshSkin.h @@ -52,6 +52,8 @@ public: /**create a new meshskin if do not want to share meshskin*/ static MeshSkin* create(Skeleton3D* skeleton, const std::string& filename, const std::string& name); + static MeshSkin* create(Skeleton3D* skeleton, const std::vector& boneNames, const std::vector& invBindPose); + /**get total bone count, skin bone + node bone*/ ssize_t getBoneCount() const; diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index e1a99a44f0..7009fca0e1 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -294,6 +294,18 @@ Skeleton3D* Skeleton3D::create(const std::string& filename, const std::string& n return nullptr; } +Skeleton3D* Skeleton3D::create(const std::vector& skeletondata) +{ + auto skeleton = new Skeleton3D(); + for (const auto& it : skeletondata) { + auto bone = createBone3D(*it); + skeleton->_rootBones.pushBack(bone); + bone->release(); + } + skeleton->autorelease(); + return skeleton; +} + bool Skeleton3D::initFromSkeletonData(const Skeleton3DData& skeletondata) { ssize_t i = 0; @@ -361,7 +373,7 @@ ssize_t Skeleton3D::getRootCount() const Bone3D* Skeleton3D::getRootBone(int index) const { - return _rootBones[index]; + return _rootBones.at(index); } int Skeleton3D::getBoneIndex(Bone3D* bone) const @@ -386,6 +398,7 @@ void Skeleton3D::removeAllBones() { _bones.clear(); CC_SAFE_RELEASE(_rootBone); + _rootBones.clear(); } void Skeleton3D::addBone(Bone3D* bone) @@ -393,6 +406,17 @@ void Skeleton3D::addBone(Bone3D* bone) _bones.pushBack(bone); } +Bone3D* Skeleton3D::createBone3D(const NodeData& nodedata) +{ + auto bone = Bone3D::create(nodedata.id); + for (const auto& it : nodedata.children) { + auto child = createBone3D(*it); + bone->addChildBone(child); + child->release(); + } + return bone; +} + //////////////////////////////////////////////////////////////////////// Skeleton3DDataCache* Skeleton3DDataCache::_cacheInstance = nullptr; diff --git a/cocos/3d/CCSkeleton3D.h b/cocos/3d/CCSkeleton3D.h index 55f31238c2..9788f73ec8 100644 --- a/cocos/3d/CCSkeleton3D.h +++ b/cocos/3d/CCSkeleton3D.h @@ -190,6 +190,8 @@ public: /**create a new meshskin if do not want to share Skeleton3D*/ static Skeleton3D* create(const std::string& filename, const std::string& name); + static Skeleton3D* create(const std::vector& skeletondata); + /**get total bone count*/ ssize_t getBoneCount() const; @@ -224,12 +226,15 @@ CC_CONSTRUCTOR_ACCESS: /**add bone*/ void addBone(Bone3D* bone); + /** create Bone3D from NodeData */ + static Bone3D* createBone3D(const NodeData& nodedata); + protected: Vector _bones; // bones Bone3D* _rootBone; - std::vector _rootBones; + Vector _rootBones; }; /** diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index 9f97a941bd..8d4aa61171 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -68,6 +68,17 @@ SubMeshState* SubMeshState::create() return state; } +SubMeshState* SubMeshState::create(const ModelNodeData& modelNodeData) +{ + auto state = new SubMeshState(); + state->autorelease(); + + state->_name = modelNodeData.id; + //not finished + + return state; +} + void SubMeshState::setTexture(Texture2D* tex) { if (tex != _texture) diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index 129a45a67b..60d23ea0dc 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -49,6 +49,8 @@ public: /**create submesh from primitivetype indexformat and indices*/ static SubMeshState* create(); + + static SubMeshState* create(const ModelNodeData& modelNodeData); /**texture getter and setter*/ void setTexture(Texture2D* tex); From ab80c5026db540c7c708c6825d78d9b5b20483a3 Mon Sep 17 00:00:00 2001 From: liuliang Date: Fri, 15 Aug 2014 17:45:37 +0800 Subject: [PATCH 06/67] Modify the binary parsing --- cocos/3d/CCBundle3D.cpp | 2 +- cocos/3d/CCSprite3D.h | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 53c348c9bf..ae89f16a1e 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -349,7 +349,7 @@ bool Bundle3D::loadNodes(NodeDatas& nodedatas) bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) { - + materialdatas.resetData(); if (_isBinary) { return loadMaterialsBinary(materialdatas); diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 7c587c0b8b..cffa8d0162 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -43,13 +43,14 @@ class MeshSkin; class AttachNode; class SubMeshState; class Skeleton3D; - +struct NodeData; /** Sprite3D: A sprite can be loaded from 3D model files, .obj, .c3t, .c3b, then can be drawed as sprite */ class CC_DLL Sprite3D : public Node, public BlendProtocol { public: /** creates a Sprite3D*/ static Sprite3D* create(const std::string &modelPath); + static Sprite3D* create(); // creates a Sprite3D. It only supports one texture, and overrides the internal texture with 'texturePath' static Sprite3D* create(const std::string &modelPath, const std::string &texturePath); @@ -99,6 +100,7 @@ CC_CONSTRUCTOR_ACCESS: /**load from .c3b or .c3t*/ bool loadFromC3x(const std::string& path); + bool loadFromC3x_0_3(const std::string& path); /**draw*/ virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; @@ -111,7 +113,7 @@ CC_CONSTRUCTOR_ACCESS: /**generate materials, and add them to cache, keyprefix is used as key prefix when added to cache*/ void genMaterials(const std::string& keyprefix, const std::vector& texpaths); - + Node* createNode(NodeData* nodedata); protected: Mesh* _mesh;//mesh MeshSkin* _skin;//skin From b5665a4723e5edfb17fe7194bc4154a8f5893183 Mon Sep 17 00:00:00 2001 From: liuliang Date: Fri, 15 Aug 2014 17:46:21 +0800 Subject: [PATCH 07/67] Modify the binary parsing --- cocos/3d/CCSprite3D.cpp | 123 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 4 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 796681837e..bdfec83e18 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -62,7 +62,17 @@ Sprite3D* Sprite3D::create(const std::string &modelPath) CC_SAFE_DELETE(sprite); return nullptr; } - +Sprite3D* Sprite3D::create() +{ + auto sprite = new Sprite3D(); + if (sprite) + { + sprite->autorelease(); + return sprite; + } + CC_SAFE_DELETE(sprite); + return nullptr; +} Sprite3D* Sprite3D::create(const std::string &modelPath, const std::string &texturePath) { auto sprite = create(modelPath); @@ -152,7 +162,63 @@ bool Sprite3D::loadFromObj(const std::string& path) return true; } +bool Sprite3D::loadFromC3x_0_3(const std::string& path) +{ + std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); + std::string key = fullPath + "#"; + //load from .c3b or .c3t + auto bundle = Bundle3D::getInstance(); + if (!bundle->load(fullPath)) + return false; + + MeshDatas meshdatas; + bool ret = bundle->loadMeshDatas(meshdatas); + if (!ret) + { + for( int i = 0 ; i < meshdatas.meshDatas.size() ; i++ ) + { + MeshData* meshData= meshdatas.meshDatas[i]; + if(meshData) + { + } + } + return false; + } + + // _mesh = Mesh::create(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs); + + CC_SAFE_RETAIN(_mesh); + //add mesh to cache + MeshCache::getInstance()->addMesh(key, _mesh); + _skeleton = Skeleton3D::create(fullPath, ""); + CC_SAFE_RETAIN(_skeleton); + _skin = MeshSkin::create(_skeleton, fullPath, ""); + CC_SAFE_RETAIN(_skin); + + MaterialDatas materialdatas; + ret = bundle->loadMaterials(materialdatas); + if (ret) + { + + } + NodeDatas nodeDatas; + bundle->loadNodes(nodeDatas); + for(int i = 0; i < nodeDatas.nodes.size(); i++ ) + { + NodeData* nodeData= nodeDatas.nodes[i]; + if(nodeData) + { + Node* node =createNode(nodeData); + if(node) + { + addChild(node); + } + } + } + genGLProgramState(); + return true; +} bool Sprite3D::loadFromC3x(const std::string& path) { std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); @@ -192,7 +258,8 @@ bool Sprite3D::loadFromC3x(const std::string& path) } genMaterials(key, texpaths); } - + NodeDatas nodeDatas; + bundle->loadNodes(nodeDatas); genGLProgramState(); return true; @@ -284,7 +351,48 @@ GLProgram* Sprite3D::getDefaultGLProgram(bool textured) return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); } } - +Node* Sprite3D::createNode(NodeData* nodedata) +{ + Node* node=nullptr; + ModelNodeData* modelNodeData=nodedata->asModelNodeData(); + if(modelNodeData) + { + Sprite3D* sprite3D= Sprite3D::create(); + if(node) + { + Mesh* mesh = Mesh::create(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs); + CC_SAFE_RETAIN(mesh); + sprite3D->addMesh(mesh); + node->setAdditionalTransform(&nodedata->transform); + node = sprite3D; + } + } + else + { + node= Node::create(); + if(node) + { + node->setAdditionalTransform(&nodedata->transform); + + } + } + if(node) + { + for(int i = 0; i < nodedata->children.size(); i++ ) + { + NodeData* childData = nodedata->children[i]; + if(childData) + { + Node* childNode= createNode(childData); + if(childNode) + { + node->addChild(createNode(childData)); + } + } + } + } + return node; +} void Sprite3D::genMaterials(const std::string& keyprefix, const std::vector& texpaths) { _subMeshStates.clear(); @@ -316,7 +424,14 @@ void Sprite3D::setTexture(Texture2D* texture) { _subMeshStates.at(0)->setTexture(texture); } - +bool Sprite3D::addMesh(Mesh* mesh) +{ + if(mesh) + { + _meshes.push_back(mesh); + } + return true; +} AttachNode* Sprite3D::getAttachNode(const std::string& boneName) { auto it = _attachments.find(boneName); From 0db924d7cdf866f4004062c8d2947df6bfbc52de Mon Sep 17 00:00:00 2001 From: liuliang Date: Fri, 15 Aug 2014 18:20:37 +0800 Subject: [PATCH 08/67] Parse the data file --- cocos/3d/CCSprite3D.cpp | 78 +++++++++++++++-------------------------- cocos/3d/CCSprite3D.h | 2 +- 2 files changed, 29 insertions(+), 51 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index bdacdffeaa..0852eb6877 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -171,31 +171,28 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) auto bundle = Bundle3D::getInstance(); if (!bundle->load(fullPath)) return false; - MeshDatas meshdatas; bool ret = bundle->loadMeshDatas(meshdatas); if (!ret) { - for( int i = 0 ; i < meshdatas.meshDatas.size() ; i++ ) - { - MeshData* meshData= meshdatas.meshDatas[i]; - if(meshData) - { - } - } return false; } - - // _mesh = Mesh::create(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs); - - CC_SAFE_RETAIN(_mesh); + for( int i = 0 ; i < meshdatas.meshDatas.size() ; i++ ) + { + MeshData* meshData= meshdatas.meshDatas[i]; + if(meshData) + { + Mesh* mesh = Mesh::create(meshData->vertex,meshData->vertexSizeInFloat, meshData->subMeshIndices,meshData->attribs); + _meshes.push_back(mesh); + } + } + // CC_SAFE_RETAIN(_mesh); //add mesh to cache - MeshCache::getInstance()->addMesh(key, _mesh); + // MeshCache::getInstance()->addMesh(key, _mesh); _skeleton = Skeleton3D::create(fullPath, ""); CC_SAFE_RETAIN(_skeleton); _skin = MeshSkin::create(_skeleton, fullPath, ""); CC_SAFE_RETAIN(_skin); - MaterialDatas materialdatas; ret = bundle->loadMaterials(materialdatas); if (ret) @@ -209,13 +206,11 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) NodeData* nodeData= nodeDatas.nodes[i]; if(nodeData) { - Node* node =createNode(nodeData); - if(node) - { - addChild(node); - } + createNode(nodeData,this); } } + _skeleton = Skeleton3D::create(nodeDatas.skeleton); + CC_SAFE_RETAIN(_skeleton); genGLProgramState(); return true; } @@ -351,20 +346,16 @@ GLProgram* Sprite3D::getDefaultGLProgram(bool textured) return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); } } -Node* Sprite3D::createNode(NodeData* nodedata) +void Sprite3D::createNode(NodeData* nodedata,Node* root) { Node* node=nullptr; ModelNodeData* modelNodeData=nodedata->asModelNodeData(); if(modelNodeData) { - Sprite3D* sprite3D= Sprite3D::create(); - if(node) + auto subMeshState = SubMeshState::create(); + if(subMeshState) { - Mesh* mesh = Mesh::create(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs); - CC_SAFE_RETAIN(mesh); - sprite3D->addMesh(mesh); - node->setAdditionalTransform(&nodedata->transform); - node = sprite3D; + _subMeshStates.pushBack(subMeshState); } } else @@ -373,25 +364,20 @@ Node* Sprite3D::createNode(NodeData* nodedata) if(node) { node->setAdditionalTransform(&nodedata->transform); - + if(root) + { + root->addChild(node); + } } } - if(node) + for(int i = 0; i < nodedata->children.size(); i++ ) { - for(int i = 0; i < nodedata->children.size(); i++ ) - { - NodeData* childData = nodedata->children[i]; - if(childData) - { - Node* childNode= createNode(childData); - if(childNode) - { - node->addChild(createNode(childData)); - } - } - } + NodeData* childData = nodedata->children[i]; + if(childData) + { + createNode(childData,node); + } } - return node; } void Sprite3D::genMaterials(const std::string& keyprefix, const std::vector& texpaths) { @@ -424,14 +410,6 @@ void Sprite3D::setTexture(Texture2D* texture) { _subMeshStates.at(0)->setTexture(texture); } -bool Sprite3D::addMesh(Mesh* mesh) -{ - if(mesh) - { - _meshes.push_back(mesh); - } - return true; -} AttachNode* Sprite3D::getAttachNode(const std::string& boneName) { auto it = _attachments.find(boneName); diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index e24aeb04b7..ca484dd086 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -128,7 +128,7 @@ CC_CONSTRUCTOR_ACCESS: /**generate materials, and add them to cache, keyprefix is used as key prefix when added to cache*/ void genMaterials(const std::string& keyprefix, const std::vector& texpaths); - Node* createNode(NodeData* nodedata); + void createNode(NodeData* nodedata,Node* root); protected: Mesh* _mesh;//mesh MeshSkin* _skin;//skin From a740841f5e8717a24c331ae985e46c654235c0a4 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 15 Aug 2014 18:21:58 +0800 Subject: [PATCH 09/67] submeshid --- cocos/3d/CCMesh.cpp | 9 +++++++++ cocos/3d/CCMesh.h | 3 +++ cocos/3d/CCSubMesh.cpp | 4 ++-- cocos/3d/CCSubMesh.h | 8 ++++++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 16007b1588..d2e6cd5b7d 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -295,6 +295,15 @@ const AABB& Mesh::getOriginAABB() const return _originAABB; } +SubMesh* Mesh::getSubMeshById(const std::string& subMeshId) const +{ + for (auto it : _subMeshes) { + if (it->getSubMeshId() == subMeshId) + return it; + } + return nullptr; +} + /** * MeshCache */ diff --git a/cocos/3d/CCMesh.h b/cocos/3d/CCMesh.h index 304a09f207..ed0c78c145 100644 --- a/cocos/3d/CCMesh.h +++ b/cocos/3d/CCMesh.h @@ -127,6 +127,9 @@ public: /** get origin aabb that calculate from vertices*/ const AABB& getOriginAABB() const; + /** get submesh by id */ + SubMesh* getSubMeshById(const std::string& subMeshId) const; + /**to be deprecated, those functions have been moved to SubMesh*/ /** get primitive type*/ CC_DEPRECATED_ATTRIBUTE PrimitiveType getPrimitiveType() const { return _subMeshes.at(0)->getPrimitiveType(); } diff --git a/cocos/3d/CCSubMesh.cpp b/cocos/3d/CCSubMesh.cpp index 9625e10073..693d8d37d3 100644 --- a/cocos/3d/CCSubMesh.cpp +++ b/cocos/3d/CCSubMesh.cpp @@ -58,7 +58,6 @@ SubMesh::SubMesh() SubMesh::~SubMesh() { cleanAndFreeBuffers(); - CC_SAFE_RELEASE(_mesh); } SubMesh* SubMesh::create(PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) @@ -71,12 +70,13 @@ SubMesh* SubMesh::create(PrimitiveType primitivetype, IndexFormat indexformat, c return submesh; } -SubMesh* SubMesh::create(Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) +SubMesh* SubMesh::create(const std::string& submeshId, Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) { auto submesh = new SubMesh(); submesh->_primitiveType = primitivetype; submesh->_indexFormat = indexformat; submesh->_mesh = mesh; + submesh->_id = submeshId; submesh->autorelease(); return submesh; diff --git a/cocos/3d/CCSubMesh.h b/cocos/3d/CCSubMesh.h index 4e3b307e67..1e792473f7 100644 --- a/cocos/3d/CCSubMesh.h +++ b/cocos/3d/CCSubMesh.h @@ -67,7 +67,7 @@ public: /**create submesh from primitivetype indexformat and indices*/ static SubMesh* create(PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); - static SubMesh* create(Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); + static SubMesh* create(const std::string& submeshId, Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); /** get primitive type*/ PrimitiveType getPrimitiveType() const { return _primitiveType; } @@ -80,6 +80,9 @@ public: /** get mesh */ Mesh* getMesh() const { return _mesh; } + + /** get submesh id */ + const std::string& getSubMeshId() const { return _id; } CC_CONSTRUCTOR_ACCESS: @@ -98,7 +101,8 @@ protected: GLuint _indexBuffer; ssize_t _indexCount; - Mesh* _mesh; //parent mesh, weak ref + Mesh* _mesh; //parent mesh, weak ref + std::string _id; //submeshid }; NS_CC_END From b4a20feabc70e3ce6d12d8d341e03702597199db Mon Sep 17 00:00:00 2001 From: liuliang Date: Fri, 15 Aug 2014 18:27:28 +0800 Subject: [PATCH 10/67] Parse the data file --- cocos/3d/CCBundle3D.cpp | 1 + cocos/3d/CCSprite3D.cpp | 11 ----------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index ae89f16a1e..c1d83a8df3 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -274,6 +274,7 @@ bool Bundle3D::loadSkeletonData(const std::string& id, Skeleton3DData* skeletond //since 3.3, to support reskin bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) { + meshdatas.resetData(); if (_isBinary) { return loadMeshDatasBinary(meshdatas); diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 0852eb6877..85318bc2d4 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -62,17 +62,6 @@ Sprite3D* Sprite3D::create(const std::string &modelPath) CC_SAFE_DELETE(sprite); return nullptr; } -Sprite3D* Sprite3D::create() -{ - auto sprite = new Sprite3D(); - if (sprite) - { - sprite->autorelease(); - return sprite; - } - CC_SAFE_DELETE(sprite); - return nullptr; -} Sprite3D* Sprite3D::create(const std::string &modelPath, const std::string &texturePath) { auto sprite = create(modelPath); From 3ab7c6b9526b3e216cbea0c77106dda582ecc209 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 15 Aug 2014 20:52:45 +0800 Subject: [PATCH 11/67] create from bundle data --- cocos/3d/CCBundle3D.cpp | 39 ++++++++++++++++---------------- cocos/3d/CCBundle3DData.h | 17 +++++++++++--- cocos/3d/CCMesh.cpp | 15 +++++++++++++ cocos/3d/CCMesh.h | 2 ++ cocos/3d/CCSprite3D.cpp | 44 ++++++++++++++++++++++++------------- cocos/3d/CCSprite3D.h | 11 +++++++--- cocos/3d/CCSubMeshState.cpp | 12 +++++++--- cocos/3d/CCSubMeshState.h | 20 +++++++++++------ 8 files changed, 110 insertions(+), 50 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index c1d83a8df3..ed65f00e04 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -372,25 +372,26 @@ bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) const rapidjson::Value& material_array = _jsonReader[MATERIALDATA_MATERIALS]; for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) { - NMaterialData materialData; - const rapidjson::Value& material_val = material_array[i]; - materialData.id = material_val[ID].GetString(); - - if (material_val.HasMember(MATERIALDATA_TEXTURES)) - { - const rapidjson::Value& testure_array = material_val[MATERIALDATA_TEXTURES]; - for (rapidjson::SizeType j = 0; j < testure_array.Size(); j++) - { - NTextureData textureData; - const rapidjson::Value& texture_val = testure_array[j]; - std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); - textureData.filename = _modelRelativePath + filename; - textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); - textureData.wrapT = parseGLType(texture_val["wrapModeV"].GetString()); - materialData.textures.push_back(textureData); - } - } - materialdatas.materials.push_back(materialData); + //TODO, FIXME +// NMaterialData materialData; +// const rapidjson::Value& material_val = material_array[i]; +// materialData.id = material_val[ID].GetString(); +// +// if (material_val.HasMember(MATERIALDATA_TEXTURES)) +// { +// const rapidjson::Value& testure_array = material_val[MATERIALDATA_TEXTURES]; +// for (rapidjson::SizeType j = 0; j < testure_array.Size(); j++) +// { +// NTextureData textureData; +// const rapidjson::Value& texture_val = testure_array[j]; +// std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); +// textureData.filename = _modelRelativePath + filename; +// textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); +// textureData.wrapT = parseGLType(texture_val["wrapModeV"].GetString()); +// materialData.textures.push_back(textureData); +// } +// } +// materialdatas.materials.push_back(materialData); } return true; } diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index 8dc1226c84..186a1674d9 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -283,6 +283,7 @@ struct MaterialData /**new material, since 3.3 */ struct NTextureData { + std::string id; std::string filename; GLenum wrapS; GLenum wrapT; @@ -290,18 +291,28 @@ struct NTextureData struct NMaterialData { std::string id; - std::vector textures; - // copy from lv + std::string fileName; + GLuint wrapS; + GLuint wrapT; }; /** material datas, since 3.3 */ struct MaterialDatas { - std::vector materials; + std::vector materials; void resetData() { materials.clear(); } + const NTextureData* getMaterialData(const std::string& materialid) const + { + for(const auto& it : materials) + { + if (it.id == materialid) + return ⁢ + } + return nullptr; + } }; /**animation data*/ diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index d2e6cd5b7d..1673838692 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -32,6 +32,7 @@ #include "3d/CCSubMesh.h" #include "3d/CCObjLoader.h" #include "3d/CCSprite3DMaterial.h" +#include "3d/CCSubMesh.h" #include "base/ccMacros.h" #include "base/CCEventCustom.h" @@ -198,6 +199,20 @@ Mesh* Mesh::create(const std::vector &vertices, int vertexSizeInFloat, co return nullptr; } +Mesh* Mesh::create(const MeshData& meshdata) +{ + auto mesh = new Mesh(); + if (mesh && mesh->init(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs)) + { + for (int i = 0; i < (int)mesh->getSubMeshCount(); i++) { + auto submesh = mesh->getSubMesh(i); + submesh->_id = meshdata.subMeshIds[i]; + } + } + mesh->autorelease(); + return mesh; +} + bool Mesh::init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) { bool bRet = _renderdata.init(positions, normals, texs, indices); diff --git a/cocos/3d/CCMesh.h b/cocos/3d/CCMesh.h index ed0c78c145..5aee289240 100644 --- a/cocos/3d/CCMesh.h +++ b/cocos/3d/CCMesh.h @@ -102,6 +102,8 @@ public: * @param attribs vertex attributes */ static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); + + static Mesh* create(const MeshData& meshdata); /**get vertex buffer*/ inline GLuint getVertexBuffer() const { return _vertexBuffer; } diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 85318bc2d4..c2b2965e67 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -171,17 +171,11 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) MeshData* meshData= meshdatas.meshDatas[i]; if(meshData) { - Mesh* mesh = Mesh::create(meshData->vertex,meshData->vertexSizeInFloat, meshData->subMeshIndices,meshData->attribs); - _meshes.push_back(mesh); + Mesh* mesh = Mesh::create(*meshData); + _meshes.pushBack(mesh); } } - // CC_SAFE_RETAIN(_mesh); - //add mesh to cache - // MeshCache::getInstance()->addMesh(key, _mesh); - _skeleton = Skeleton3D::create(fullPath, ""); - CC_SAFE_RETAIN(_skeleton); - _skin = MeshSkin::create(_skeleton, fullPath, ""); - CC_SAFE_RETAIN(_skin); + MaterialDatas materialdatas; ret = bundle->loadMaterials(materialdatas); if (ret) @@ -190,16 +184,18 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) } NodeDatas nodeDatas; bundle->loadNodes(nodeDatas); + _skeleton = Skeleton3D::create(nodeDatas.skeleton); + CC_SAFE_RETAIN(_skeleton); + for(int i = 0; i < nodeDatas.nodes.size(); i++ ) { NodeData* nodeData= nodeDatas.nodes[i]; if(nodeData) { - createNode(nodeData,this); + createNode(nodeData, this, materialdatas); } } - _skeleton = Skeleton3D::create(nodeDatas.skeleton); - CC_SAFE_RETAIN(_skeleton); + genGLProgramState(); return true; } @@ -260,6 +256,7 @@ Sprite3D::Sprite3D() Sprite3D::~Sprite3D() { _subMeshStates.clear(); + _meshes.clear(); CC_SAFE_RELEASE_NULL(_mesh); CC_SAFE_RELEASE_NULL(_skin); CC_SAFE_RELEASE_NULL(_skeleton); @@ -335,16 +332,22 @@ GLProgram* Sprite3D::getDefaultGLProgram(bool textured) return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); } } -void Sprite3D::createNode(NodeData* nodedata,Node* root) +void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas) { Node* node=nullptr; ModelNodeData* modelNodeData=nodedata->asModelNodeData(); if(modelNodeData) { - auto subMeshState = SubMeshState::create(); + auto subMeshState = SubMeshState::create(modelNodeData->id); if(subMeshState) { _subMeshStates.pushBack(subMeshState); + subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); + auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); + subMeshState->setSkin(skin); + auto texpath = matrialdatas.getMaterialData(modelNodeData->matrialId)->filename; + subMeshState->setTexture(texpath); + //set wrap s, t } } else @@ -364,10 +367,21 @@ void Sprite3D::createNode(NodeData* nodedata,Node* root) NodeData* childData = nodedata->children[i]; if(childData) { - createNode(childData,node); + createNode(childData,node, matrialdatas); } } } + +SubMesh* Sprite3D::getSubMesh(const std::string& subMeshId) const +{ + for (auto it : _meshes) { + auto subMesh = it->getSubMeshById(subMeshId); + if (subMesh) + return subMesh; + } + return nullptr; +} + void Sprite3D::genMaterials(const std::string& keyprefix, const std::vector& texpaths) { _subMeshStates.clear(); diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index ca484dd086..98c0a38878 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -33,7 +33,8 @@ #include "base/CCProtocols.h" #include "2d/CCNode.h" #include "renderer/CCMeshCommand.h" -#include "CCAABB.h" +#include "3d/CCAABB.h" +#include "3d/CCBundle3DData.h" NS_CC_BEGIN @@ -45,6 +46,7 @@ class AttachNode; class SubMeshState; class Skeleton3D; struct NodeData; +class SubMesh; /** Sprite3D: A sprite can be loaded from 3D model files, .obj, .c3t, .c3b, then can be drawed as sprite */ class CC_DLL Sprite3D : public Node, public BlendProtocol { @@ -128,7 +130,10 @@ CC_CONSTRUCTOR_ACCESS: /**generate materials, and add them to cache, keyprefix is used as key prefix when added to cache*/ void genMaterials(const std::string& keyprefix, const std::vector& texpaths); - void createNode(NodeData* nodedata,Node* root); + void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas); + /**get SubMesh by Id*/ + SubMesh* getSubMesh(const std::string& subMeshId) const; + protected: Mesh* _mesh;//mesh MeshSkin* _skin;//skin @@ -143,7 +148,7 @@ protected: BlendFunc _blend; //since 3.3 - std::vector _meshes; + Vector _meshes; mutable AABB _aabb; // cache current aabb mutable Mat4 _nodeToWorldTransform; // cache the matrix diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index 8d4aa61171..11d2220424 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -39,6 +39,7 @@ #include "base/CCDirector.h" #include "renderer/ccGLStateCache.h" #include "renderer/CCTexture2D.h" +#include "renderer/CCTextureCache.h" using namespace std; @@ -68,17 +69,22 @@ SubMeshState* SubMeshState::create() return state; } -SubMeshState* SubMeshState::create(const ModelNodeData& modelNodeData) +SubMeshState* SubMeshState::create(const std::string& name) { auto state = new SubMeshState(); state->autorelease(); - state->_name = modelNodeData.id; - //not finished + state->_name = name; return state; } +void SubMeshState::setTexture(const std::string& texPath) +{ + auto tex = Director::getInstance()->getTextureCache()->addImage(texPath); + setTexture(tex); +} + void SubMeshState::setTexture(Texture2D* tex) { if (tex != _texture) diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index 60d23ea0dc..4ef2f2795f 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -45,14 +45,16 @@ class SubMesh; */ class CC_DLL SubMeshState : public Ref { + friend class Sprite3D; public: /**create submesh from primitivetype indexformat and indices*/ static SubMeshState* create(); - static SubMeshState* create(const ModelNodeData& modelNodeData); + static SubMeshState* create(const std::string& name); /**texture getter and setter*/ + void setTexture(const std::string& texPath); void setTexture(Texture2D* tex); Texture2D* getTexture() const { return _texture; } @@ -60,16 +62,13 @@ public: void setVisible(bool visible) { _visible = visible; } bool isVisible() const { return _visible; } - /**skin getter and setter*/ - void setSkin(MeshSkin* skin); + /**skin getter */ MeshSkin* getSkin() const { return _skin; } - /**sub mesh getter and setter*/ - void setSubMesh(SubMesh* subMesh); + /**sub mesh getter */ SubMesh* getSubMesh() const { return _subMesh; } - /**name getter and setter*/ - void setName(const std::string& name) { _name = name; } + /**name getter */ const std::string& getName() const { return _name; } CC_CONSTRUCTOR_ACCESS: @@ -77,6 +76,13 @@ CC_CONSTRUCTOR_ACCESS: SubMeshState(); virtual ~SubMeshState(); + /**skin setter*/ + void setSkin(MeshSkin* skin); + /**submesh setter*/ + void setSubMesh(SubMesh* subMesh); + /**name setter*/ + void setName(const std::string& name) { _name = name; } + protected: Texture2D* _texture; //texture that submesh is using MeshSkin* _skin; //skin From f35dd346eb4325a7e1db5503a170f66bbe64476e Mon Sep 17 00:00:00 2001 From: liuliang Date: Sat, 16 Aug 2014 09:59:08 +0800 Subject: [PATCH 12/67] Modify Analytic --- cocos/3d/CCSprite3D.cpp | 2 +- cocos/3d/CCSprite3D.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 85318bc2d4..5c4552a542 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -286,7 +286,7 @@ bool Sprite3D::initWithFile(const std::string &path) } else if (ext == ".c3b" || ext == ".c3t") { - return loadFromC3x(path); + return loadFromC3x_0_3(path); } return false; diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index ca484dd086..cadc039a02 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -51,8 +51,7 @@ class CC_DLL Sprite3D : public Node, public BlendProtocol public: /** creates a Sprite3D*/ static Sprite3D* create(const std::string &modelPath); - static Sprite3D* create(); - + // creates a Sprite3D. It only supports one texture, and overrides the internal texture with 'texturePath' static Sprite3D* create(const std::string &modelPath, const std::string &texturePath); From 21dcc51c0f78c2f49cf776707d4331c0de7bb2a0 Mon Sep 17 00:00:00 2001 From: liuliang Date: Sat, 16 Aug 2014 10:41:42 +0800 Subject: [PATCH 13/67] Modify the material parsing --- cocos/3d/CCBundle3D.cpp | 87 ++++++++++++++++++++++++++++++--------- cocos/3d/CCBundle3D.h | 6 +++ cocos/3d/CCBundle3DData.h | 33 +++++++++++---- cocos/3d/CCSprite3D.cpp | 25 +++++++++-- 4 files changed, 121 insertions(+), 30 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index ed65f00e04..e6275f2e5e 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -373,25 +373,25 @@ bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) { //TODO, FIXME -// NMaterialData materialData; -// const rapidjson::Value& material_val = material_array[i]; -// materialData.id = material_val[ID].GetString(); -// -// if (material_val.HasMember(MATERIALDATA_TEXTURES)) -// { -// const rapidjson::Value& testure_array = material_val[MATERIALDATA_TEXTURES]; -// for (rapidjson::SizeType j = 0; j < testure_array.Size(); j++) -// { -// NTextureData textureData; -// const rapidjson::Value& texture_val = testure_array[j]; -// std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); -// textureData.filename = _modelRelativePath + filename; -// textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); -// textureData.wrapT = parseGLType(texture_val["wrapModeV"].GetString()); -// materialData.textures.push_back(textureData); -// } -// } -// materialdatas.materials.push_back(materialData); + NMaterialData materialData; + const rapidjson::Value& material_val = material_array[i]; + materialData.id = material_val[ID].GetString(); + if (material_val.HasMember(MATERIALDATA_TEXTURES)) + { + const rapidjson::Value& testure_array = material_val[MATERIALDATA_TEXTURES]; + for (rapidjson::SizeType j = 0; j < testure_array.Size(); j++) + { + NTextureData textureData; + const rapidjson::Value& texture_val = testure_array[j]; + std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); + textureData.filename = _modelRelativePath + filename; + textureData.type = parseGLTextureType(texture_val["type"].GetString()); + textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); + textureData.wrapT = parseGLType(texture_val["wrapModeV"].GetString()); + materialData.textures.push_back(textureData); + } + } + materialdatas.materials.push_back(materialData); } return true; } @@ -1144,7 +1144,54 @@ GLenum Bundle3D::parseGLType(const std::string& str) return 0; } } - +NTextureData::Usage Bundle3D::parseGLTextureType(const std::string& str) +{ + if (str == "AMBIENT") + { + return NTextureData::Usage::Ambient; + } + else if(str == "BUMP") + { + return NTextureData::Usage::Bump; + } + else if(str == "DIFFUSE") + { + return NTextureData::Usage::Diffuse; + } + else if(str == "EMISSIVE") + { + return NTextureData::Usage::Emissive; + } + else if(str == "NONE") + { + return NTextureData::Usage::None; + } + else if (str == "NORMAL") + { + return NTextureData::Usage::Normal; + } + else if (str == "REFLECTION") + { + return NTextureData::Usage::Reflection; + } + else if (str == "SHININESS") + { + return NTextureData::Usage::Shininess; + } + else if (str == "SPECULAR") + { + return NTextureData::Usage::Specular; + } + else if (str == "TRANSPARENCY") + { + return NTextureData::Usage::Transparency; + } + else + { + CCASSERT(false, "Wrong GL type"); + return NTextureData::Usage::Unknown; + } +} unsigned int Bundle3D::parseGLProgramAttribute(const std::string& str) { if (str == "VERTEX_ATTRIB_POSITION") diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index c89a37e925..b8848a607f 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -159,6 +159,12 @@ protected: */ GLenum parseGLType(const std::string& str); + /** + * get define data type + * @param str The type in string + */ + NTextureData::Usage parseGLTextureType(const std::string& str); + /** * get vertex attribute type * @param str The type in string diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index 186a1674d9..1b06a69e4d 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -283,28 +283,48 @@ struct MaterialData /**new material, since 3.3 */ struct NTextureData { + enum class Usage { + Unknown = 0, + None = 1, + Diffuse = 2, + Emissive = 3, + Ambient = 4, + Specular = 5, + Shininess = 6, + Normal = 7, + Bump = 8, + Transparency = 9, + Reflection = 10 + }; std::string id; std::string filename; + Usage type; GLenum wrapS; GLenum wrapT; } ; struct NMaterialData { + std::vector textures; std::string id; - std::string fileName; - GLuint wrapS; - GLuint wrapT; + const NTextureData* getTextureData(NTextureData::Usage& type) const + { + for(const auto& it : textures) + { + if (it.type == type) + return ⁢ + } + return nullptr; + } }; - /** material datas, since 3.3 */ struct MaterialDatas { - std::vector materials; + std::vector materials; void resetData() { materials.clear(); } - const NTextureData* getMaterialData(const std::string& materialid) const + const NMaterialData* getMaterialData(const std::string& materialid) const { for(const auto& it : materials) { @@ -314,7 +334,6 @@ struct MaterialDatas return nullptr; } }; - /**animation data*/ struct Animation3DData { diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 7fd93e3f53..4d6b66e113 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -180,7 +180,7 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) ret = bundle->loadMaterials(materialdatas); if (ret) { - + return false; } NodeDatas nodeDatas; bundle->loadNodes(nodeDatas); @@ -345,8 +345,27 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); subMeshState->setSkin(skin); - auto texpath = matrialdatas.getMaterialData(modelNodeData->matrialId)->filename; - subMeshState->setTexture(texpath); + const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); + if(materialData) + { + NTextureData::Usage type = NTextureData::Usage::Diffuse; + const NTextureData* textureData = materialData->getTextureData(type); + if(textureData) + { + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter=GL_LINEAR; + texParams.magFilter=GL_LINEAR; + texParams.wrapS=textureData->wrapS; + texParams.wrapT=textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + + } + } //set wrap s, t } } From f8f416cd3ce317b45c0ad2536e756192a17ea5f0 Mon Sep 17 00:00:00 2001 From: lvlong Date: Sat, 16 Aug 2014 11:12:26 +0800 Subject: [PATCH 14/67] merge bundle --- cocos/3d/CCBundle3D.cpp | 285 ++++++++++++++++++++++++++++++++++------ cocos/3d/CCBundle3D.h | 22 +++- 2 files changed, 269 insertions(+), 38 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index ed65f00e04..0fc72fd6df 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -48,9 +48,6 @@ static const char* VERSION = "version"; static const char* ID = "id"; -static const char* MESHDATA_MESH = "mesh"; -static const char* MESHDATA_MESHES = "meshes"; -static const char* MESHDATA_PARTS ="parts"; static const char* MESHDATA_DEFAULTPART = "body"; static const char* MESHDATA_VERTEXSIZE = "vertexsize"; static const char* MESHDATA_VERTEX = "vertex"; @@ -64,11 +61,20 @@ static const char* MESHDATA_TYPE = "type"; static const char* MESHDATA_ATTRIBUTE = "attribute"; static const char* SKINDATA_SKIN = "skin"; -static const char* SKINDATA_BONES = "bones"; -static const char* SKINDATA_NODE = "node"; static const char* SKINDATA_BINDSHAPE = "bindshape"; -static const char* SKINDATA_CHILDREN = "children"; -static const char* SKINDATA_TRANSFORM = "tansform"; + +static const char* MESH = "mesh"; +static const char* MESHES = "meshes"; +static const char* MESHPARTID = "meshpartid"; +static const char* MATERIALID = "materialid"; +static const char* NODE = "node"; +static const char* NODES = "nodes"; +static const char* CHILDREN = "children"; +static const char* PARTS = "parts"; +static const char* BONES = "bones"; +static const char* MATERIALS = "materials"; +static const char* ANIMATIONS = "animations"; +static const char* TRANSFORM = "transform"; static const char* MATERIALDATA_MATERIAL = "material"; static const char* MATERIALDATA_MATERIALS = "materials"; @@ -78,7 +84,6 @@ static const char* MATERIALDATA_TEXTURES = "textures"; static const char* ANIMATIONDATA_ANIMATION = "animation"; static const char* ANIMATIONDATA_LENGTH = "length"; -static const char* ANIMATIONDATA_BONES = "bones"; static const char* ANIMATIONDATA_BONEID = "boneId"; static const char* ANIMATIONDATA_KEYFRAMES = "keyframes"; static const char* ANIMATIONDATA_TRANSLATION = "translation"; @@ -95,7 +100,7 @@ void getChildMap(std::map >& map, SkinData* skinData, cons // get transform matrix Mat4 transform; - const rapidjson::Value& parent_tranform = val[SKINDATA_TRANSFORM]; + const rapidjson::Value& parent_tranform = val[TRANSFORM]; for (rapidjson::SizeType j = 0; j < parent_tranform.Size(); j++) { transform.m[j] = parent_tranform[j].GetDouble(); @@ -119,10 +124,10 @@ void getChildMap(std::map >& map, SkinData* skinData, cons if(skinData->rootBoneIndex < 0) skinData->rootBoneIndex = parent_name_index; - if (!val.HasMember(SKINDATA_CHILDREN)) + if (!val.HasMember(CHILDREN)) return; - const rapidjson::Value& children = val[SKINDATA_CHILDREN]; + const rapidjson::Value& children = val[CHILDREN]; for (rapidjson::SizeType i = 0; i < children.Size(); i++) { // get child bone name @@ -291,7 +296,7 @@ bool Bundle3D::loadMeshDatasBinary(MeshDatas& meshdatas) } bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) { - const rapidjson::Value& mesh_data_array = _jsonReader[MESHDATA_MESHES]; + const rapidjson::Value& mesh_data_array = _jsonReader[MESHES]; for (rapidjson::SizeType index = 0; index < mesh_data_array.Size(); index++) { MeshData* meshData = new MeshData(); @@ -325,7 +330,7 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) } // mesh part //////////////////////////////////////////////////////////////////////////////////////////////// - const rapidjson::Value& mesh_part_array = mesh_data[MESHDATA_PARTS]; + const rapidjson::Value& mesh_part_array = mesh_data[PARTS]; for (rapidjson::SizeType i = 0; i < mesh_part_array.Size(); i++) { std::vector indexArray; @@ -341,10 +346,19 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) } meshdatas.meshDatas.push_back(meshData); } - return true; + return true; } bool Bundle3D::loadNodes(NodeDatas& nodedatas) { + if (_isBinary) + { + // TODO + return false; + } + else + { + return loadNodesJson(nodedatas); + } return true; } @@ -361,7 +375,7 @@ bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) } return true; } -bool Bundle3D::loadMaterialsBinary(MaterialDatas& materialdatas) +bool Bundle3D::loadMaterialsBinary(MaterialDatas& materialdatas) { return true; } @@ -385,7 +399,7 @@ bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) // NTextureData textureData; // const rapidjson::Value& texture_val = testure_array[j]; // std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); -// textureData.filename = _modelRelativePath + filename; +// textureData.filename = _modelPath + filename; // textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); // textureData.wrapT = parseGLType(texture_val["wrapModeV"].GetString()); // materialData.textures.push_back(textureData); @@ -438,7 +452,7 @@ bool Bundle3D::loadMeshDataJson(MeshData* meshdata) bool Bundle3D::loadMeshDataJson_0_1(MeshData* meshdata) { - const rapidjson::Value& mesh_data_array = _jsonReader[MESHDATA_MESH]; + const rapidjson::Value& mesh_data_array = _jsonReader[MESH]; const rapidjson::Value& mesh_data_val = mesh_data_array[(rapidjson::SizeType)0]; @@ -486,7 +500,7 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshData* meshdata) bool Bundle3D::loadMeshDataJson_0_2(MeshData* meshdata) { - const rapidjson::Value& mesh_array = _jsonReader[MESHDATA_MESH]; + const rapidjson::Value& mesh_array = _jsonReader[MESH]; const rapidjson::Value& mesh_array_0 = mesh_array[(rapidjson::SizeType)0]; @@ -547,14 +561,14 @@ bool Bundle3D::loadSkinDataJson(SkinData* skindata) assert(skin_data_array.IsArray()); const rapidjson::Value& skin_data_array_val_0 = skin_data_array[(rapidjson::SizeType)0]; - if (!skin_data_array_val_0.HasMember(SKINDATA_BONES)) + if (!skin_data_array_val_0.HasMember(BONES)) return false; - const rapidjson::Value& skin_data_bones = skin_data_array_val_0[SKINDATA_BONES]; + const rapidjson::Value& skin_data_bones = skin_data_array_val_0[BONES]; for (rapidjson::SizeType i = 0; i < skin_data_bones.Size(); i++) { const rapidjson::Value& skin_data_bone = skin_data_bones[i]; - std::string name = skin_data_bone[SKINDATA_NODE].GetString(); + std::string name = skin_data_bone[NODE].GetString(); skindata->addSkinBoneNames(name); Mat4 mat_bind_pos; @@ -607,7 +621,7 @@ bool Bundle3D::loadMaterialDataJson_0_1(MaterialData* materialdata) const rapidjson::Value& material_data_base_array_0 = material_data_base_array[(rapidjson::SizeType)0]; // set texture - materialdata->texturePaths[0] =_modelRelativePath + material_data_base_array_0[MATERIALDATA_FILENAME].GetString(); + materialdata->texturePaths[0] = _modelPath + material_data_base_array_0[MATERIALDATA_FILENAME].GetString(); return true; } @@ -625,7 +639,7 @@ bool Bundle3D::loadMaterialDataJson_0_2(MaterialData* materialdata) //std::string id = material_val[ID].GetString(); // set texture - materialdata->texturePaths[i] = _modelRelativePath + material_val[MATERIALDATA_TEXTURES].GetString(); + materialdata->texturePaths[i] = _modelPath + material_val[MATERIALDATA_TEXTURES].GetString(); } return true; @@ -642,7 +656,7 @@ bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata) animationdata->_totalTime = animation_data_array_val_0[ANIMATIONDATA_LENGTH].GetDouble(); - const rapidjson::Value& bones = animation_data_array_val_0[ANIMATIONDATA_BONES]; + const rapidjson::Value& bones = animation_data_array_val_0[BONES]; for (rapidjson::SizeType i = 0; i < bones.Size(); i++) { const rapidjson::Value& bone = bones[i]; @@ -1034,7 +1048,7 @@ bool Bundle3D::loadMaterialDataBinary(MaterialData* materialdata) return false; } - std::string path = _modelRelativePath + texturePath; + std::string path = _modelPath + texturePath; materialdata->texturePaths[i] = path; } @@ -1108,6 +1122,213 @@ bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata) return true; } +bool Bundle3D::loadNodesJson(NodeDatas& nodedatas) +{ + if (!_jsonReader.HasMember(NODES)) return false; + const rapidjson::Value& nodes = _jsonReader[NODES]; + if(!nodes.IsArray()) return false; + + loadBoneNamesJson(nodes); + + for (rapidjson::SizeType i = 0; i < nodes.Size(); i++) + { + const rapidjson::Value& jnode = nodes[i]; + std::string id = jnode[ID].GetString(); + NodeData* nodedata = parseNodesRecursivelyJson(jnode); + + bool isSkeleton; + isSkeleton = checkIsSkeletonJson(jnode); + + if (isSkeleton) + nodedatas.skeleton.push_back(nodedata); + else + nodedatas.nodes.push_back(nodedata); + } + + return true; +} + +void Bundle3D::loadBoneNamesJson(const rapidjson::Value& jnodes) +{ + for (rapidjson::SizeType i = 0; i < jnodes.Size(); i++) + { + parseBoneNameRecursivelyJson(jnodes[i]); + } +} + +void Bundle3D::parseBoneNameRecursivelyJson(const rapidjson::Value& jnode) +{ + std::string id = jnode[ID].GetString(); + if (jnode.HasMember(PARTS)) + { + const rapidjson::Value& parts = jnode[PARTS]; + + for (rapidjson::SizeType i = 0; i < parts.Size(); i++) + { + const rapidjson::Value& part = parts[i]; + + if (part.HasMember(BONES)) + { + const rapidjson::Value& bones = part[BONES]; + + for (rapidjson::SizeType j = 0; j < bones.Size(); j++) + { + const rapidjson::Value& bone = bones[j]; + std::string bonename = bone[NODE].GetString(); + + if (!checkIsBone(bonename)) + { + _bonenames.push_back(bonename); + } + } + } + } + } + + if (jnode.HasMember(CHILDREN)) + { + const rapidjson::Value& children = jnode[CHILDREN]; + + for (rapidjson::SizeType i = 0; i < children.Size(); i++) + { + parseBoneNameRecursivelyJson(children[i]); + } + } +} + +bool Bundle3D::checkIsBone(const std::string& name) +{ + std::list::iterator iter = std::find(_bonenames.begin(), _bonenames.end(), name); + bool ret = (iter != _bonenames.end()) ? true : false; + return ret; +} + +bool Bundle3D::checkIsSkeletonJson(const rapidjson::Value& jnode) +{ + bool ret = false; + if (jnode.HasMember(CHILDREN)) + { + const rapidjson::Value& children = jnode[CHILDREN]; + for (rapidjson::SizeType i = 0; i < children.Size(); i++) + { + ret = checkIsSkeletonRecursivelyJson(children[i]); + if (ret) break; + } + } + else + { + ret = checkIsSkeletonRecursivelyJson(jnode); + } + + return ret; +} + +bool Bundle3D::checkIsSkeletonRecursivelyJson(const rapidjson::Value& jnode) +{ + std::string id = jnode[ID].GetString(); + if (checkIsBone(id)) + return true; + + if (jnode.HasMember(CHILDREN)) + { + const rapidjson::Value& children = jnode[CHILDREN]; + + for (rapidjson::SizeType i = 0; i < children.Size(); i++) + { + checkIsSkeletonRecursivelyJson(children[i]); + } + } + + return false; +} + +NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) +{ + NodeData* nodedata; + if (jvalue.HasMember(PARTS)) + nodedata = new ModelNodeData(); + else + nodedata = new NodeData(); + + // id + nodedata->id = jvalue[ID].GetString(); + + // transform + Mat4 tranform; + const rapidjson::Value& jtransform = jvalue[TRANSFORM]; + + for (rapidjson::SizeType j = 0; j < jtransform.Size(); j++) + { + tranform.m[j] = jtransform[j].GetDouble(); + } + + nodedata->transform = tranform; + + // parts + if (jvalue.HasMember(PARTS)) + { + const rapidjson::Value& parts = jvalue[PARTS]; + ModelNodeData* modelnodedata = dynamic_cast(nodedata); + + for (rapidjson::SizeType i = 0; i < parts.Size(); i++) + { + const rapidjson::Value& part = parts[i]; + std::string meshPartId = part[MESHPARTID].GetString(); + std::string materialId = part[MATERIALID].GetString(); + + if (meshPartId == "" || materialId == "") + { + std::string err = "Node " + nodedata->id + " part is missing meshPartId or materialId"; + CCASSERT(false, err.c_str()); + return nullptr; + } + + if (part.HasMember(BONES)) + { + const rapidjson::Value& bones = part[BONES]; + + for (rapidjson::SizeType j = 0; j < bones.Size(); j++) + { + const rapidjson::Value& bone = bones[i]; + + // node + if (!bone.HasMember(NODE)) + { + CCASSERT(false, "Bone node ID missing"); + return nullptr; + } + + modelnodedata->bones.push_back(bone[NODE].GetString()); + + Mat4 invbindpos; + const rapidjson::Value& jtransform = jvalue[TRANSFORM]; + + for (rapidjson::SizeType j = 0; j < jtransform.Size(); j++) + { + invbindpos.m[j] = jtransform[j].GetDouble(); + } + + modelnodedata->invBindPose.push_back(invbindpos); + } + } + } + } + + if (jvalue.HasMember(CHILDREN)) + { + const rapidjson::Value& children = jvalue[CHILDREN]; + for (rapidjson::SizeType i = 0; i < children.Size(); i++) + { + const rapidjson::Value& child = children[i]; + + NodeData* tempdata = parseNodesRecursivelyJson(child); + nodedata->children.push_back(tempdata); + } + } + + return nodedata; +} + GLenum Bundle3D::parseGLType(const std::string& str) { if (str == "GL_BYTE") @@ -1182,17 +1403,7 @@ void Bundle3D::getModelRelativePath(const std::string& path) { ssize_t index = path.find_last_of('/'); std::string fullModelPath; - fullModelPath = path.substr(0, index + 1); - - auto list = FileUtils::getInstance()->getSearchPaths(); - for( const auto &item : list ) - { - if ( fullModelPath.find(item) != std::string::npos ) - { - _modelRelativePath = fullModelPath.substr(item.length(), fullModelPath.length() + 1); - break; - } - } + _modelPath = path.substr(0, index + 1); } Reference* Bundle3D::seekToFirstType(unsigned int type) @@ -1217,7 +1428,7 @@ Reference* Bundle3D::seekToFirstType(unsigned int type) Bundle3D::Bundle3D() :_isBinary(false), -_modelRelativePath(""), +_modelPath(""), _path(""), _version(""), _jsonBuffer(nullptr), diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index c89a37e925..3e0fc00913 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -26,6 +26,7 @@ #define __CCBUNDLE3D_H__ #include +#include #include "3d/CCBundle3DData.h" @@ -153,6 +154,23 @@ protected: */ bool loadAnimationDataBinary(Animation3DData* animationdata); + bool checkIsBone(const std::string& name); + + /** + * load nodes of json + */ + bool loadNodesJson(NodeDatas& nodedatas); + void loadBoneNamesJson(const rapidjson::Value& jnodes); + void parseBoneNameRecursivelyJson(const rapidjson::Value& jnode); + bool checkIsSkeletonJson(const rapidjson::Value& jnode); + bool checkIsSkeletonRecursivelyJson(const rapidjson::Value& jnode); + NodeData* parseNodesRecursivelyJson(const rapidjson::Value& jvalue); + + /** + * load nodes of Binary + */ + + /** * get define data type * @param str The type in string @@ -186,7 +204,7 @@ protected: static Bundle3D* _instance; - std::string _modelRelativePath; + std::string _modelPath; std::string _path; std::string _version;// the c3b or c3t version @@ -202,6 +220,8 @@ protected: Reference* _references; bool _isBinary; + + std::list _bonenames; }; NS_CC_END From ae79603791eb1eec2868d6ba2c0412a515feda35 Mon Sep 17 00:00:00 2001 From: liuliang Date: Sat, 16 Aug 2014 14:14:37 +0800 Subject: [PATCH 15/67] Modify the material parsing --- cocos/3d/CCBundle3D.cpp | 103 ++++++++++++++++++++++++++++++++++------ cocos/3d/CCBundle3D.h | 18 +++---- 2 files changed, 97 insertions(+), 24 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index e6275f2e5e..1fd270a675 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -281,7 +281,18 @@ bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) } else { - return loadMeshDatasJson(meshdatas); + if (_version == "1.2") + { + return loadMeshDataJson_0_1(meshdatas); + } + else if(_version == "0.2") + { + return loadMeshDataJson_0_2(meshdatas); + } + else if(_version == "0.3") + { + return loadMeshDatasJson(meshdatas); + } } return true; } @@ -345,9 +356,50 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) } bool Bundle3D::loadNodes(NodeDatas& nodedatas) { + if (_isBinary) + { + } + else + { + if (_version == "1.2" || _version == "0.2") + { + SkinData skinData; + loadSkinDataJson(&skinData); + auto nodeDatas = new NodeData*[skinData.skinBoneNames.size() + skinData.nodeBoneNames.size()]; + int index = 0; + size_t i; + for (i = 0; i < skinData.skinBoneNames.size(); i++) + { + nodeDatas[index] = new NodeData(); + nodeDatas[index]->id = skinData.skinBoneNames[i]; + nodeDatas[index]->transform = skinData.skinBoneOriginMatrices[i]; + index++; + } + for (i = 0; i < skinData.nodeBoneNames.size(); i++) + { + nodeDatas[index] = new NodeData(); + nodeDatas[index]->id = skinData.nodeBoneNames[i]; + nodeDatas[index]->transform = skinData.nodeBoneOriginMatrices[i]; + index++; + } + for (const auto& it : skinData.boneChild) + { + const auto& children = it.second; + auto parent = nodeDatas[it.first]; + for (const auto& child : children) + { + parent->children.push_back(nodeDatas[child]); + } + } + nodedatas.skeleton.push_back(nodeDatas[skinData.rootBoneIndex]); + } + else + { + + } + } return true; } - bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) { materialdatas.resetData(); @@ -357,7 +409,18 @@ bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) } else { - return loadMaterialsJson(materialdatas); + if (_version == "1.2") + { + return loadMaterialDataJson_0_1(materialdatas); + } + else if (_version == "0.2") + { + return loadMaterialDataJson_0_2(materialdatas); + } + else if (_version == "0.3") + { + return loadMaterialsJson(materialdatas); + } } return true; } @@ -436,8 +499,9 @@ bool Bundle3D::loadMeshDataJson(MeshData* meshdata) } } -bool Bundle3D::loadMeshDataJson_0_1(MeshData* meshdata) +bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) { + MeshData* meshdata= new MeshData(); const rapidjson::Value& mesh_data_array = _jsonReader[MESHDATA_MESH]; const rapidjson::Value& mesh_data_val = mesh_data_array[(rapidjson::SizeType)0]; @@ -480,12 +544,13 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshData* meshdata) indices[i] = (unsigned short)indices_val_array[i].GetUint(); meshdata->subMeshIndices.push_back(indices); - + meshdatas.meshDatas.push_back(meshdata); return true; } -bool Bundle3D::loadMeshDataJson_0_2(MeshData* meshdata) +bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) { + MeshData* meshdata= new MeshData(); const rapidjson::Value& mesh_array = _jsonReader[MESHDATA_MESH]; const rapidjson::Value& mesh_array_0 = mesh_array[(rapidjson::SizeType)0]; @@ -535,6 +600,7 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshData* meshdata) meshdata->subMeshIndices.push_back(indices); } + meshdatas.meshDatas.push_back(meshdata); return true; } @@ -593,11 +659,11 @@ bool Bundle3D::loadMaterialDataJson(MaterialData* materialdata) } } -bool Bundle3D::loadMaterialDataJson_0_1(MaterialData* materialdata) +bool Bundle3D::loadMaterialDataJson_0_1(MaterialDatas& materialdatas) { if (!_jsonReader.HasMember(MATERIALDATA_MATERIAL)) return false; - + NMaterialData materialData; const rapidjson::Value& material_data_array = _jsonReader[MATERIALDATA_MATERIAL]; const rapidjson::Value& material_data_array_0 = material_data_array[(rapidjson::SizeType)0]; @@ -605,29 +671,36 @@ bool Bundle3D::loadMaterialDataJson_0_1(MaterialData* materialdata) const rapidjson::Value& material_data_base_array = material_data_array_0[MATERIALDATA_BASE]; const rapidjson::Value& material_data_base_array_0 = material_data_base_array[(rapidjson::SizeType)0]; - + NTextureData textureData; // set texture - materialdata->texturePaths[0] =_modelRelativePath + material_data_base_array_0[MATERIALDATA_FILENAME].GetString(); - + textureData.filename =_modelRelativePath + material_data_base_array_0[MATERIALDATA_FILENAME].GetString(); + textureData.type= NTextureData::Usage::Diffuse; + textureData.id=""; + materialData.textures.push_back(textureData); + materialdatas.materials.push_back(materialData); return true; } -bool Bundle3D::loadMaterialDataJson_0_2(MaterialData* materialdata) +bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas) { if (!_jsonReader.HasMember(MATERIALDATA_MATERIAL)) return false; - + NMaterialData materialData; const rapidjson::Value& material_array = _jsonReader[MATERIALDATA_MATERIAL]; for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) { + NTextureData textureData; const rapidjson::Value& material_val = material_array[i]; //std::string id = material_val[ID].GetString(); // set texture - materialdata->texturePaths[i] = _modelRelativePath + material_val[MATERIALDATA_TEXTURES].GetString(); + textureData.filename = _modelRelativePath + material_val[MATERIALDATA_TEXTURES].GetString(); + textureData.type= NTextureData::Usage::Diffuse; + textureData.id=""; + materialData.textures.push_back(textureData); } - + materialdatas.materials.push_back(materialData); return true; } diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index b8848a607f..c8004910f7 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -97,30 +97,30 @@ public: //since 3.3, to support reskin virtual bool loadMeshDatas(MeshDatas& meshdatas); - bool loadMeshDatasJson(MeshDatas& meshdatas); - bool loadMeshDatasBinary(MeshDatas& meshdatas); //since 3.3, to support reskin virtual bool loadNodes(NodeDatas& nodedatas); //since 3.3, to support reskin virtual bool loadMaterials(MaterialDatas& materialdatas); - bool loadMaterialsJson(MaterialDatas& materialdatas); - bool loadMaterialsBinary(MaterialDatas& materialdatas); + protected: bool loadJson(const std::string& path); - + bool loadMeshDatasJson(MeshDatas& meshdatas); + bool loadMeshDataJson_0_1(MeshDatas& meshdatas); + bool loadMeshDataJson_0_2(MeshDatas& meshdatas); + bool loadMeshDatasBinary(MeshDatas& meshdatas); + bool loadMaterialsJson(MaterialDatas& materialdatas); + bool loadMaterialDataJson_0_1(MaterialDatas& materialdatas); + bool loadMaterialDataJson_0_2(MaterialDatas& materialdatas); + bool loadMaterialsBinary(MaterialDatas& materialdatas); bool loadMeshDataJson(MeshData* meshdata); bool loadMeshDataJson_0_1(MeshData* meshdata); bool loadMeshDataJson_0_2(MeshData* meshdata); - bool loadSkinDataJson(SkinData* skindata); - bool loadMaterialDataJson(MaterialData* materialdata); bool loadMaterialDataJson_0_1(MaterialData* materialdata); bool loadMaterialDataJson_0_2(MaterialData* materialdata); - bool loadAnimationDataJson(Animation3DData* animationdata); - /** * load data in binary * @param path The c3b file path From ef2db598250f602b9cc8c9ce171fb4306919e0e5 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Sat, 16 Aug 2014 14:16:17 +0800 Subject: [PATCH 16/67] modify render --- cocos/3d/CCSprite3D.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 4d6b66e113..19f7f22179 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -160,6 +160,7 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) auto bundle = Bundle3D::getInstance(); if (!bundle->load(fullPath)) return false; + MeshDatas meshdatas; bool ret = bundle->loadMeshDatas(meshdatas); if (!ret) @@ -238,8 +239,7 @@ bool Sprite3D::loadFromC3x(const std::string& path) } genMaterials(key, texpaths); } - NodeDatas nodeDatas; - bundle->loadNodes(nodeDatas); + genGLProgramState(); return true; @@ -356,17 +356,16 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m if(tex) { Texture2D::TexParams texParams; - texParams.minFilter=GL_LINEAR; - texParams.magFilter=GL_LINEAR; - texParams.wrapS=textureData->wrapS; - texParams.wrapT=textureData->wrapT; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); subMeshState->setTexture(tex); } } } - //set wrap s, t } } else @@ -470,30 +469,31 @@ void Sprite3D::removeAllAttachNode() void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { -// if (_skeleton) -// _skeleton->updateBoneMatrix(); + if (_skeleton) + _skeleton->updateBoneMatrix(); GLProgramState* programstate = getGLProgramState(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; - for (ssize_t i = 0; i < _mesh->getSubMeshCount(); i++) { - auto submeshstate = _subMeshStates.at(i); + int i = 0; + for (auto& submeshstate : _subMeshStates) { if (!submeshstate->isVisible()) continue; - auto submesh = _mesh->getSubMesh((int)i); - auto& meshCommand = _meshCommands[i]; + auto& meshCommand = _meshCommands[i++]; GLuint textureID = submeshstate->getTexture() ? submeshstate->getTexture()->getName() : 0; - meshCommand.init(_globalZOrder, textureID, programstate, _blend, _mesh->getVertexBuffer(), submesh->getIndexBuffer(), (GLenum)submesh->getPrimitiveType(), (GLenum)submesh->getIndexFormat(), submesh->getIndexCount(), transform); + auto submesh = submeshstate->getSubMesh(); + meshCommand.init(_globalZOrder, textureID, programstate, _blend, submesh->getMesh()->getVertexBuffer(), submesh->getIndexBuffer(), (GLenum)submesh->getPrimitiveType(), (GLenum)submesh->getIndexFormat(), submesh->getIndexCount(), transform); meshCommand.setCullFaceEnabled(true); meshCommand.setDepthTestEnabled(true); - if (_skin) + auto skin = submeshstate->getSkin(); + if (skin) { - meshCommand.setMatrixPaletteSize((int)_skin->getMatrixPaletteSize()); - meshCommand.setMatrixPalette(_skin->getMatrixPalette()); + meshCommand.setMatrixPaletteSize((int)skin->getMatrixPaletteSize()); + meshCommand.setMatrixPalette(skin->getMatrixPalette()); } //support tint and fade meshCommand.setDisplayColor(Vec4(color.r, color.g, color.b, color.a)); From d60a7734b164dffdf5b10bd2cd37cc584681e9ae Mon Sep 17 00:00:00 2001 From: lvlong Date: Sat, 16 Aug 2014 14:28:15 +0800 Subject: [PATCH 17/67] merge bundle. --- cocos/3d/CCBundle3D.cpp | 168 ++++++++++++++++++++++++++++++---------- cocos/3d/CCBundle3D.h | 10 ++- 2 files changed, 131 insertions(+), 47 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 0fc72fd6df..05b241c9ce 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -1130,16 +1130,18 @@ bool Bundle3D::loadNodesJson(NodeDatas& nodedatas) loadBoneNamesJson(nodes); + // traverse the nodes again for (rapidjson::SizeType i = 0; i < nodes.Size(); i++) { + _skeleton = false; const rapidjson::Value& jnode = nodes[i]; std::string id = jnode[ID].GetString(); NodeData* nodedata = parseNodesRecursivelyJson(jnode); - bool isSkeleton; - isSkeleton = checkIsSkeletonJson(jnode); + //bool isSkeleton; + //isSkeleton = checkIsSkeletonJson(jnode); - if (isSkeleton) + if (_skeleton) nodedatas.skeleton.push_back(nodedata); else nodedatas.nodes.push_back(nodedata); @@ -1203,45 +1205,6 @@ bool Bundle3D::checkIsBone(const std::string& name) return ret; } -bool Bundle3D::checkIsSkeletonJson(const rapidjson::Value& jnode) -{ - bool ret = false; - if (jnode.HasMember(CHILDREN)) - { - const rapidjson::Value& children = jnode[CHILDREN]; - for (rapidjson::SizeType i = 0; i < children.Size(); i++) - { - ret = checkIsSkeletonRecursivelyJson(children[i]); - if (ret) break; - } - } - else - { - ret = checkIsSkeletonRecursivelyJson(jnode); - } - - return ret; -} - -bool Bundle3D::checkIsSkeletonRecursivelyJson(const rapidjson::Value& jnode) -{ - std::string id = jnode[ID].GetString(); - if (checkIsBone(id)) - return true; - - if (jnode.HasMember(CHILDREN)) - { - const rapidjson::Value& children = jnode[CHILDREN]; - - for (rapidjson::SizeType i = 0; i < children.Size(); i++) - { - checkIsSkeletonRecursivelyJson(children[i]); - } - } - - return false; -} - NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) { NodeData* nodedata; @@ -1253,6 +1216,10 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) // id nodedata->id = jvalue[ID].GetString(); + // check is skeleton + if (checkIsBone(nodedata->id)) + _skeleton = true; + // transform Mat4 tranform; const rapidjson::Value& jtransform = jvalue[TRANSFORM]; @@ -1329,6 +1296,120 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) return nodedata; } +bool Bundle3D::loadNodesBinary(NodeDatas& nodedatas) +{ + if (!seekToFirstType(BUNDLE_TYPE_NODE)) + return false; + + loadBoneNamesBinary(); + + if (!seekToFirstType(BUNDLE_TYPE_NODE)) + return false; + + unsigned int nodeSize = 0; + if (_binaryReader.read(&nodeSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read nodes: size '%s'.", _path.c_str()); + return false; + } + + // traverse the nodes again + for (rapidjson::SizeType i = 0; i < nodeSize; i++) + { + std::string id = _binaryReader.readString(); + NodeData* nodedata = parseNodesRecursivelyBinary(); + + if (_skeleton) + nodedatas.skeleton.push_back(nodedata); + else + nodedatas.nodes.push_back(nodedata); + } + return true; +} + +void Bundle3D::loadBoneNamesBinary() +{ + unsigned int nodeSize=0; + if (_binaryReader.read(&nodeSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read nodes: size '%s'.", _path.c_str()); + return; + } + + for (unsigned int i = 0; i < nodeSize; i++) + { + parseBoneNameRecursivelyBinary(); + } +} + +void Bundle3D::parseBoneNameRecursivelyBinary() +{ + std::string id = _binaryReader.readString(); + + Mat4 nodeMat; + if (!_binaryReader.readMatrix(nodeMat.m)) + return; + + // read pass + unsigned int partsSize=0; + if (_binaryReader.read(&partsSize, 4, 1) != 1) + { + CCASSERT("Failed to read part size: '%s'.", _path.c_str()); + return; + } + + if (partsSize > 0) + { + for (unsigned i = 0; i < partsSize; i++) + { + unsigned int boneSize=0; + if (_binaryReader.read(&boneSize, 4, 1) != 1) + { + CCASSERT("Failed to read bone: size '%s'.", _path.c_str()); + return; + } + + if (boneSize > 0) + { + for (unsigned j = 0; j < boneSize; j++) + { + std::string bonename = _binaryReader.readString(); + + Mat4 boneMat; + if (!_binaryReader.readMatrix(boneMat.m)) + return; + + if (!checkIsBone(bonename)) + { + _bonenames.push_back(bonename); + } + } + } + } + } + + // read children + unsigned int childrenSize = 0; + if (_binaryReader.read(&childrenSize, 4, 1) != 1) + { + CCASSERT("Failed to read children size: '%s'.", _path.c_str()); + return; + } + + if (childrenSize > 0) + { + for (rapidjson::SizeType i = 0; i < childrenSize; i++) + { + parseBoneNameRecursivelyBinary(); + } + } +} + +NodeData* Bundle3D::parseNodesRecursivelyBinary() +{ + return nullptr; +} + GLenum Bundle3D::parseGLType(const std::string& str) { if (str == "GL_BYTE") @@ -1434,7 +1515,8 @@ _version(""), _jsonBuffer(nullptr), _binaryBuffer(nullptr), _referenceCount(0), -_references(nullptr) +_references(nullptr), +_skeleton(false) { } diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index 3e0fc00913..58906a6a94 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -162,14 +162,15 @@ protected: bool loadNodesJson(NodeDatas& nodedatas); void loadBoneNamesJson(const rapidjson::Value& jnodes); void parseBoneNameRecursivelyJson(const rapidjson::Value& jnode); - bool checkIsSkeletonJson(const rapidjson::Value& jnode); - bool checkIsSkeletonRecursivelyJson(const rapidjson::Value& jnode); NodeData* parseNodesRecursivelyJson(const rapidjson::Value& jvalue); /** - * load nodes of Binary + * load nodes of binary */ - + bool loadNodesBinary(NodeDatas& nodedatas); + void loadBoneNamesBinary(); + void parseBoneNameRecursivelyBinary(); + NodeData* parseNodesRecursivelyBinary(); /** * get define data type @@ -222,6 +223,7 @@ protected: bool _isBinary; std::list _bonenames; + bool _skeleton; }; NS_CC_END From 47d15a4aa1ad0afbbda2c46a6b63f980374a7f96 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Sat, 16 Aug 2014 14:49:38 +0800 Subject: [PATCH 18/67] load --- cocos/3d/CCBundle3DData.h | 2 +- cocos/3d/CCSprite3D.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index 1b06a69e4d..2d2edc511a 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -306,7 +306,7 @@ struct NMaterialData { std::vector textures; std::string id; - const NTextureData* getTextureData(NTextureData::Usage& type) const + const NTextureData* getTextureData(const NTextureData::Usage& type) const { for(const auto& it : textures) { diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 19f7f22179..92c43d3179 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -179,7 +179,7 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) MaterialDatas materialdatas; ret = bundle->loadMaterials(materialdatas); - if (ret) + if (!ret) { return false; } @@ -345,6 +345,12 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); subMeshState->setSkin(skin); + + if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) + { + NTextureData::Usage type = NTextureData::Usage::Diffuse; + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(type); + } const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); if(materialData) { From a11ac316bf65ca12d7bc7fe0e1863616cb3d189a Mon Sep 17 00:00:00 2001 From: yangxiao Date: Sat, 16 Aug 2014 14:52:44 +0800 Subject: [PATCH 19/67] create model --- cocos/3d/CCBundle3D.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index fdee696ddc..25d629b51a 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -399,6 +399,13 @@ bool Bundle3D::loadNodes(NodeDatas& nodedatas) } } nodedatas.skeleton.push_back(nodeDatas[skinData.rootBoneIndex]); + auto modelnode = new ModelNodeData(); + modelnode->matrialId = ""; + modelnode->subMeshId = ""; + modelnode->id = ""; + modelnode->bones = skinData.skinBoneNames; + modelnode->invBindPose = skinData.inverseBindPoseMatrices; + nodedatas.nodes.push_back(modelnode); } else { From 5b59b8a987a15aa7125c292dd61687728e7730ec Mon Sep 17 00:00:00 2001 From: lvlong Date: Sat, 16 Aug 2014 15:40:00 +0800 Subject: [PATCH 20/67] fixed some loading problems. --- cocos/3d/CCBundle3D.cpp | 8 ++++++++ cocos/3d/CCSprite3D.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index fdee696ddc..f9d8bef014 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -1467,6 +1467,14 @@ GLenum Bundle3D::parseGLType(const std::string& str) { return GL_FLOAT; } + else if (str == "REPEAT") + { + return GL_REPEAT; + } + else if (str == "CLAMP") + { + return GL_CLAMP_TO_EDGE; + } else { CCASSERT(false, "Wrong GL type"); diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 19f7f22179..5e24a3cb59 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -179,7 +179,7 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) MaterialDatas materialdatas; ret = bundle->loadMaterials(materialdatas); - if (ret) + if (!ret) { return false; } From 715991424890d1cca8e35ac257f57073ad2d064d Mon Sep 17 00:00:00 2001 From: yangxiao Date: Sat, 16 Aug 2014 16:56:04 +0800 Subject: [PATCH 21/67] old model work --- cocos/3d/CCAnimate3D.cpp | 4 +- cocos/3d/CCBundle3D.cpp | 5 +- cocos/3d/CCMesh.cpp | 4 +- cocos/3d/CCMeshSkin.cpp | 4 +- cocos/3d/CCSkeleton3D.cpp | 22 ++++-- cocos/3d/CCSkeleton3D.h | 4 +- cocos/3d/CCSprite3D.cpp | 72 +++++++++++-------- cocos/3d/CCSprite3D.h | 2 + .../Classes/Sprite3DTest/Sprite3DTest.cpp | 57 +++++++-------- 9 files changed, 105 insertions(+), 69 deletions(-) diff --git a/cocos/3d/CCAnimate3D.cpp b/cocos/3d/CCAnimate3D.cpp index 0034621814..c359194843 100644 --- a/cocos/3d/CCAnimate3D.cpp +++ b/cocos/3d/CCAnimate3D.cpp @@ -90,12 +90,12 @@ Animate3D* Animate3D::reverse() const void Animate3D::startWithTarget(Node *target) { Sprite3D* sprite = dynamic_cast(target); - CCASSERT(sprite && sprite->getSkin() && _animation, "Animate3D apply to Sprite3D only"); + CCASSERT(sprite && sprite->getSkeleton() && _animation, "Animate3D apply to Sprite3D only"); ActionInterval::startWithTarget(target); _boneCurves.clear(); - auto skin = sprite->getSkin(); + auto skin = sprite->getSkeleton(); for (unsigned int i = 0; i < skin->getBoneCount(); i++) { auto bone = skin->getBoneByIndex(i); auto curve = _animation->getBoneCurveByName(bone->getName()); diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 25d629b51a..3e36529664 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -75,6 +75,7 @@ static const char* BONES = "bones"; static const char* MATERIALS = "materials"; static const char* ANIMATIONS = "animations"; static const char* TRANSFORM = "transform"; +static const char* OLDTRANSFORM = "tansform"; static const char* MATERIALDATA_MATERIAL = "material"; static const char* MATERIALDATA_MATERIALS = "materials"; @@ -100,7 +101,7 @@ void getChildMap(std::map >& map, SkinData* skinData, cons // get transform matrix Mat4 transform; - const rapidjson::Value& parent_tranform = val[TRANSFORM]; + const rapidjson::Value& parent_tranform = val[OLDTRANSFORM]; for (rapidjson::SizeType j = 0; j < parent_tranform.Size(); j++) { transform.m[j] = parent_tranform[j].GetDouble(); @@ -371,7 +372,7 @@ bool Bundle3D::loadNodes(NodeDatas& nodedatas) if (_version == "1.2" || _version == "0.2") { SkinData skinData; - loadSkinDataJson(&skinData); + loadSkinData("", &skinData); auto nodeDatas = new NodeData*[skinData.skinBoneNames.size() + skinData.nodeBoneNames.size()]; int index = 0; size_t i; diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 1673838692..5ea76b228a 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -206,7 +206,9 @@ Mesh* Mesh::create(const MeshData& meshdata) { for (int i = 0; i < (int)mesh->getSubMeshCount(); i++) { auto submesh = mesh->getSubMesh(i); - submesh->_id = meshdata.subMeshIds[i]; + if (meshdata.subMeshIds.size()) + submesh->_id = meshdata.subMeshIds[i]; + submesh->_mesh = mesh; } } mesh->autorelease(); diff --git a/cocos/3d/CCMeshSkin.cpp b/cocos/3d/CCMeshSkin.cpp index 5a889039b1..92bca622cd 100644 --- a/cocos/3d/CCMeshSkin.cpp +++ b/cocos/3d/CCMeshSkin.cpp @@ -220,8 +220,8 @@ ssize_t MeshSkin::getMatrixPaletteSize() const //refresh bone world matrix void MeshSkin::updateBoneMatrix() { - _rootBone->setWorldMatDirty(true); - _rootBone->updateWorldMat(); +// _rootBone->setWorldMatDirty(true); +// _rootBone->updateWorldMat(); } void MeshSkin::removeAllBones() diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index 7009fca0e1..d083a8a88b 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -298,14 +298,22 @@ Skeleton3D* Skeleton3D::create(const std::vector& skeletondata) { auto skeleton = new Skeleton3D(); for (const auto& it : skeletondata) { - auto bone = createBone3D(*it); + auto bone = skeleton->createBone3D(*it); skeleton->_rootBones.pushBack(bone); - bone->release(); + skeleton->printBone(bone); } skeleton->autorelease(); return skeleton; } +void Skeleton3D::printBone(Bone3D* bone) +{ + CCLOG("%s", bone->getName().c_str()); + for (auto it : bone->_children) { + printBone(it); + } +} + bool Skeleton3D::initFromSkeletonData(const Skeleton3DData& skeletondata) { ssize_t i = 0; @@ -390,8 +398,12 @@ int Skeleton3D::getBoneIndex(Bone3D* bone) const //refresh bone world matrix void Skeleton3D::updateBoneMatrix() { - _rootBone->setWorldMatDirty(true); - _rootBone->updateWorldMat(); + //_rootBone->setWorldMatDirty(true); + //_rootBone->updateWorldMat(); + for (const auto& it : _rootBones) { + it->setWorldMatDirty(true); + it->updateWorldMat(); + } } void Skeleton3D::removeAllBones() @@ -412,8 +424,10 @@ Bone3D* Skeleton3D::createBone3D(const NodeData& nodedata) for (const auto& it : nodedata.children) { auto child = createBone3D(*it); bone->addChildBone(child); + child->_parent = bone; child->release(); } + _bones.pushBack(bone); return bone; } diff --git a/cocos/3d/CCSkeleton3D.h b/cocos/3d/CCSkeleton3D.h index 9788f73ec8..81dd3bc709 100644 --- a/cocos/3d/CCSkeleton3D.h +++ b/cocos/3d/CCSkeleton3D.h @@ -227,7 +227,9 @@ CC_CONSTRUCTOR_ACCESS: void addBone(Bone3D* bone); /** create Bone3D from NodeData */ - static Bone3D* createBone3D(const NodeData& nodedata); + Bone3D* createBone3D(const NodeData& nodedata); + + void printBone(Bone3D* bone); protected: diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 92c43d3179..5cfd809450 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -291,34 +291,46 @@ bool Sprite3D::initWithFile(const std::string &path) void Sprite3D::genGLProgramState() { - auto programstate = GLProgramState::getOrCreateWithGLProgram(getDefaultGLProgram(_mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD))); + if (_meshes.size() == 0) + return; + + //all the mesh should have the same attributes, FIX ME + auto mesh = _meshes.at(0); + + auto programstate = GLProgramState::getOrCreateWithGLProgram(getDefaultGLProgram(mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD))); long offset = 0; - auto attributeCount = _mesh->getMeshVertexAttribCount(); + auto attributeCount = mesh->getMeshVertexAttribCount(); for (auto k = 0; k < attributeCount; k++) { - auto meshattribute = _mesh->getMeshVertexAttribute(k); + auto meshattribute = mesh->getMeshVertexAttribute(k); programstate->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, - _mesh->getVertexSizeInBytes(), + mesh->getVertexSizeInBytes(), (GLvoid*)offset); offset += meshattribute.attribSizeBytes; } setGLProgramState(programstate); - auto count = _mesh->getSubMeshCount(); + auto count = mesh->getSubMeshCount(); _meshCommands.resize(count); for (int i = 0; i < count; i++) { auto tex = _subMeshStates.at(i)->getTexture(); GLuint texID = tex ? tex->getName() : 0; - _meshCommands[i].genMaterialID(texID, programstate, _mesh, _blend); + _meshCommands[i].genMaterialID(texID, programstate, _meshes.at(i), _blend); } } GLProgram* Sprite3D::getDefaultGLProgram(bool textured) { - bool hasSkin = _skin && _mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) - && _mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT); + if (_meshes.size() == 0) + return nullptr; + + //all the mesh should have the same attributes, FIX ME + auto mesh = _meshes.at(0); + + bool hasSkin = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) + && mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT); if(textured) { @@ -348,29 +360,31 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) { - NTextureData::Usage type = NTextureData::Usage::Diffuse; - const NTextureData* textureData = matrialdatas.materials[0].getTextureData(type); + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); + subMeshState->setTexture(textureData->filename); } - const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); - if(materialData) + else { - NTextureData::Usage type = NTextureData::Usage::Diffuse; - const NTextureData* textureData = materialData->getTextureData(type); - if(textureData) - { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); - if(tex) - { - Texture2D::TexParams texParams; - texParams.minFilter = GL_LINEAR; - texParams.magFilter = GL_LINEAR; - texParams.wrapS = textureData->wrapS; - texParams.wrapT = textureData->wrapT; - tex->setTexParameters(texParams); - subMeshState->setTexture(tex); - } - - } + const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); + if(materialData) + { + const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); + if(textureData) + { + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + + } + } } } } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 6d4008b59e..b1f5643ac5 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -70,6 +70,8 @@ public: /**get skin*/ MeshSkin* getSkin() const { return _skin; } + Skeleton3D* getSkeleton() const { return _skeleton; } + /**get AttachNode by bone name, return nullptr if not exist*/ AttachNode* getAttachNode(const std::string& boneName); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 2410ffb068..584b7f1573 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -46,6 +46,7 @@ static int sceneIdx = -1; static std::function createFunctions[] = { + CL(Sprite3DMirrorTest), CL(Sprite3DBasicTest), CL(Sprite3DHitTest), #if (CC_TARGET_PLATFORM != CC_PLATFORM_WP8) && (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) @@ -1271,17 +1272,17 @@ std::string Sprite3DMirrorTest::subtitle() const void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) { - std::string fileName = "Sprite3DTest/orc.c3b"; + std::string fileName = "Sprite3DTest/orc.c3t"; auto sprite = Sprite3D::create(fileName); - sprite->setScale(5); - sprite->setRotation3D(Vec3(0,180,0)); + sprite->setScale(6); + sprite->setRotation3D(Vec3(90,0,0)); addChild(sprite); sprite->setPosition( Vec2( p.x - 80, p.y) ); - //test attach - auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); - sprite->getAttachNode("Bip001 R Hand")->addChild(sp); - +// //test attach +// auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); +// sprite->getAttachNode("Bip001 R Hand")->addChild(sp); +// auto animation = Animation3D::create(fileName); if (animation) { @@ -1292,25 +1293,25 @@ void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) _sprite = sprite; _hasWeapon = true; - //create mirror Sprite3D - sprite = Sprite3D::create(fileName); - sprite->setScale(5); - sprite->setScaleX(-5); - sprite->setCullFace(GL_FRONT); - sprite->setRotation3D(Vec3(0,180,0)); - addChild(sprite); - sprite->setPosition( Vec2( p.x + 80, p.y) ); - - //test attach - sp = Sprite3D::create("Sprite3DTest/axe.c3b"); - sprite->getAttachNode("Bip001 R Hand")->addChild(sp); - - animation = Animation3D::create(fileName); - if (animation) - { - auto animate = Animate3D::create(animation); - - sprite->runAction(RepeatForever::create(animate)); - } - _mirrorSprite = sprite; +// //create mirror Sprite3D +// sprite = Sprite3D::create(fileName); +// sprite->setScale(5); +// sprite->setScaleX(-5); +// sprite->setCullFace(GL_FRONT); +// sprite->setRotation3D(Vec3(0,180,0)); +// addChild(sprite); +// sprite->setPosition( Vec2( p.x + 80, p.y) ); +// +// //test attach +// sp = Sprite3D::create("Sprite3DTest/axe.c3b"); +// sprite->getAttachNode("Bip001 R Hand")->addChild(sp); +// +// animation = Animation3D::create(fileName); +// if (animation) +// { +// auto animate = Animate3D::create(animation); +// +// sprite->runAction(RepeatForever::create(animate)); +// } +// _mirrorSprite = sprite; } From fb1b7ca3bbc310a6688094d58cfd9c9a3c0eb9f3 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Sat, 16 Aug 2014 18:18:15 +0800 Subject: [PATCH 22/67] fix skeleton --- cocos/3d/CCSkeleton3D.cpp | 11 +---------- cocos/3d/CCSkeleton3D.h | 2 -- cocos/3d/CCSprite3D.cpp | 1 + 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index d083a8a88b..23939345d2 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -300,20 +300,11 @@ Skeleton3D* Skeleton3D::create(const std::vector& skeletondata) for (const auto& it : skeletondata) { auto bone = skeleton->createBone3D(*it); skeleton->_rootBones.pushBack(bone); - skeleton->printBone(bone); } skeleton->autorelease(); return skeleton; } -void Skeleton3D::printBone(Bone3D* bone) -{ - CCLOG("%s", bone->getName().c_str()); - for (auto it : bone->_children) { - printBone(it); - } -} - bool Skeleton3D::initFromSkeletonData(const Skeleton3DData& skeletondata) { ssize_t i = 0; @@ -425,9 +416,9 @@ Bone3D* Skeleton3D::createBone3D(const NodeData& nodedata) auto child = createBone3D(*it); bone->addChildBone(child); child->_parent = bone; - child->release(); } _bones.pushBack(bone); + bone->_oriPose = nodedata.transform; return bone; } diff --git a/cocos/3d/CCSkeleton3D.h b/cocos/3d/CCSkeleton3D.h index 81dd3bc709..937f5f3de4 100644 --- a/cocos/3d/CCSkeleton3D.h +++ b/cocos/3d/CCSkeleton3D.h @@ -229,8 +229,6 @@ CC_CONSTRUCTOR_ACCESS: /** create Bone3D from NodeData */ Bone3D* createBone3D(const NodeData& nodedata); - void printBone(Bone3D* bone); - protected: Vector _bones; // bones diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 5cfd809450..a179767906 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -138,6 +138,7 @@ bool Sprite3D::loadFromObj(const std::string& path) texname = dir + (*it).material.diffuse_texname; matnames.push_back(texname); } + _mesh = Mesh::create(shapes.positions, shapes.normals, shapes.texcoords, submeshIndices); _mesh->retain(); if (_mesh == nullptr) From 4f4b8dc25c40764e149e745fb02fcc2af912d18f Mon Sep 17 00:00:00 2001 From: lvlong Date: Sat, 16 Aug 2014 18:19:41 +0800 Subject: [PATCH 23/67] for testing --- cocos/3d/CCBundle3D.cpp | 14 ++++++++------ cocos/3d/CCSprite3D.cpp | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 6f53bb9f9c..2d2a8d101c 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -76,6 +76,7 @@ static const char* MATERIALS = "materials"; static const char* ANIMATIONS = "animations"; static const char* TRANSFORM = "transform"; static const char* OLDTRANSFORM = "tansform"; +static const char* ANIMATION = "animations"; static const char* MATERIALDATA_MATERIAL = "material"; static const char* MATERIALDATA_MATERIALS = "materials"; @@ -682,9 +683,9 @@ bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas) bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata) { - if (!_jsonReader.HasMember(ANIMATIONDATA_ANIMATION)) return false; + if (!_jsonReader.HasMember(ANIMATION)) return false; - const rapidjson::Value& animation_data_array = _jsonReader[ANIMATIONDATA_ANIMATION]; + const rapidjson::Value& animation_data_array = _jsonReader[ANIMATION]; if (animation_data_array.Size()==0) return false; const rapidjson::Value& animation_data_array_val_0 = animation_data_array[(rapidjson::SizeType)0]; @@ -1275,10 +1276,10 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) for (rapidjson::SizeType i = 0; i < parts.Size(); i++) { const rapidjson::Value& part = parts[i]; - std::string meshPartId = part[MESHPARTID].GetString(); - std::string materialId = part[MATERIALID].GetString(); + modelnodedata->subMeshId = part[MESHPARTID].GetString(); + modelnodedata->matrialId = part[MATERIALID].GetString(); - if (meshPartId == "" || materialId == "") + if (modelnodedata->subMeshId == "" || modelnodedata->matrialId == "") { std::string err = "Node " + nodedata->id + " part is missing meshPartId or materialId"; CCASSERT(false, err.c_str()); @@ -1303,13 +1304,14 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) modelnodedata->bones.push_back(bone[NODE].GetString()); Mat4 invbindpos; - const rapidjson::Value& jtransform = jvalue[TRANSFORM]; + const rapidjson::Value& jtransform = bone[TRANSFORM]; for (rapidjson::SizeType j = 0; j < jtransform.Size(); j++) { invbindpos.m[j] = jtransform[j].GetDouble(); } + //invbindpos.inverse(); modelnodedata->invBindPose.push_back(invbindpos); } } diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 5cfd809450..33179a9450 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -317,7 +317,7 @@ void Sprite3D::genGLProgramState() for (int i = 0; i < count; i++) { auto tex = _subMeshStates.at(i)->getTexture(); GLuint texID = tex ? tex->getName() : 0; - _meshCommands[i].genMaterialID(texID, programstate, _meshes.at(i), _blend); + _meshCommands[i].genMaterialID(texID, programstate, mesh->getSubMesh(i)/*_meshes.at(i)*/, _blend); } } From b1c9fb99e363fcba0e96b82dd43b76538efea065 Mon Sep 17 00:00:00 2001 From: lvlong Date: Sat, 16 Aug 2014 19:51:59 +0800 Subject: [PATCH 24/67] animation is ok. --- cocos/3d/CCBundle3D.cpp | 6 +++--- cocos/3d/CCSkeleton3D.cpp | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 2d2a8d101c..1899935436 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -1292,7 +1292,7 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) for (rapidjson::SizeType j = 0; j < bones.Size(); j++) { - const rapidjson::Value& bone = bones[i]; + const rapidjson::Value& bone = bones[j]; // node if (!bone.HasMember(NODE)) @@ -1306,9 +1306,9 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) Mat4 invbindpos; const rapidjson::Value& jtransform = bone[TRANSFORM]; - for (rapidjson::SizeType j = 0; j < jtransform.Size(); j++) + for (rapidjson::SizeType k = 0; k < jtransform.Size(); k++) { - invbindpos.m[j] = jtransform[j].GetDouble(); + invbindpos.m[k] = jtransform[k].GetDouble(); } //invbindpos.inverse(); diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index 23939345d2..6b5b20a77d 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -299,6 +299,7 @@ Skeleton3D* Skeleton3D::create(const std::vector& skeletondata) auto skeleton = new Skeleton3D(); for (const auto& it : skeletondata) { auto bone = skeleton->createBone3D(*it); + bone->resetPose(); skeleton->_rootBones.pushBack(bone); } skeleton->autorelease(); From da63032a46996e6740638fc9b639fad3a54f6d13 Mon Sep 17 00:00:00 2001 From: lvlong Date: Sat, 16 Aug 2014 20:38:00 +0800 Subject: [PATCH 25/67] draw sub mesh bug --- cocos/3d/CCSprite3D.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 30e62f7a4f..3220a3d10c 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -313,12 +313,12 @@ void Sprite3D::genGLProgramState() } setGLProgramState(programstate); - auto count = mesh->getSubMeshCount(); + auto count = _subMeshStates.size(); _meshCommands.resize(count); for (int i = 0; i < count; i++) { auto tex = _subMeshStates.at(i)->getTexture(); GLuint texID = tex ? tex->getName() : 0; - _meshCommands[i].genMaterialID(texID, programstate, mesh->getSubMesh(i)/*_meshes.at(i)*/, _blend); + _meshCommands[i].genMaterialID(texID, programstate, _subMeshStates.at(i)->getSubMesh()->getMesh(), _blend); } } From 1e961e00b7d48c8b969485ae42dc8fc991da25d1 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Sun, 17 Aug 2014 22:49:53 +0800 Subject: [PATCH 26/67] obj loader work --- cocos/3d/CCBundle3D.cpp | 95 +++++++++++++++++++++++++++++++++++++++ cocos/3d/CCBundle3D.h | 3 ++ cocos/3d/CCBundle3DData.h | 14 ++++++ cocos/3d/CCSprite3D.cpp | 70 ++++++++++++++--------------- 4 files changed, 145 insertions(+), 37 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 1899935436..7b089daf6f 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -23,6 +23,7 @@ ****************************************************************************/ #include "3d/CCBundle3D.h" +#include "3d/CCObjLoader.h" #include "base/ccMacros.h" #include "platform/CCFileUtils.h" @@ -213,6 +214,100 @@ bool Bundle3D::load(const std::string& path) return ret; } + +bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeDatas& nodedatas, const std::string& fullPath, const char* mtl_basepath) +{ + meshdatas.resetData(); + materialdatas.resetData(); + nodedatas.resetData(); + + ObjLoader::shapes_t shapes; + auto ret = ObjLoader::LoadObj(shapes, fullPath.c_str(), mtl_basepath); + if (ret.empty()) + { + //fill data + MeshData* meshdata = new MeshData(); + MeshVertexAttrib attrib; + attrib.size = 3; + attrib.type = GL_FLOAT; + if (shapes.positions.size()) + { + attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; + attrib.attribSizeBytes = attrib.size * sizeof(float); + meshdata->attribs.push_back(attrib); + + } + bool hasnormal = false, hastex = false; + if (shapes.normals.size()) + { + hasnormal = true; + attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; + attrib.attribSizeBytes = attrib.size * sizeof(float);; + meshdata->attribs.push_back(attrib); + } + if (shapes.texcoords.size()) + { + hastex = true; + attrib.size = 2; + attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; + attrib.attribSizeBytes = attrib.size * sizeof(float); + meshdata->attribs.push_back(attrib); + } + auto vertexNum = shapes.positions.size() / 3; + for(auto i = 0; i < vertexNum; i++) + { + meshdata->vertex.push_back(shapes.positions[i * 3]); + meshdata->vertex.push_back(shapes.positions[i * 3 + 1]); + meshdata->vertex.push_back(shapes.positions[i * 3 + 2]); + + if (hasnormal) + { + meshdata->vertex.push_back(shapes.normals[i * 3]); + meshdata->vertex.push_back(shapes.normals[i * 3 + 1]); + meshdata->vertex.push_back(shapes.normals[i * 3 + 2]); + } + + if (hastex) + { + meshdata->vertex.push_back(shapes.texcoords[i * 2]); + meshdata->vertex.push_back(shapes.texcoords[i * 2 + 1]); + } + } + meshdatas.meshDatas.push_back(meshdata); + + NMaterialData materialdata; + int i = 0; + char str[20]; + std::string dir = ""; + auto last = fullPath.rfind("/"); + if (last != -1) + dir = fullPath.substr(0, last + 1); + + for (const auto& it : shapes.shapes) + { + NTextureData tex; + tex.filename = dir + it.material.diffuse_texname; + tex.type = NTextureData::Usage::Diffuse; + + sprintf(str, "%d", i++); + materialdata.textures.push_back(tex); + materialdata.id = str; + materialdatas.materials.push_back(materialdata); + + meshdata->subMeshIndices.push_back(it.mesh.indices); + meshdata->subMeshIds.push_back(str); + + auto modelnode = new ModelNodeData(); + modelnode->matrialId = str; + modelnode->subMeshId = str; + modelnode->id = it.name; + nodedatas.nodes.push_back(modelnode); + } + return true; + } + CCLOG("load %s file error: %s", fullPath.c_str(), ret.c_str()); + return false; +} bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata) { diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index ea6164ac68..2fc9bf02e5 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -102,6 +102,9 @@ public: virtual bool loadNodes(NodeDatas& nodedatas); //since 3.3, to support reskin virtual bool loadMaterials(MaterialDatas& materialdatas); + + //load .obj file + static bool loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeDatas& nodedatas, const std::string& fullPath, const char* mtl_basepath = nullptr); protected: diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index 2d2edc511a..d179a7bb6b 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -105,6 +105,20 @@ struct NodeDatas { std::vector skeleton; //skeleton std::vector nodes; // nodes, CCNode, Sprite3D or part of Sprite3D + + void resetData() + { + for(auto& it : skeleton) + { + delete it; + } + skeleton.clear(); + for(auto& it : nodes) + { + delete it; + } + nodes.clear(); + } }; /**mesh data*/ diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 3220a3d10c..9b852a036d 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -114,40 +114,33 @@ bool Sprite3D::loadFromObj(const std::string& path) std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); std::string key = fullPath + "#"; - //.mtl file directory - std::string dir = ""; - auto last = fullPath.rfind("/"); - if (last != -1) - dir = fullPath.substr(0, last + 1); - - ObjLoader::shapes_t shapes; - std::string errstr = ObjLoader::LoadObj(shapes, fullPath.c_str(), dir.c_str()); - if (!errstr.empty()) - return false; - - //convert to mesh and material - std::vector > submeshIndices; - std::vector matnames; - std::string texname; - for (auto it = shapes.shapes.begin(); it != shapes.shapes.end(); it++) + MeshDatas meshdatas; + MaterialDatas materialdatas; + NodeDatas nodeDatas; + bool ret = Bundle3D::loadObj(meshdatas, materialdatas, nodeDatas, fullPath); + if (ret) { - submeshIndices.push_back((*it).mesh.indices); - - texname = (*it).material.diffuse_texname; - if (!texname.empty()) - texname = dir + (*it).material.diffuse_texname; - matnames.push_back(texname); + for( int i = 0 ; i < meshdatas.meshDatas.size() ; i++ ) + { + MeshData* meshData= meshdatas.meshDatas[i]; + if(meshData) + { + Mesh* mesh = Mesh::create(*meshData); + _meshes.pushBack(mesh); + } + } + for(int i = 0; i < nodeDatas.nodes.size(); i++ ) + { + NodeData* nodeData= nodeDatas.nodes[i]; + if(nodeData) + { + createNode(nodeData, this, materialdatas); + } + } } - - _mesh = Mesh::create(shapes.positions, shapes.normals, shapes.texcoords, submeshIndices); - _mesh->retain(); - if (_mesh == nullptr) - return false; - //add mesh to cache - MeshCache::getInstance()->addMesh(key, _mesh); +// //add mesh to cache +// MeshCache::getInstance()->addMesh(key, _mesh); - genMaterials(key, matnames); - genGLProgramState(); return true; @@ -356,8 +349,11 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m { _subMeshStates.pushBack(subMeshState); subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); - auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); - subMeshState->setSkin(skin); + if (_skeleton && modelNodeData->bones.size()) + { + auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); + subMeshState->setSkin(skin); + } if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) { @@ -434,10 +430,10 @@ void Sprite3D::genMaterials(const std::string& keyprefix, const std::vectorsetTexture(tex); _subMeshStates.pushBack(subMeshState); - //add to cache - sprintf(str, "submesh%d", index); - std::string submeshkey = keyprefix + std::string(str); - Sprite3DMaterialCache::getInstance()->addSprite3DMaterial(submeshkey, tex); +// //add to cache +// sprintf(str, "submesh%d", index); +// std::string submeshkey = keyprefix + std::string(str); +// Sprite3DMaterialCache::getInstance()->addSprite3DMaterial(submeshkey, tex); index++; } } From 2f816aea2c423ae84de288deee74f82563c5b398 Mon Sep 17 00:00:00 2001 From: liuliang Date: Mon, 18 Aug 2014 10:32:23 +0800 Subject: [PATCH 27/67] Modified load static model --- cocos/3d/CCSprite3D.cpp | 115 +++++++++++++++++++++++++++++----------- cocos/3d/CCSprite3D.h | 2 +- 2 files changed, 85 insertions(+), 32 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 9b852a036d..58622bd4b1 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -344,46 +344,95 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m ModelNodeData* modelNodeData=nodedata->asModelNodeData(); if(modelNodeData) { - auto subMeshState = SubMeshState::create(modelNodeData->id); - if(subMeshState) + if(modelNodeData->bones.size() > 0) { - _subMeshStates.pushBack(subMeshState); - subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); - if (_skeleton && modelNodeData->bones.size()) + auto subMeshState = SubMeshState::create(modelNodeData->id); + if(subMeshState) { - auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); - subMeshState->setSkin(skin); - } - - if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) - { - const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - subMeshState->setTexture(textureData->filename); - } - else - { - const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); - if(materialData) + _subMeshStates.pushBack(subMeshState); + subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); + if (_skeleton && modelNodeData->bones.size()) { - const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); - if(textureData) + auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); + subMeshState->setSkin(skin); + } + + if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) + { + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); + subMeshState->setTexture(textureData->filename); + } + else + { + const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); + if(materialData) { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); - if(tex) + const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); + if(textureData) { - Texture2D::TexParams texParams; - texParams.minFilter = GL_LINEAR; - texParams.magFilter = GL_LINEAR; - texParams.wrapS = textureData->wrapS; - texParams.wrapT = textureData->wrapT; - tex->setTexParameters(texParams); - subMeshState->setTexture(tex); + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + } - } } } } + else + { + auto sprite = new Sprite3D(); + if (sprite) + { + auto subMeshState = SubMeshState::create(modelNodeData->id); + subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); + if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) + { + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); + subMeshState->setTexture(textureData->filename); + } + else + { + const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); + if(materialData) + { + const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); + if(textureData) + { + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + + } + } + } + sprite->setAdditionalTransform(&nodedata->transform); + sprite->addSubMeshState(subMeshState); + sprite->autorelease(); + sprite->genGLProgramState(); + if(root) + { + root->addChild(sprite); + } + } + node=sprite; + } } else { @@ -416,7 +465,11 @@ SubMesh* Sprite3D::getSubMesh(const std::string& subMeshId) const } return nullptr; } - +void Sprite3D::addSubMeshState(SubMeshState* subMeshState) +{ + _meshes.pushBack(subMeshState->getSubMesh()->getMesh()); + _subMeshStates.pushBack(subMeshState); +} void Sprite3D::genMaterials(const std::string& keyprefix, const std::vector& texpaths) { _subMeshStates.clear(); diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index b1f5643ac5..fa6caae2ee 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -134,7 +134,7 @@ CC_CONSTRUCTOR_ACCESS: void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas); /**get SubMesh by Id*/ SubMesh* getSubMesh(const std::string& subMeshId) const; - + void addSubMeshState(SubMeshState* subMeshState); protected: Mesh* _mesh;//mesh MeshSkin* _skin;//skin From 79a55286ce1e1987327148ae60935098b8bbb372 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 11:13:08 +0800 Subject: [PATCH 28/67] refactor to new model --- cocos/3d/CCMeshSkin.cpp | 110 +------------- cocos/3d/CCMeshSkin.h | 14 -- cocos/3d/CCSkeleton3D.cpp | 73 --------- cocos/3d/CCSkeleton3D.h | 9 -- cocos/3d/CCSprite3D.cpp | 139 +++++------------- cocos/3d/CCSprite3D.h | 15 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 2 +- 7 files changed, 46 insertions(+), 316 deletions(-) diff --git a/cocos/3d/CCMeshSkin.cpp b/cocos/3d/CCMeshSkin.cpp index 92bca622cd..b0c3d46681 100644 --- a/cocos/3d/CCMeshSkin.cpp +++ b/cocos/3d/CCMeshSkin.cpp @@ -48,44 +48,6 @@ MeshSkin::~MeshSkin() CC_SAFE_RELEASE(_skeleton); } -MeshSkin* MeshSkin::create(Skeleton3D* skeleton, const std::string& filename, const std::string& name) -{ - //load skin here; - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename); - std::string key = fullPath + "#" + name; - const auto skindata = MeshSkinDataCache::getInstance()->getMeshSkinData(key); - if (skindata) - { - auto skin = new MeshSkin(); - skin->_skeleton = skeleton; - skeleton->retain(); - skin->initFromSkinData(*skindata); - skin->autorelease(); - return skin; - } - else - { - auto instance = Bundle3D::getInstance(); - bool ret = instance->load(fullPath); - if (ret) - { - SkinData data; - if (instance->loadSkinData(name, &data)) - { - auto skin = new MeshSkin(); - skin->_skeleton = skeleton; - skeleton->retain(); - skin->initFromSkinData(data); - skin->autorelease(); - MeshSkinDataCache::getInstance()->addMeshSkinData(key, data); - return skin; - } - } - } - - return nullptr; -} - MeshSkin* MeshSkin::create(Skeleton3D* skeleton, const std::vector& boneNames, const std::vector& invBindPose) { auto skin = new MeshSkin(); @@ -103,39 +65,9 @@ MeshSkin* MeshSkin::create(Skeleton3D* skeleton, const std::vector& return skin; } -bool MeshSkin::initFromSkinData(const SkinData& skindata) -{ - ssize_t i = 0; - for (; i < skindata.skinBoneNames.size(); i++) { - auto bone = Bone3D::create(skindata.skinBoneNames[i]); - bone->_invBindPose = skindata.inverseBindPoseMatrices[i]; - bone->setOriPose(skindata.skinBoneOriginMatrices[i]); - _invBindPoses.push_back(skindata.inverseBindPoseMatrices[i]); - addSkinBone(bone); - } - for (i = 0; i < skindata.nodeBoneNames.size(); i++) { - auto bone = Bone3D::create(skindata.nodeBoneNames[i]); - bone->setOriPose(skindata.nodeBoneOriginMatrices[i]); - addNodeBone(bone); - } - for (auto it : skindata.boneChild) { - auto parent = getBoneByIndex(it.first); - for (auto childIt : it.second) { - auto child = getBoneByIndex(childIt); - child->_parent = parent; - parent->_children.pushBack(child); - } - } - - setRootBone(getBoneByIndex(skindata.rootBoneIndex)); - _rootBone->resetPose(); - - return true; -} - ssize_t MeshSkin::getBoneCount() const { - return _skinBones.size() + _nodeBones.size(); + return _skinBones.size(); } //get bone @@ -143,9 +75,6 @@ Bone3D* MeshSkin::getBoneByIndex(unsigned int index) const { if (index < _skinBones.size()) return _skinBones.at(index); - index -= _skinBones.size(); - if (index < _nodeBones.size()) - return _nodeBones.at(index); return nullptr; } @@ -156,25 +85,9 @@ Bone3D* MeshSkin::getBoneByName(const std::string& id) const if (it->getName() == id) return it; } - //search from node bones - for (const auto& it : _nodeBones) { - if (it->getName() == id ) - return it; - } return nullptr; } -Bone3D* MeshSkin::getRootBone() const -{ - return _rootBone; -} -void MeshSkin::setRootBone(Bone3D* joint) -{ - CC_SAFE_RETAIN(joint); - CC_SAFE_RELEASE(_rootBone); - _rootBone = joint; -} - int MeshSkin::getBoneIndex(Bone3D* bone) const { int i = 0; @@ -182,19 +95,13 @@ int MeshSkin::getBoneIndex(Bone3D* bone) const if (_skinBones.at(i) == bone) return i; } - int index = 0; - for (; index < _nodeBones.size(); index++, i++) { - if (_nodeBones.at(index) == bone) - return i; - } + return -1; } //compute matrix palette used by gpu skin Vec4* MeshSkin::getMatrixPalette() { - updateBoneMatrix(); - if (_matrixPalette == nullptr) { _matrixPalette = new Vec4[_skinBones.size() * PALETTE_ROWS]; @@ -217,17 +124,9 @@ ssize_t MeshSkin::getMatrixPaletteSize() const return _skinBones.size() * PALETTE_ROWS; } -//refresh bone world matrix -void MeshSkin::updateBoneMatrix() -{ -// _rootBone->setWorldMatDirty(true); -// _rootBone->updateWorldMat(); -} - void MeshSkin::removeAllBones() { _skinBones.clear(); - _nodeBones.clear(); CC_SAFE_DELETE_ARRAY(_matrixPalette); CC_SAFE_RELEASE(_rootBone); } @@ -237,11 +136,6 @@ void MeshSkin::addSkinBone(Bone3D* bone) _skinBones.pushBack(bone); } -void MeshSkin::addNodeBone(Bone3D* bone) -{ - _nodeBones.pushBack(bone); -} - //////////////////////////////////////////////////////////////////////// MeshSkinDataCache* MeshSkinDataCache::_cacheInstance = nullptr; diff --git a/cocos/3d/CCMeshSkin.h b/cocos/3d/CCMeshSkin.h index 83ebd8048f..626e7af0ab 100644 --- a/cocos/3d/CCMeshSkin.h +++ b/cocos/3d/CCMeshSkin.h @@ -61,10 +61,6 @@ public: Bone3D* getBoneByIndex(unsigned int index) const; Bone3D* getBoneByName(const std::string& id) const; - /**get & set root bone*/ - Bone3D* getRootBone() const; - void setRootBone(Bone3D* bone); - /**get bone index*/ int getBoneIndex(Bone3D* bone) const; @@ -74,32 +70,22 @@ public: /**getSkinBoneCount() * 3*/ ssize_t getMatrixPaletteSize() const; - /**refresh bone world matrix*/ - void updateBoneMatrix(); - CC_CONSTRUCTOR_ACCESS: MeshSkin(); ~MeshSkin(); - /**init from skin data*/ - bool initFromSkinData(const SkinData& skindata); - /**remove all bones*/ void removeAllBones(); /**add skin bone*/ void addSkinBone(Bone3D* bone); - /**add Node bone*/ - void addNodeBone(Bone3D* bone); - protected: Vector _skinBones; // bones with skin std::vector _invBindPoses; //inverse bind pose of bone - Vector _nodeBones; //bones without skin, only used to compute transform of children Bone3D* _rootBone; Skeleton3D* _skeleton; //skeleton the skin refered diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index 6b5b20a77d..eb1d785814 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -249,7 +249,6 @@ void Bone3D::updateLocalMat() //////////////////////////////////////////////////////////////////////////////////////////////////////////////// Skeleton3D::Skeleton3D() -: _rootBone(nullptr) { } @@ -259,41 +258,6 @@ Skeleton3D::~Skeleton3D() removeAllBones(); } -//create a new meshskin if do not want to share meshskin -Skeleton3D* Skeleton3D::create(const std::string& filename, const std::string& name) -{ - //load skin here; - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename); - std::string key(fullPath + "#" + name); - const auto skeletondata = Skeleton3DDataCache::getInstance()->getSkeletonData(key); - if (skeletondata) - { - auto skeleton = new Skeleton3D(); - skeleton->initFromSkeletonData(*skeletondata); - skeleton->autorelease(); - return skeleton; - } - else - { - auto instance = Bundle3D::getInstance(); - bool ret = instance->load(fullPath); - if (ret) - { - Skeleton3DData data; - if (instance->loadSkeletonData(name, &data)) - { - auto skeleton = new Skeleton3D(); - skeleton->initFromSkeletonData(data); - skeleton->autorelease(); - Skeleton3DDataCache::getInstance()->addSkeletonData(key, data); - return skeleton; - } - } - } - - return nullptr; -} - Skeleton3D* Skeleton3D::create(const std::vector& skeletondata) { auto skeleton = new Skeleton3D(); @@ -306,31 +270,6 @@ Skeleton3D* Skeleton3D::create(const std::vector& skeletondata) return skeleton; } -bool Skeleton3D::initFromSkeletonData(const Skeleton3DData& skeletondata) -{ - ssize_t i = 0; - for (; i < skeletondata.boneNames.size(); i++) { - auto bone = Bone3D::create(skeletondata.boneNames[i]); - bone->setOriPose(skeletondata.boneOriginMatrices[i]); - addBone(bone); - } - - for (auto it : skeletondata.boneChild) { - auto parent = getBoneByIndex(it.first); - for (auto childIt : it.second) { - auto child = getBoneByIndex(childIt); - child->_parent = parent; - parent->_children.pushBack(child); - } - } - - setRootBone(getBoneByIndex(skeletondata.rootBoneIndex)); - if (_rootBone) - _rootBone->resetPose(); - - return true; -} - ssize_t Skeleton3D::getBoneCount() const { return _bones.size(); @@ -355,17 +294,6 @@ Bone3D* Skeleton3D::getBoneByName(const std::string& id) const return nullptr; } -Bone3D* Skeleton3D::getRootBone() const -{ - return _rootBone; -} -void Skeleton3D::setRootBone(Bone3D* joint) -{ - CC_SAFE_RETAIN(joint); - CC_SAFE_RELEASE(_rootBone); - _rootBone = joint; -} - ssize_t Skeleton3D::getRootCount() const { return _rootBones.size(); @@ -401,7 +329,6 @@ void Skeleton3D::updateBoneMatrix() void Skeleton3D::removeAllBones() { _bones.clear(); - CC_SAFE_RELEASE(_rootBone); _rootBones.clear(); } diff --git a/cocos/3d/CCSkeleton3D.h b/cocos/3d/CCSkeleton3D.h index 937f5f3de4..90fff8030a 100644 --- a/cocos/3d/CCSkeleton3D.h +++ b/cocos/3d/CCSkeleton3D.h @@ -187,9 +187,6 @@ class CC_DLL Skeleton3D: public Ref { public: - /**create a new meshskin if do not want to share Skeleton3D*/ - static Skeleton3D* create(const std::string& filename, const std::string& name); - static Skeleton3D* create(const std::vector& skeletondata); /**get total bone count*/ @@ -200,8 +197,6 @@ public: Bone3D* getBoneByName(const std::string& id) const; /**get & set root bone*/ - Bone3D* getRootBone() const; - void setRootBone(Bone3D* bone); ssize_t getRootCount() const; Bone3D* getRootBone(int index) const; @@ -217,9 +212,6 @@ CC_CONSTRUCTOR_ACCESS: ~Skeleton3D(); - /**init from skeleton data*/ - bool initFromSkeletonData(const Skeleton3DData& skeletondata); - /**remove all bones*/ void removeAllBones(); @@ -233,7 +225,6 @@ protected: Vector _bones; // bones - Bone3D* _rootBone; Vector _rootBones; }; diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 9b852a036d..28448dab87 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -75,35 +75,7 @@ Sprite3D* Sprite3D::create(const std::string &modelPath, const std::string &text bool Sprite3D::loadFromCache(const std::string& path) { - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); - - //find from the cache - std::string key = fullPath + "#"; - auto mesh = MeshCache::getInstance()->getMesh(key); - if (mesh) - { - _mesh = mesh; - _mesh->retain(); - - char str[20]; - for (int i = 0; i < (int)_mesh->getSubMeshCount(); i++) { - sprintf(str, "submesh%d", i); - std::string submeshkey = key + std::string(str); - auto tex = Sprite3DMaterialCache::getInstance()->getSprite3DMaterial(submeshkey); - auto submeshstate = SubMeshState::create(); - submeshstate->setTexture(tex); - _subMeshStates.pushBack(submeshstate); - } - - _skeleton = Skeleton3D::create(fullPath, ""); - CC_SAFE_RETAIN(_skeleton); - _skin = MeshSkin::create(_skeleton, fullPath, ""); - CC_SAFE_RETAIN(_skin); - - genGLProgramState(); - - return true; - } + //FIX ME, TODO return false; } @@ -196,53 +168,12 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) } bool Sprite3D::loadFromC3x(const std::string& path) { - std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); - std::string key = fullPath + "#"; - - //load from .c3b or .c3t - auto bundle = Bundle3D::getInstance(); - if (!bundle->load(fullPath)) - return false; - - MeshData meshdata; - bool ret = bundle->loadMeshData("", &meshdata); - if (!ret) - { - return false; - } - - _mesh = Mesh::create(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs); - - CC_SAFE_RETAIN(_mesh); - //add mesh to cache - MeshCache::getInstance()->addMesh(key, _mesh); - _skeleton = Skeleton3D::create(fullPath, ""); - CC_SAFE_RETAIN(_skeleton); - _skin = MeshSkin::create(_skeleton, fullPath, ""); - CC_SAFE_RETAIN(_skin); - - MaterialData materialdata; - ret = bundle->loadMaterialData("", &materialdata); - if (ret) - { - std::vector texpaths; - texpaths.resize(_mesh->getSubMeshCount(), ""); - for (auto& it : materialdata.texturePaths) - { - texpaths[it.first] = it.second; - } - genMaterials(key, texpaths); - } - - genGLProgramState(); - + //will move loadFromC3x_0_3 here return true; } Sprite3D::Sprite3D() -: _mesh(nullptr) -, _skin(nullptr) -, _skeleton(nullptr) +: _skeleton(nullptr) , _blend(BlendFunc::ALPHA_NON_PREMULTIPLIED) { } @@ -251,8 +182,6 @@ Sprite3D::~Sprite3D() { _subMeshStates.clear(); _meshes.clear(); - CC_SAFE_RELEASE_NULL(_mesh); - CC_SAFE_RELEASE_NULL(_skin); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); } @@ -260,8 +189,6 @@ Sprite3D::~Sprite3D() bool Sprite3D::initWithFile(const std::string &path) { _subMeshStates.clear(); - CC_SAFE_RELEASE_NULL(_mesh); - CC_SAFE_RELEASE_NULL(_skin); CC_SAFE_RELEASE_NULL(_skeleton); if (loadFromCache(path)) @@ -417,27 +344,6 @@ SubMesh* Sprite3D::getSubMesh(const std::string& subMeshId) const return nullptr; } -void Sprite3D::genMaterials(const std::string& keyprefix, const std::vector& texpaths) -{ - _subMeshStates.clear(); - - char str[20]; - auto cache = Director::getInstance()->getTextureCache(); - int index = 0; - for (auto& it : texpaths) { - auto tex = cache->addImage(it); - auto subMeshState = SubMeshState::create(); - subMeshState->setTexture(tex); - _subMeshStates.pushBack(subMeshState); - -// //add to cache -// sprintf(str, "submesh%d", index); -// std::string submeshkey = keyprefix + std::string(str); -// Sprite3DMaterialCache::getInstance()->addSprite3DMaterial(submeshkey, tex); - index++; - } -} - void Sprite3D::setTexture(const std::string& texFile) { auto tex = Director::getInstance()->getTextureCache()->addImage(texFile); @@ -454,9 +360,9 @@ AttachNode* Sprite3D::getAttachNode(const std::string& boneName) if (it != _attachments.end()) return it->second; - if (_skin) + if (_skeleton) { - auto bone = _skin->getBoneByName(boneName); + auto bone = _skeleton->getBoneByName(boneName); auto attachNode = AttachNode::create(bone); addChild(attachNode); _attachments[boneName] = attachNode; @@ -543,12 +449,12 @@ AABB Sprite3D::getAABB() const else { Mat4 transform(nodeToWorldTransform); - _aabb = _mesh->getOriginAABB(); + _aabb = _originalAABB; - if (getSkin() && getSkin()->getRootBone()) - { - transform = nodeToWorldTransform * getSkin()->getRootBone()->getWorldMat(); - } +// if (getSkin() && getSkin()->getRootBone()) +// { +// transform = nodeToWorldTransform * getSkin()->getRootBone()->getWorldMat(); +// } _aabb.transform(transform); _nodeToWorldTransform = nodeToWorldTransform; @@ -578,4 +484,29 @@ void Sprite3D::setCullFaceEnabled(bool enable) } } +SubMeshState* Sprite3D::getSubMeshState(int index) const +{ + CCASSERT(index < _subMeshStates.size(), "invald index"); + return _subMeshStates.at(index); +} + +/**get SubMeshState by Name */ +SubMeshState* Sprite3D::getSubMeshStateByName(const std::string& name) const +{ + for (const auto& it : _subMeshStates) { + if (it->getName() == name) + return it; + } + return nullptr; +} + +MeshSkin* Sprite3D::getSkin() const +{ + for (const auto& it : _subMeshStates) { + if (it->getSkin()) + return it->getSkin(); + } + return nullptr; +} + NS_CC_END diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index b1f5643ac5..eb4c99e79e 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -63,12 +63,15 @@ public: /**get SubMeshState by index*/ SubMeshState* getSubMeshState(int index) const; + + /**get SubMeshState by Name */ + SubMeshState* getSubMeshStateByName(const std::string& name) const; /**get mesh*/ - Mesh* getMesh() const { return _mesh; } + Mesh* getMesh() const { return _meshes.at(0); } /**get skin*/ - MeshSkin* getSkin() const { return _skin; } + CC_DEPRECATED_ATTRIBUTE MeshSkin* getSkin() const; Skeleton3D* getSkeleton() const { return _skeleton; } @@ -128,16 +131,13 @@ CC_CONSTRUCTOR_ACCESS: /**generate default GLProgramState*/ void genGLProgramState(); - - /**generate materials, and add them to cache, keyprefix is used as key prefix when added to cache*/ - void genMaterials(const std::string& keyprefix, const std::vector& texpaths); + void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas); /**get SubMesh by Id*/ SubMesh* getSubMesh(const std::string& subMeshId) const; protected: - Mesh* _mesh;//mesh - MeshSkin* _skin;//skin + Skeleton3D* _skeleton; //skeleton std::vector _meshCommands; //render command each for one submesh @@ -152,6 +152,7 @@ protected: Vector _meshes; mutable AABB _aabb; // cache current aabb + AABB _originalAABB; // original aabb mutable Mat4 _nodeToWorldTransform; // cache the matrix }; diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 584b7f1573..a9b76173ce 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1275,7 +1275,7 @@ void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) std::string fileName = "Sprite3DTest/orc.c3t"; auto sprite = Sprite3D::create(fileName); sprite->setScale(6); - sprite->setRotation3D(Vec3(90,0,0)); + sprite->setRotation3D(Vec3(0,180,0)); addChild(sprite); sprite->setPosition( Vec2( p.x - 80, p.y) ); From 219404bd7d2f18810ce4c4832b278e5030d28fc0 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 11:42:41 +0800 Subject: [PATCH 29/67] change tex param --- cocos/3d/CCBundle3D.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 224eacd70f..1f72d02184 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -288,8 +288,8 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD NTextureData tex; tex.filename = dir + it.material.diffuse_texname; tex.type = NTextureData::Usage::Diffuse; - tex.wrapS = GL_CLAMP; - tex.wrapT = GL_CLAMP; + tex.wrapS = GL_CLAMP_TO_EDGE; + tex.wrapT = GL_CLAMP_TO_EDGE; sprintf(str, "%d", i++); materialdata.textures.push_back(tex); From 30ce92f6775b792804fe4f297f17c8174360235f Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 14:16:34 +0800 Subject: [PATCH 30/67] obj work, make code clean --- cocos/3d/CCSprite3D.cpp | 102 ++++++++++++++++------------------------ cocos/3d/CCSprite3D.h | 6 ++- 2 files changed, 44 insertions(+), 64 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index a4688d2020..c900072ef3 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -92,32 +92,14 @@ bool Sprite3D::loadFromObj(const std::string& path) bool ret = Bundle3D::loadObj(meshdatas, materialdatas, nodeDatas, fullPath); if (ret) { - for( int i = 0 ; i < meshdatas.meshDatas.size() ; i++ ) - { - MeshData* meshData= meshdatas.meshDatas[i]; - if(meshData) - { - Mesh* mesh = Mesh::create(*meshData); - _meshes.pushBack(mesh); - } - } - for(int i = 0; i < nodeDatas.nodes.size(); i++ ) - { - NodeData* nodeData= nodeDatas.nodes[i]; - if(nodeData) - { - createNode(nodeData, this, materialdatas); - } - } + return initFrom(nodeDatas, meshdatas, materialdatas); } // //add mesh to cache // MeshCache::getInstance()->addMesh(key, _mesh); - genGLProgramState(); - - return true; + return false; } -bool Sprite3D::loadFromC3x_0_3(const std::string& path) +bool Sprite3D::loadFromC3x(const std::string& path) { std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); std::string key = fullPath + "#"; @@ -128,48 +110,16 @@ bool Sprite3D::loadFromC3x_0_3(const std::string& path) return false; MeshDatas meshdatas; - bool ret = bundle->loadMeshDatas(meshdatas); - if (!ret) - { - return false; - } - for( int i = 0 ; i < meshdatas.meshDatas.size() ; i++ ) - { - MeshData* meshData= meshdatas.meshDatas[i]; - if(meshData) - { - Mesh* mesh = Mesh::create(*meshData); - _meshes.pushBack(mesh); - } - } - MaterialDatas materialdatas; - ret = bundle->loadMaterials(materialdatas); - if (!ret) - { - return false; - } NodeDatas nodeDatas; - bundle->loadNodes(nodeDatas); - _skeleton = Skeleton3D::create(nodeDatas.skeleton); - CC_SAFE_RETAIN(_skeleton); - - for(int i = 0; i < nodeDatas.nodes.size(); i++ ) + if (bundle->loadMeshDatas(meshdatas) + && bundle->loadMaterials(materialdatas) + && bundle->loadNodes(nodeDatas)) { - NodeData* nodeData= nodeDatas.nodes[i]; - if(nodeData) - { - createNode(nodeData, this, materialdatas); - } + return initFrom(nodeDatas, meshdatas, materialdatas); } - genGLProgramState(); - return true; -} -bool Sprite3D::loadFromC3x(const std::string& path) -{ - //will move loadFromC3x_0_3 here - return true; + return false; } Sprite3D::Sprite3D() @@ -189,7 +139,9 @@ Sprite3D::~Sprite3D() bool Sprite3D::initWithFile(const std::string &path) { _subMeshStates.clear(); + _meshes.clear(); CC_SAFE_RELEASE_NULL(_skeleton); + removeAllAttachNode(); if (loadFromCache(path)) return true; @@ -204,12 +156,38 @@ bool Sprite3D::initWithFile(const std::string &path) } else if (ext == ".c3b" || ext == ".c3t") { - return loadFromC3x_0_3(path); + return loadFromC3x(path); } return false; } +bool Sprite3D::initFrom(const NodeDatas& nodeDatas, const MeshDatas& meshdatas, const MaterialDatas& materialdatas) +{ + for(const auto& it : meshdatas.meshDatas) + { + if(it) + { + Mesh* mesh = Mesh::create(*it); + _meshes.pushBack(mesh); + } + } + _skeleton = Skeleton3D::create(nodeDatas.skeleton); + CC_SAFE_RETAIN(_skeleton); + + for(const auto& it : nodeDatas.nodes) + { + if(it) + { + createNode(it, this, materialdatas, nodeDatas.nodes.size() == 1); + } + } + + genGLProgramState(); + + return true; +} + void Sprite3D::genGLProgramState() { if (_meshes.size() == 0) @@ -265,13 +243,13 @@ GLProgram* Sprite3D::getDefaultGLProgram(bool textured) return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); } } -void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas) +void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas, bool singleSprite) { Node* node=nullptr; ModelNodeData* modelNodeData=nodedata->asModelNodeData(); if(modelNodeData) { - if(modelNodeData->bones.size() > 0) + if(modelNodeData->bones.size() > 0 || singleSprite) { auto subMeshState = SubMeshState::create(modelNodeData->id); if(subMeshState) @@ -378,7 +356,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m NodeData* childData = nodedata->children[i]; if(childData) { - createNode(childData,node, matrialdatas); + createNode(childData,node, matrialdatas, singleSprite); } } } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 98e88ad366..c67001fa95 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -113,6 +113,8 @@ CC_CONSTRUCTOR_ACCESS: virtual ~Sprite3D(); bool initWithFile(const std::string &path); + bool initFrom(const NodeDatas& nodedatas, const MeshDatas& meshdatas, const MaterialDatas& materialdatas); + /**load sprite3d from cache, return true if succeed, false otherwise*/ bool loadFromCache(const std::string& path); @@ -121,7 +123,6 @@ CC_CONSTRUCTOR_ACCESS: /**load from .c3b or .c3t*/ bool loadFromC3x(const std::string& path); - bool loadFromC3x_0_3(const std::string& path); /**draw*/ virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; @@ -132,10 +133,11 @@ CC_CONSTRUCTOR_ACCESS: /**generate default GLProgramState*/ void genGLProgramState(); - void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas); + void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas, bool singleSprite); /**get SubMesh by Id*/ SubMesh* getSubMesh(const std::string& subMeshId) const; void addSubMeshState(SubMeshState* subMeshState); + protected: Skeleton3D* _skeleton; //skeleton From 01c1691a4f02fae4081a95d6225fbca3e57bd456 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 17:02:13 +0800 Subject: [PATCH 31/67] deal aabb --- cocos/3d/CCAABB.cpp | 5 +++++ cocos/3d/CCAABB.h | 2 ++ cocos/3d/CCMesh.cpp | 30 ++++++++++-------------------- cocos/3d/CCMesh.h | 12 ------------ cocos/3d/CCMeshSkin.cpp | 13 +++++++++++++ cocos/3d/CCMeshSkin.h | 3 +++ cocos/3d/CCSprite3D.cpp | 17 +++++++++-------- cocos/3d/CCSprite3D.h | 6 ++++-- cocos/3d/CCSubMesh.h | 4 ++++ cocos/3d/CCSubMeshState.cpp | 29 +++++++++++++++++++++++++++++ cocos/3d/CCSubMeshState.h | 8 +++++++- 11 files changed, 86 insertions(+), 43 deletions(-) diff --git a/cocos/3d/CCAABB.cpp b/cocos/3d/CCAABB.cpp index 4c159ae8b8..912e184c00 100755 --- a/cocos/3d/CCAABB.cpp +++ b/cocos/3d/CCAABB.cpp @@ -119,6 +119,11 @@ void AABB::reset() _max.set(-99999.0f, -99999.0f, -99999.0f); } +bool AABB::isEmpty() const +{ + return _min.x > _max.x || _min.y > _max.y || _min.z > _max.z; +} + void AABB::updateMinMax(const Vec3* point, ssize_t num) { for (ssize_t i = 0; i < num; i++) diff --git a/cocos/3d/CCAABB.h b/cocos/3d/CCAABB.h index 8894aa0098..860912d07a 100755 --- a/cocos/3d/CCAABB.h +++ b/cocos/3d/CCAABB.h @@ -93,6 +93,8 @@ public: * reset min and max value. */ void reset(); + + bool isEmpty() const; /** * update the _min and _max from the given point. diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 5ea76b228a..309c2d2ab9 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -225,8 +225,6 @@ bool Mesh::init(const std::vector& positions, const std::vector& n buildBuffer(); - calOriginAABB(positions, 3); - return true; } @@ -241,9 +239,6 @@ bool Mesh::init(const std::vector& vertices, int vertexSizeInFloat, const buildBuffer(); - unsigned int perVertexSize = _renderdata.calVertexSizeBytes() / sizeof(float); - calOriginAABB(vertices, perVertexSize); - return true; } @@ -253,6 +248,16 @@ void Mesh::buildSubMeshes() for (auto& it : _renderdata._subMeshIndices) { auto subMesh = SubMesh::create(PrimitiveType::TRIANGLES, IndexFormat::INDEX16, it); _subMeshes.pushBack(subMesh); + + //calculate aabb for sub mesh + AABB aabb; + int stride = _renderdata._vertexsizeBytes / sizeof(float); + for(size_t i = 0; i < it.size(); i++) + { + Vec3 point = Vec3(_renderdata._vertexs[it[i * stride] ], _renderdata._vertexs[ it[i * stride + 1] ], _renderdata._vertexs[it[i * stride + 2] ]); + aabb.updateMinMax(&point, 1); + } + subMesh->_aabb = aabb; } } @@ -269,16 +274,6 @@ void Mesh::cleanAndFreeBuffers() } } -void Mesh::calOriginAABB(const std::vector& vertices, unsigned int stride) -{ - ssize_t vertexNum = vertices.size() / stride; - for(unsigned int i = 0; i < vertexNum; i++) - { - Vec3 point = Vec3(vertices[i * stride], vertices[i * stride + 1], vertices[i * stride + 2]); - _originAABB.updateMinMax(&point, 1); - } -} - void Mesh::buildBuffer() { cleanAndFreeBuffers(); @@ -307,11 +302,6 @@ void Mesh::restore() buildBuffer(); } -const AABB& Mesh::getOriginAABB() const -{ - return _originAABB; -} - SubMesh* Mesh::getSubMeshById(const std::string& subMeshId) const { for (auto it : _subMeshes) { diff --git a/cocos/3d/CCMesh.h b/cocos/3d/CCMesh.h index 5aee289240..0c3bddd9a7 100644 --- a/cocos/3d/CCMesh.h +++ b/cocos/3d/CCMesh.h @@ -126,9 +126,6 @@ public: /**build vertex buffer from renderdata*/ void restore(); - /** get origin aabb that calculate from vertices*/ - const AABB& getOriginAABB() const; - /** get submesh by id */ SubMesh* getSubMeshById(const std::string& subMeshId) const; @@ -158,21 +155,12 @@ CC_CONSTRUCTOR_ACCESS: void buildBuffer(); /**free buffer*/ void cleanAndFreeBuffers(); - - /* - * calculate AABB by origin vertices - * @param the vertices list - * @param stride the stride between two vertex's position data. - */ - void calOriginAABB(const std::vector& vertices, unsigned int stride); protected: GLuint _vertexBuffer; Vector _subMeshes; RenderMeshData _renderdata; - - AABB _originAABB; }; /** diff --git a/cocos/3d/CCMeshSkin.cpp b/cocos/3d/CCMeshSkin.cpp index b0c3d46681..8c0db04e0d 100644 --- a/cocos/3d/CCMeshSkin.cpp +++ b/cocos/3d/CCMeshSkin.cpp @@ -136,6 +136,19 @@ void MeshSkin::addSkinBone(Bone3D* bone) _skinBones.pushBack(bone); } +Bone3D* MeshSkin::getRootBone() const +{ + Bone3D* root = nullptr; + if (_skinBones.size()) + { + root = _skinBones.at(0); + while (root->getParentBone()) { + root = root->getParentBone(); + } + } + return root; +} + //////////////////////////////////////////////////////////////////////// MeshSkinDataCache* MeshSkinDataCache::_cacheInstance = nullptr; diff --git a/cocos/3d/CCMeshSkin.h b/cocos/3d/CCMeshSkin.h index 626e7af0ab..69f62f5ed3 100644 --- a/cocos/3d/CCMeshSkin.h +++ b/cocos/3d/CCMeshSkin.h @@ -70,6 +70,9 @@ public: /**getSkinBoneCount() * 3*/ ssize_t getMatrixPaletteSize() const; + /**get root bone of the skin*/ + Bone3D* getRootBone() const; + CC_CONSTRUCTOR_ACCESS: MeshSkin(); diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index c900072ef3..6fbba908b2 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -125,6 +125,7 @@ bool Sprite3D::loadFromC3x(const std::string& path) Sprite3D::Sprite3D() : _skeleton(nullptr) , _blend(BlendFunc::ALPHA_NON_PREMULTIPLIED) +, _aabbDirty(true) { } @@ -261,6 +262,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); subMeshState->setSkin(skin); } + subMeshState->_visibleChanged = std::bind(&Sprite3D::onAABBDirty, this); if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) { @@ -470,24 +472,23 @@ const BlendFunc& Sprite3D::getBlendFunc() const return _blend; } -AABB Sprite3D::getAABB() const +const AABB& Sprite3D::getAABB() const { Mat4 nodeToWorldTransform(getNodeToWorldTransform()); // If nodeToWorldTransform matrix isn't changed, we don't need to transform aabb. - if (memcmp(_nodeToWorldTransform.m, nodeToWorldTransform.m, sizeof(Mat4)) == 0) + if (memcmp(_nodeToWorldTransform.m, nodeToWorldTransform.m, sizeof(Mat4)) == 0 && !_aabbDirty) { return _aabb; } else { + _aabb.reset(); Mat4 transform(nodeToWorldTransform); - _aabb = _originalAABB; - -// if (getSkin() && getSkin()->getRootBone()) -// { -// transform = nodeToWorldTransform * getSkin()->getRootBone()->getWorldMat(); -// } + for (const auto& it : _subMeshStates) { + if (it->isVisible()) + _aabb.merge(it->getAABB()); + } _aabb.transform(transform); _nodeToWorldTransform = nodeToWorldTransform; diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index c67001fa95..fa3d4841a2 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -94,7 +94,7 @@ public: * because bone can drive the vertices, we just use the origin vertices * to calculate the AABB. */ - AABB getAABB() const; + const AABB& getAABB() const; /** * Returns 2d bounding-box @@ -138,6 +138,8 @@ CC_CONSTRUCTOR_ACCESS: SubMesh* getSubMesh(const std::string& subMeshId) const; void addSubMeshState(SubMeshState* subMeshState); + void onAABBDirty() { _aabbDirty = true; } + protected: Skeleton3D* _skeleton; //skeleton @@ -154,8 +156,8 @@ protected: Vector _meshes; mutable AABB _aabb; // cache current aabb - AABB _originalAABB; // original aabb mutable Mat4 _nodeToWorldTransform; // cache the matrix + bool _aabbDirty; }; extern std::string CC_DLL s_attributeNames[];//attribute names array diff --git a/cocos/3d/CCSubMesh.h b/cocos/3d/CCSubMesh.h index 1e792473f7..0e57b21b77 100644 --- a/cocos/3d/CCSubMesh.h +++ b/cocos/3d/CCSubMesh.h @@ -29,6 +29,7 @@ #include #include "3d/CCBundle3DData.h" +#include "3d/CCAABB.h" #include "base/CCRef.h" #include "base/ccTypes.h" @@ -62,6 +63,7 @@ class Mesh; class CC_DLL SubMesh : public Ref { friend class Mesh; + friend class SubMeshState; public: /**create submesh from primitivetype indexformat and indices*/ @@ -94,6 +96,7 @@ CC_CONSTRUCTOR_ACCESS: /**free buffer*/ void cleanAndFreeBuffers(); + const AABB& getAABB() const { return _aabb; } protected: PrimitiveType _primitiveType; IndexFormat _indexFormat; @@ -103,6 +106,7 @@ protected: Mesh* _mesh; //parent mesh, weak ref std::string _id; //submeshid + AABB _aabb; //original aabb of the submesh }; NS_CC_END diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index 11d2220424..1695030977 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -51,6 +51,7 @@ SubMeshState::SubMeshState() , _texture(nullptr) , _skin(nullptr) , _subMesh(nullptr) +, _visibleChanged(nullptr) { } @@ -79,6 +80,16 @@ SubMeshState* SubMeshState::create(const std::string& name) return state; } +void SubMeshState::setVisible(bool visible) +{ + if (_visible != visible) + { + _visible = visible; + if (_visibleChanged) + _visibleChanged(); + } +} + void SubMeshState::setTexture(const std::string& texPath) { auto tex = Director::getInstance()->getTextureCache()->addImage(texPath); @@ -102,6 +113,7 @@ void SubMeshState::setSkin(MeshSkin* skin) CC_SAFE_RETAIN(skin); CC_SAFE_RELEASE(_skin); _skin = skin; + calcuateAABB(); } } @@ -112,6 +124,23 @@ void SubMeshState::setSubMesh(SubMesh* subMesh) CC_SAFE_RETAIN(subMesh); CC_SAFE_RELEASE(_subMesh); _subMesh = subMesh; + calcuateAABB(); + } +} + +void SubMeshState::calcuateAABB() +{ + if (_subMesh) + { + _aabb = _subMesh->getAABB(); + if (_skin) + { + Bone3D* root = _skin->getRootBone(); + if (root) + { + _aabb.transform(root->getWorldMat()); + } + } } } diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index 4ef2f2795f..d0cff16e4c 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -29,6 +29,7 @@ #include #include "3d/CCBundle3DData.h" +#include "3d/CCAABB.h" #include "base/CCRef.h" #include "base/ccTypes.h" @@ -59,7 +60,7 @@ public: Texture2D* getTexture() const { return _texture; } /**visible getter and setter*/ - void setVisible(bool visible) { _visible = visible; } + void setVisible(bool visible); bool isVisible() const { return _visible; } /**skin getter */ @@ -83,6 +84,9 @@ CC_CONSTRUCTOR_ACCESS: /**name setter*/ void setName(const std::string& name) { _name = name; } + const AABB& getAABB() const { return _aabb; } + + void calcuateAABB(); protected: Texture2D* _texture; //texture that submesh is using MeshSkin* _skin; //skin @@ -91,6 +95,8 @@ protected: //since 3.3 std::string _name; SubMesh* _subMesh; + AABB _aabb; + std::function _visibleChanged; }; NS_CC_END From e151b207a461a186db6f31b6dc424836099f69ae Mon Sep 17 00:00:00 2001 From: liuliang Date: Mon, 18 Aug 2014 17:31:04 +0800 Subject: [PATCH 32/67] Modified binary load model, compatible with the old format --- cocos/3d/CCBundle3D.cpp | 925 ++++++++++++++++++++++++++-------------- cocos/3d/CCBundle3D.h | 14 +- 2 files changed, 619 insertions(+), 320 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 7b089daf6f..e4642f50a1 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -1,26 +1,26 @@ /**************************************************************************** - Copyright (c) 2014 Chukong Technologies Inc. +Copyright (c) 2014 Chukong Technologies Inc. - http://www.cocos2d-x.org +http://www.cocos2d-x.org - 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: +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 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. - ****************************************************************************/ +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. +****************************************************************************/ #include "3d/CCBundle3D.h" #include "3d/CCObjLoader.h" @@ -96,11 +96,11 @@ static const char* ANIMATIONDATA_KEYTIME = "keytime"; NS_CC_BEGIN -void getChildMap(std::map >& map, SkinData* skinData, const rapidjson::Value& val) + void getChildMap(std::map >& map, SkinData* skinData, const rapidjson::Value& val) { if (!skinData) return; - + // get transform matrix Mat4 transform; const rapidjson::Value& parent_tranform = val[OLDTRANSFORM]; @@ -108,7 +108,7 @@ void getChildMap(std::map >& map, SkinData* skinData, cons { transform.m[j] = parent_tranform[j].GetDouble(); } - + // set origin matrices std::string parent_name = val[ID].GetString(); int parent_name_index = skinData->getSkinBoneNameIndex(parent_name); @@ -122,33 +122,33 @@ void getChildMap(std::map >& map, SkinData* skinData, cons { skinData->skinBoneOriginMatrices[parent_name_index] = (transform); } - + // set root bone index if(skinData->rootBoneIndex < 0) skinData->rootBoneIndex = parent_name_index; - + if (!val.HasMember(CHILDREN)) return; - + const rapidjson::Value& children = val[CHILDREN]; for (rapidjson::SizeType i = 0; i < children.Size(); i++) { // get child bone name const rapidjson::Value& child = children[i]; - + std::string child_name = child[ID].GetString(); int child_name_index = skinData->getSkinBoneNameIndex(child_name); if (child_name_index < 0) { skinData->addNodeBoneNames(child_name); child_name_index = skinData->getBoneNameIndex(child_name); - + } - + map[parent_name_index].push_back(child_name_index); - + getChildMap(map, skinData, child); - + } } @@ -211,7 +211,7 @@ bool Bundle3D::load(const std::string& path) } ret?(_path = path):(_path = ""); - + return ret; } @@ -220,7 +220,7 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD meshdatas.resetData(); materialdatas.resetData(); nodedatas.resetData(); - + ObjLoader::shapes_t shapes; auto ret = ObjLoader::LoadObj(shapes, fullPath.c_str(), mtl_basepath); if (ret.empty()) @@ -235,7 +235,7 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD attrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; attrib.attribSizeBytes = attrib.size * sizeof(float); meshdata->attribs.push_back(attrib); - + } bool hasnormal = false, hastex = false; if (shapes.normals.size()) @@ -259,14 +259,14 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD meshdata->vertex.push_back(shapes.positions[i * 3]); meshdata->vertex.push_back(shapes.positions[i * 3 + 1]); meshdata->vertex.push_back(shapes.positions[i * 3 + 2]); - + if (hasnormal) { meshdata->vertex.push_back(shapes.normals[i * 3]); meshdata->vertex.push_back(shapes.normals[i * 3 + 1]); meshdata->vertex.push_back(shapes.normals[i * 3 + 2]); } - + if (hastex) { meshdata->vertex.push_back(shapes.texcoords[i * 2]); @@ -274,7 +274,7 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD } } meshdatas.meshDatas.push_back(meshdata); - + NMaterialData materialdata; int i = 0; char str[20]; @@ -282,21 +282,21 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD auto last = fullPath.rfind("/"); if (last != -1) dir = fullPath.substr(0, last + 1); - + for (const auto& it : shapes.shapes) { NTextureData tex; tex.filename = dir + it.material.diffuse_texname; tex.type = NTextureData::Usage::Diffuse; - + sprintf(str, "%d", i++); materialdata.textures.push_back(tex); materialdata.id = str; materialdatas.materials.push_back(materialdata); - + meshdata->subMeshIndices.push_back(it.mesh.indices); meshdata->subMeshIds.push_back(str); - + auto modelnode = new ModelNodeData(); modelnode->matrialId = str; modelnode->subMeshId = str; @@ -308,11 +308,11 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD CCLOG("load %s file error: %s", fullPath.c_str(), ret.c_str()); return false; } - + bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata) { meshdata->resetData(); - + if (_isBinary) { return loadMeshDataBinary(meshdata); @@ -322,11 +322,11 @@ bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata) return loadMeshDataJson(meshdata); } } - + bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata) { skindata->resetData(); - + if (_isBinary) { return loadSkinDataBinary(skindata); @@ -336,11 +336,11 @@ bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata) return loadSkinDataJson(skindata); } } - + bool Bundle3D::loadMaterialData(const std::string& id, MaterialData* materialdata) { materialdata->resetData(); - + if (_isBinary) { return loadMaterialDataBinary(materialdata); @@ -350,11 +350,11 @@ bool Bundle3D::loadMaterialData(const std::string& id, MaterialData* materialdat return loadMaterialDataJson(materialdata); } } - + bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animationdata) { animationdata->resetData(); - + if (_isBinary) { return loadAnimationDataBinary(animationdata); @@ -368,7 +368,7 @@ bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animati bool Bundle3D::loadSkeletonData(const std::string& id, Skeleton3DData* skeletondata) { skeletondata->resetData(); - + //TODO return true; } @@ -379,7 +379,18 @@ bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) meshdatas.resetData(); if (_isBinary) { - return loadMeshDatasBinary(meshdatas); + if (_version == "0.1") + { + return loadMeshDatasBinary_0_1(meshdatas); + } + else if(_version == "0.2") + { + return loadMeshDatasBinary_0_2(meshdatas); + } + else if(_version == "0.3") + { + return loadMeshDatasBinary(meshdatas); + } } else { @@ -400,8 +411,235 @@ bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) } bool Bundle3D::loadMeshDatasBinary(MeshDatas& meshdatas) { + if (!seekToFirstType(BUNDLE_TYPE_MESH)) + return false; + unsigned int meshSize = 0; + if (_binaryReader.read(&meshSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; + } + for(int i = 0; i < meshSize ; i++ ) + { + MeshData* meshData = new MeshData(); + // read mesh data + if (_binaryReader.read(&meshData->attribCount, 4, 1) != 1 || meshData->attribCount < 1) + { + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; + } + meshData->attribs.resize(meshData->attribCount); + for (ssize_t i = 0; i < meshData->attribCount; i++) + { + unsigned int vUsage, vSize; + if (_binaryReader.read(&vUsage, 4, 1) != 1 || _binaryReader.read(&vSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: usage or size '%s'.", _path.c_str()); + return false; + } + + meshData->attribs[i].size = vSize; + meshData->attribs[i].attribSizeBytes = meshData->attribs[i].size * 4; + meshData->attribs[i].type = GL_FLOAT; + meshData->attribs[i].vertexAttrib = vUsage; + } + unsigned int vertexSizeInFloat = 0; + // Read vertex data + if (_binaryReader.read(&vertexSizeInFloat, 4, 1) != 1 || vertexSizeInFloat == 0) + { + CCLOGINFO("Failed to read meshdata: vertexSizeInFloat '%s'.", _path.c_str()); + return false; + } + + meshData->vertex.resize(vertexSizeInFloat); + if (_binaryReader.read(&meshData->vertex[0], 4, vertexSizeInFloat) != vertexSizeInFloat) + { + CCLOGINFO("Failed to read meshdata: vertex element '%s'.", _path.c_str()); + return false; + } + + // Read index data + unsigned int meshPartCount = 1; + _binaryReader.read(&meshPartCount, 4, 1); + + for (unsigned int i = 0; i < meshPartCount; ++i) + { + std::vector indexArray; + std:: string meshPartid = _binaryReader.readString(); + meshData->subMeshIds.push_back(meshPartid); + unsigned int nIndexCount; + if (_binaryReader.read(&nIndexCount, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: nIndexCount '%s'.", _path.c_str()); + return false; + } + indexArray.resize(nIndexCount); + if (_binaryReader.read(&indexArray[0], 2, nIndexCount) != nIndexCount) + { + CCLOGINFO("Failed to read meshdata: indices '%s'.", _path.c_str()); + return false; + } + meshData->subMeshIndices.push_back(indexArray); + meshData->numIndex = meshData->subMeshIndices.size(); + } + meshdatas.meshDatas.push_back(meshData); + } return true; } +bool Bundle3D::loadMeshDatasBinary_0_1(MeshDatas& meshdatas) +{ + if (!seekToFirstType(BUNDLE_TYPE_MESH)) + return false; + + meshdatas.resetData(); + + MeshData* meshdata = new MeshData(); + + // read mesh data + unsigned int attribSize=0; + if (_binaryReader.read(&attribSize, 4, 1) != 1 || attribSize < 1) + { + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; + } + + for (ssize_t i = 0; i < attribSize; i++) + { + unsigned int vUsage, vSize; + if (_binaryReader.read(&vUsage, 4, 1) != 1 || _binaryReader.read(&vSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: usage or size '%s'.", _path.c_str()); + return false; + } + + MeshVertexAttrib meshVertexAttribute; + meshVertexAttribute.size = vSize; + meshVertexAttribute.attribSizeBytes = vSize * 4; + meshVertexAttribute.type = GL_FLOAT; + meshVertexAttribute.vertexAttrib = vUsage; + + meshdata->attribs.push_back(meshVertexAttribute); + } + + // Read vertex data + if (_binaryReader.read(&meshdata->vertexSizeInFloat, 4, 1) != 1 || meshdata->vertexSizeInFloat == 0) + { + CCLOGINFO("Failed to read meshdata: vertexSizeInFloat '%s'.", _path.c_str()); + return false; + } + + meshdata->vertex.resize(meshdata->vertexSizeInFloat); + if (_binaryReader.read(&meshdata->vertex[0], 4, meshdata->vertexSizeInFloat) != meshdata->vertexSizeInFloat) + { + CCLOGINFO("Failed to read meshdata: vertex element '%s'.", _path.c_str()); + return false; + } + + // Read index data + unsigned int meshPartCount = 1; + for (unsigned int i = 0; i < meshPartCount; ++i) + { + unsigned int nIndexCount; + if (_binaryReader.read(&nIndexCount, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: nIndexCount '%s'.", _path.c_str()); + return false; + } + + std::vector indices; + indices.resize(nIndexCount); + if (_binaryReader.read(&indices[0], 2, nIndexCount) != nIndexCount) + { + CCLOGINFO("Failed to read meshdata: indices '%s'.", _path.c_str()); + return false; + } + + meshdata->subMeshIndices.push_back(indices); + } + + meshdatas.meshDatas.push_back(meshdata); + return true; +} + +bool Bundle3D::loadMeshDatasBinary_0_2(MeshDatas& meshdatas) +{ + if (!seekToFirstType(BUNDLE_TYPE_MESH)) + return false; + + meshdatas.resetData(); + + MeshData* meshdata = new MeshData(); + + // read mesh data + unsigned int attribSize=0; + if (_binaryReader.read(&attribSize, 4, 1) != 1 || attribSize < 1) + { + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; + } + + for (ssize_t i = 0; i < attribSize; i++) + { + unsigned int vUsage, vSize; + if (_binaryReader.read(&vUsage, 4, 1) != 1 || _binaryReader.read(&vSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: usage or size '%s'.", _path.c_str()); + return false; + } + + MeshVertexAttrib meshVertexAttribute; + meshVertexAttribute.size = vSize; + meshVertexAttribute.attribSizeBytes = vSize * 4; + meshVertexAttribute.type = GL_FLOAT; + meshVertexAttribute.vertexAttrib = vUsage; + + meshdata->attribs.push_back(meshVertexAttribute); + } + + // Read vertex data + if (_binaryReader.read(&meshdata->vertexSizeInFloat, 4, 1) != 1 || meshdata->vertexSizeInFloat == 0) + { + CCLOGINFO("Failed to read meshdata: vertexSizeInFloat '%s'.", _path.c_str()); + return false; + } + + meshdata->vertex.resize(meshdata->vertexSizeInFloat); + if (_binaryReader.read(&meshdata->vertex[0], 4, meshdata->vertexSizeInFloat) != meshdata->vertexSizeInFloat) + { + CCLOGINFO("Failed to read meshdata: vertex element '%s'.", _path.c_str()); + return false; + } + + // read submesh + unsigned int submeshCount; + if (_binaryReader.read(&submeshCount, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: submeshCount '%s'.", _path.c_str()); + return false; + } + + for (unsigned int i = 0; i < submeshCount; ++i) + { + unsigned int nIndexCount; + if (_binaryReader.read(&nIndexCount, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: nIndexCount '%s'.", _path.c_str()); + return false; + } + + std::vector indices; + indices.resize(nIndexCount); + if (_binaryReader.read(&indices[0], 2, nIndexCount) != nIndexCount) + { + CCLOGINFO("Failed to read meshdata: indices '%s'.", _path.c_str()); + return false; + } + + meshdata->subMeshIndices.push_back(indices); + } + + meshdatas.meshDatas.push_back(meshdata); +} bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) { const rapidjson::Value& mesh_data_array = _jsonReader[MESHES]; @@ -448,7 +686,7 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) const rapidjson::Value& indices_val_array = mesh_part[MESHDATA_INDICES]; for (rapidjson::SizeType j = 0; j < indices_val_array.Size(); j++) indexArray.push_back((unsigned short)indices_val_array[j].GetUint()); - + meshData->subMeshIndices.push_back(indexArray); meshData->numIndex=meshData->subMeshIndices.size(); } @@ -458,57 +696,55 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) } bool Bundle3D::loadNodes(NodeDatas& nodedatas) { - if (_isBinary) + if (_version == "0.1" || _version == "1.2" || _version == "0.2") { - // TODO - return false; + SkinData skinData; + loadSkinData("", &skinData); + auto nodeDatas = new NodeData*[skinData.skinBoneNames.size() + skinData.nodeBoneNames.size()]; + int index = 0; + size_t i; + for (i = 0; i < skinData.skinBoneNames.size(); i++) + { + nodeDatas[index] = new NodeData(); + nodeDatas[index]->id = skinData.skinBoneNames[i]; + nodeDatas[index]->transform = skinData.skinBoneOriginMatrices[i]; + index++; + } + for (i = 0; i < skinData.nodeBoneNames.size(); i++) + { + nodeDatas[index] = new NodeData(); + nodeDatas[index]->id = skinData.nodeBoneNames[i]; + nodeDatas[index]->transform = skinData.nodeBoneOriginMatrices[i]; + index++; + } + for (const auto& it : skinData.boneChild) + { + const auto& children = it.second; + auto parent = nodeDatas[it.first]; + for (const auto& child : children) + { + parent->children.push_back(nodeDatas[child]); + } + } + nodedatas.skeleton.push_back(nodeDatas[skinData.rootBoneIndex]); + auto modelnode = new ModelNodeData(); + modelnode->matrialId = ""; + modelnode->subMeshId = ""; + modelnode->id = ""; + modelnode->bones = skinData.skinBoneNames; + modelnode->invBindPose = skinData.inverseBindPoseMatrices; + nodedatas.nodes.push_back(modelnode); } else { - if (_version == "1.2" || _version == "0.2") + if (_isBinary) { - SkinData skinData; - loadSkinData("", &skinData); - auto nodeDatas = new NodeData*[skinData.skinBoneNames.size() + skinData.nodeBoneNames.size()]; - int index = 0; - size_t i; - for (i = 0; i < skinData.skinBoneNames.size(); i++) - { - nodeDatas[index] = new NodeData(); - nodeDatas[index]->id = skinData.skinBoneNames[i]; - nodeDatas[index]->transform = skinData.skinBoneOriginMatrices[i]; - index++; - } - for (i = 0; i < skinData.nodeBoneNames.size(); i++) - { - nodeDatas[index] = new NodeData(); - nodeDatas[index]->id = skinData.nodeBoneNames[i]; - nodeDatas[index]->transform = skinData.nodeBoneOriginMatrices[i]; - index++; - } - for (const auto& it : skinData.boneChild) - { - const auto& children = it.second; - auto parent = nodeDatas[it.first]; - for (const auto& child : children) - { - parent->children.push_back(nodeDatas[child]); - } - } - nodedatas.skeleton.push_back(nodeDatas[skinData.rootBoneIndex]); - auto modelnode = new ModelNodeData(); - modelnode->matrialId = ""; - modelnode->subMeshId = ""; - modelnode->id = ""; - modelnode->bones = skinData.skinBoneNames; - modelnode->invBindPose = skinData.inverseBindPoseMatrices; - nodedatas.nodes.push_back(modelnode); + loadNodesBinary(nodedatas); } else { - return loadNodesJson(nodedatas); + loadNodesJson(nodedatas); } - } return true; } @@ -517,17 +753,28 @@ bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) materialdatas.resetData(); if (_isBinary) { - return loadMaterialsBinary(materialdatas); + if (_version == "0.1") + { + return loadMaterialsBinary_0_1(materialdatas); + } + else if (_version == "0.2") + { + return loadMaterialsBinary_0_2(materialdatas); + } + else if (_version == "0.3") + { + return loadMaterialsBinary(materialdatas); + } } else { if (_version == "1.2") { - return loadMaterialDataJson_0_1(materialdatas); + return loadMaterialDataJson_0_1(materialdatas); } else if (_version == "0.2") { - return loadMaterialDataJson_0_2(materialdatas); + return loadMaterialDataJson_0_2(materialdatas); } else if (_version == "0.3") { @@ -538,7 +785,95 @@ bool Bundle3D::loadMaterials(MaterialDatas& materialdatas) } bool Bundle3D::loadMaterialsBinary(MaterialDatas& materialdatas) { - return true; + if (!seekToFirstType(BUNDLE_TYPE_MATERIAL)) + return false; + unsigned int materialnum = 1; + _binaryReader.read(&materialnum, 4, 1); + for (int i = 0; i < materialnum; i++) + { + NMaterialData materialData; + materialData.id = _binaryReader.readString(); + float data[14]; + _binaryReader.read(&data,sizeof(float), 14); + + unsigned int textruenum = 1; + _binaryReader.read(&textruenum, 4, 1); + for(int i = 0; i < textruenum ; i++ ) + { + NTextureData textureData; + textureData.id = _binaryReader.readString(); + if (textureData.id.empty()) + { + CCLOGINFO("Failed to read Materialdata: texturePath is empty '%s'.", textureID.c_str()); + return false; + } + std::string texturePath = _binaryReader.readString(); + if (texturePath.empty()) + { + CCLOGINFO("Failed to read Materialdata: texturePath is empty '%s'.", _path.c_str()); + return false; + } + + textureData.filename = _modelPath + texturePath; + float uvdata[4]; + _binaryReader.read(&uvdata,sizeof(float), 4); + textureData.type = parseGLTextureType(_binaryReader.readString()); + textureData.wrapS= parseGLType(_binaryReader.readString()); + textureData.wrapT= parseGLType(_binaryReader.readString()); + materialData.textures.push_back(textureData); + } + materialdatas.materials.push_back(materialData); + } + return true; +} +bool Bundle3D::loadMaterialsBinary_0_1(MaterialDatas& materialdatas) +{ + if (!seekToFirstType(BUNDLE_TYPE_MATERIAL)) + return false; + + NMaterialData materialData; + + std::string texturePath = _binaryReader.readString(); + if (texturePath.empty()) + { + CCLOGINFO("Failed to read Materialdata: texturePath is empty '%s'.", _path.c_str()); + return false; + } + + NTextureData textureData; + textureData.filename = _modelPath + texturePath; + textureData.type= NTextureData::Usage::Diffuse; + textureData.id=""; + materialData.textures.push_back(textureData); + materialdatas.materials.push_back(materialData); +} + +bool Bundle3D::loadMaterialsBinary_0_2(MaterialDatas& materialdatas) +{ + if (!seekToFirstType(BUNDLE_TYPE_MATERIAL)) + return false; + + unsigned int materialnum = 1; + _binaryReader.read(&materialnum, 4, 1); + + for (int i = 0; i < materialnum; i++) + { + NMaterialData materialData; + + std::string texturePath = _binaryReader.readString(); + if (texturePath.empty()) + { + CCLOGINFO("Failed to read Materialdata: texturePath is empty '%s'.", _path.c_str()); + return false; + } + + NTextureData textureData; + textureData.filename = _modelPath + texturePath; + textureData.type= NTextureData::Usage::Diffuse; + textureData.id=""; + materialData.textures.push_back(textureData); + materialdatas.materials.push_back(materialData); + } } bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) { @@ -572,21 +907,21 @@ bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) bool Bundle3D::loadJson(const std::string& path) { clear(); - + Data data = FileUtils::getInstance()->getDataFromFile(path); ssize_t size = data.getSize(); - + // json need null-terminated string. _jsonBuffer = new char[size + 1]; memcpy(_jsonBuffer, data.getBytes(), size); _jsonBuffer[size] = '\0'; if (_jsonReader.ParseInsitu<0>(_jsonBuffer).HasParseError()) { - assert(0); - clear(); - return false; + assert(0); + clear(); + return false; } - + const rapidjson::Value& mash_data_array = _jsonReader[VERSION]; _version = mash_data_array.GetString(); return true; @@ -597,11 +932,11 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) const rapidjson::Value& mesh_data_array = _jsonReader[MESH]; MeshData* meshdata= new MeshData(); const rapidjson::Value& mesh_data_val = mesh_data_array[(rapidjson::SizeType)0]; - + const rapidjson::Value& mesh_data_body_array = mesh_data_val[MESHDATA_DEFAULTPART]; - + const rapidjson::Value& mesh_data_body_array_0 = mesh_data_body_array[(rapidjson::SizeType)0]; - + // mesh_vertex_attribute const rapidjson::Value& mesh_vertex_attribute = mesh_data_val[MESHDATA_ATTRIBUTES]; meshdata->attribCount = mesh_vertex_attribute.Size(); @@ -609,24 +944,24 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) for (rapidjson::SizeType i = 0; i < mesh_vertex_attribute.Size(); i++) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - + meshdata->attribs[i].size = mesh_vertex_attribute_val[MESHDATA_SIZE].GetUint(); meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[MESHDATA_TYPE].GetString()); meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[MESHDATA_ATTRIBUTE].GetString()); } - + // vertices meshdata->vertexSizeInFloat = mesh_data_body_array_0[MESHDATA_VERTEXSIZE].GetInt(); meshdata->vertex.resize(meshdata->vertexSizeInFloat); - + const rapidjson::Value& mesh_data_body_vertices = mesh_data_body_array_0[MESHDATA_VERTICES]; for (rapidjson::SizeType i = 0; i < mesh_data_body_vertices.Size(); i++) meshdata->vertex[i] = mesh_data_body_vertices[i].GetDouble(); - + // index_number unsigned int indexnum = mesh_data_body_array_0[MESHDATA_INDEXNUM].GetUint(); - + // indices std::vector indices; indices.resize(indexnum); @@ -634,7 +969,7 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) const rapidjson::Value& indices_val_array = mesh_data_body_array_0[MESHDATA_INDICES]; for (rapidjson::SizeType i = 0; i < indices_val_array.Size(); i++) indices[i] = (unsigned short)indices_val_array[i].GetUint(); - + meshdata->subMeshIndices.push_back(indices); meshdatas.meshDatas.push_back(meshdata); return true; @@ -645,7 +980,7 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) MeshData* meshdata= new MeshData(); const rapidjson::Value& mesh_array = _jsonReader[MESH]; const rapidjson::Value& mesh_array_0 = mesh_array[(rapidjson::SizeType)0]; - + // mesh_vertex_attribute const rapidjson::Value& mesh_vertex_attribute = mesh_array_0[MESHDATA_ATTRIBUTES]; meshdata->attribCount = mesh_vertex_attribute.Size(); @@ -653,42 +988,42 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) for (rapidjson::SizeType i = 0; i < mesh_vertex_attribute.Size(); i++) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - + meshdata->attribs[i].size = mesh_vertex_attribute_val[MESHDATA_SIZE].GetUint(); meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[MESHDATA_TYPE].GetString()); meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[MESHDATA_ATTRIBUTE].GetString()); } - + // vertices const rapidjson::Value& mesh_data_vertex = mesh_array_0[MESHDATA_VERTEX]; const rapidjson::Value& mesh_data_vertex_0 = mesh_data_vertex[(rapidjson::SizeType)0]; - + meshdata->vertexSizeInFloat = mesh_data_vertex_0[MESHDATA_VERTEXSIZE].GetInt(); meshdata->vertex.resize(meshdata->vertexSizeInFloat); - + const rapidjson::Value& mesh_data_body_vertices = mesh_data_vertex_0[MESHDATA_VERTICES]; for (rapidjson::SizeType i = 0; i < mesh_data_body_vertices.Size(); i++) meshdata->vertex[i] = mesh_data_body_vertices[i].GetDouble(); - + // submesh const rapidjson::Value& mesh_submesh_array = mesh_array_0[MESHDATA_SUBMESH]; for (rapidjson::SizeType i = 0; i < mesh_submesh_array.Size(); i++) { const rapidjson::Value& mesh_submesh_val = mesh_submesh_array[i]; //std::string id = mesh_submesh_val[ID].GetString(); - + // index_number unsigned int indexnum = mesh_submesh_val[MESHDATA_INDEXNUM].GetUint(); - + // indices std::vector indices; indices.resize(indexnum); - + const rapidjson::Value& indices_val_array = mesh_submesh_val[MESHDATA_INDICES]; for (rapidjson::SizeType j = 0; j < indices_val_array.Size(); j++) indices[j] = (unsigned short)indices_val_array[j].GetUint(); - + meshdata->subMeshIndices.push_back(indices); } meshdatas.meshDatas.push_back(meshdata); @@ -698,22 +1033,22 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) bool Bundle3D::loadSkinDataJson(SkinData* skindata) { if (!_jsonReader.HasMember(SKINDATA_SKIN )) return false; - + const rapidjson::Value& skin_data_array = _jsonReader[SKINDATA_SKIN ]; - + assert(skin_data_array.IsArray()); const rapidjson::Value& skin_data_array_val_0 = skin_data_array[(rapidjson::SizeType)0]; - + if (!skin_data_array_val_0.HasMember(BONES)) return false; - + const rapidjson::Value& skin_data_bones = skin_data_array_val_0[BONES]; for (rapidjson::SizeType i = 0; i < skin_data_bones.Size(); i++) { const rapidjson::Value& skin_data_bone = skin_data_bones[i]; std::string name = skin_data_bone[NODE].GetString(); skindata->addSkinBoneNames(name); - + Mat4 mat_bind_pos; const rapidjson::Value& bind_pos = skin_data_bone[SKINDATA_BINDSHAPE]; for (rapidjson::SizeType j = 0; j < bind_pos.Size(); j++) @@ -722,10 +1057,10 @@ bool Bundle3D::loadSkinDataJson(SkinData* skindata) } skindata->inverseBindPoseMatrices.push_back(mat_bind_pos); } - + // set root bone infomation const rapidjson::Value& skin_data_1 = skin_data_array[1]; - + // parent and child relationship map skindata->skinBoneOriginMatrices.resize(skindata->skinBoneNames.size()); getChildMap(skindata->boneChild, skindata, skin_data_1); @@ -758,9 +1093,9 @@ bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas) { if (!_jsonReader.HasMember(MATERIALDATA_MATERIAL)) return false; - NMaterialData materialData; + NMaterialData materialData; const rapidjson::Value& material_array = _jsonReader[MATERIALDATA_MATERIAL]; - + for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) { NTextureData textureData; @@ -827,14 +1162,14 @@ bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata) } } } - + return true; } bool Bundle3D::loadBinary(const std::string& path) { clear(); - + // get file data CC_SAFE_DELETE(_binaryBuffer); _binaryBuffer = new Data(); @@ -865,7 +1200,7 @@ bool Bundle3D::loadBinary(const std::string& path) CCLOG("Failed to read version:"); return false; } - + char version[20] = {0}; sprintf(version, "%d.%d", ver[0], ver[1]); _version = version; @@ -968,7 +1303,7 @@ bool Bundle3D::loadMeshDataBinary_0_1(MeshData* meshdata) CCLOGINFO("Failed to read meshdata: nIndexCount '%s'.", _path.c_str()); return false; } - + std::vector indices; indices.resize(nIndexCount); if (_binaryReader.read(&indices[0], 2, nIndexCount) != nIndexCount) @@ -976,7 +1311,7 @@ bool Bundle3D::loadMeshDataBinary_0_1(MeshData* meshdata) CCLOGINFO("Failed to read meshdata: indices '%s'.", _path.c_str()); return false; } - + meshdata->subMeshIndices.push_back(indices); } @@ -987,16 +1322,16 @@ bool Bundle3D::loadMeshDataBinary_0_2(MeshData* meshdata) { if (!seekToFirstType(BUNDLE_TYPE_MESH)) return false; - + meshdata->resetData(); - + // read mesh data if (_binaryReader.read(&meshdata->attribCount, 4, 1) != 1 || meshdata->attribCount < 1) { CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); return false; } - + meshdata->attribs.resize(meshdata->attribCount); for (ssize_t i = 0; i < meshdata->attribCount; i++) { @@ -1006,27 +1341,27 @@ bool Bundle3D::loadMeshDataBinary_0_2(MeshData* meshdata) CCLOGINFO("Failed to read meshdata: usage or size '%s'.", _path.c_str()); return false; } - + meshdata->attribs[i].size = vSize; meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; meshdata->attribs[i].type = GL_FLOAT; meshdata->attribs[i].vertexAttrib = vUsage; } - + // Read vertex data if (_binaryReader.read(&meshdata->vertexSizeInFloat, 4, 1) != 1 || meshdata->vertexSizeInFloat == 0) { CCLOGINFO("Failed to read meshdata: vertexSizeInFloat '%s'.", _path.c_str()); return false; } - + meshdata->vertex.resize(meshdata->vertexSizeInFloat); if (_binaryReader.read(&meshdata->vertex[0], 4, meshdata->vertexSizeInFloat) != meshdata->vertexSizeInFloat) { CCLOGINFO("Failed to read meshdata: vertex element '%s'.", _path.c_str()); return false; } - + // read submesh unsigned int submeshCount; if (_binaryReader.read(&submeshCount, 4, 1) != 1) @@ -1034,7 +1369,7 @@ bool Bundle3D::loadMeshDataBinary_0_2(MeshData* meshdata) CCLOGINFO("Failed to read meshdata: submeshCount '%s'.", _path.c_str()); return false; } - + for (unsigned int i = 0; i < submeshCount; ++i) { unsigned int nIndexCount; @@ -1043,7 +1378,7 @@ bool Bundle3D::loadMeshDataBinary_0_2(MeshData* meshdata) CCLOGINFO("Failed to read meshdata: nIndexCount '%s'.", _path.c_str()); return false; } - + std::vector indices; indices.resize(nIndexCount); if (_binaryReader.read(&indices[0], 2, nIndexCount) != nIndexCount) @@ -1051,10 +1386,10 @@ bool Bundle3D::loadMeshDataBinary_0_2(MeshData* meshdata) CCLOGINFO("Failed to read meshdata: indices '%s'.", _path.c_str()); return false; } - + meshdata->subMeshIndices.push_back(indices); } - + return true; } @@ -1062,9 +1397,9 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) { if (!seekToFirstType(BUNDLE_TYPE_MESHSKIN)) return false; - + std::string boneName = _binaryReader.readString(); - + // transform float bindShape[16]; if (!_binaryReader.readMatrix(bindShape)) @@ -1072,7 +1407,7 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) CCLOGINFO("Failed to read SkinData: bindShape matrix '%s'.", _path.c_str()); return false; } - + // bone count unsigned int boneNum; if (!_binaryReader.read(&boneNum)) @@ -1080,7 +1415,7 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) CCLOGINFO("Failed to read SkinData: boneNum '%s'.", _path.c_str()); return false; } - + // bone names and bind pos float bindpos[16]; for (unsigned int i = 0; i < boneNum; i++) @@ -1094,11 +1429,11 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) } skindata->inverseBindPoseMatrices.push_back(bindpos); } - + skindata->skinBoneOriginMatrices.resize(boneNum); - + boneName = _binaryReader.readString(); - + // bind shape _binaryReader.readMatrix(bindShape); int rootIndex = skindata->getSkinBoneNameIndex(boneName); @@ -1112,10 +1447,10 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) { skindata->skinBoneOriginMatrices[rootIndex] = bindShape; } - + // set root bone index skindata->rootBoneIndex = rootIndex; - + // read parent and child relationship map float transform[16]; unsigned int linkNum; @@ -1125,15 +1460,15 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) std::string id = _binaryReader.readString(); int index = skindata->getSkinBoneNameIndex(id); - + std::string parentid = _binaryReader.readString(); - + if (!_binaryReader.readMatrix(transform)) { CCLOGINFO("Failed to load SkinData: transform '%s'.", _path.c_str()); return false; } - + if(index < 0) { skindata->addNodeBoneNames(id); @@ -1144,16 +1479,16 @@ bool Bundle3D::loadSkinDataBinary(SkinData* skindata) { skindata->skinBoneOriginMatrices[index] = transform; } - + int parentIndex = skindata->getSkinBoneNameIndex(parentid); if(parentIndex < 0) { skindata->addNodeBoneNames(parentid); parentIndex = skindata->getBoneNameIndex(parentid); } - + skindata->boneChild[parentIndex].push_back(index); - + } return true; @@ -1169,7 +1504,7 @@ bool Bundle3D::loadMaterialDataBinary(MaterialData* materialdata) { _binaryReader.read(&materialnum, 4, 1); } - + for (int i = 0; i < materialnum; i++) { std::string texturePath = _binaryReader.readString(); @@ -1178,11 +1513,11 @@ bool Bundle3D::loadMaterialDataBinary(MaterialData* materialdata) CCLOGINFO("Failed to read Materialdata: texturePath is empty '%s'.", _path.c_str()); return false; } - + std::string path = _modelPath + texturePath; materialdata->texturePaths[i] = path; } - + return true; } @@ -1190,8 +1525,16 @@ bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata) { if (!seekToFirstType(BUNDLE_TYPE_ANIMATIONS)) return false; - - _binaryReader.readString(); + unsigned int animNum=0; + if( _version == "0.3") + { + if (!_binaryReader.read(&animNum)) + { + CCLOGINFO("Failed to read AnimationData: animNum '%s'.", _path.c_str()); + return false; + } + } + std::string id = _binaryReader.readString(); if (!_binaryReader.read(&animationdata->_totalTime)) { @@ -1199,14 +1542,13 @@ bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata) return false; } - unsigned int animNum; - if (!_binaryReader.read(&animNum)) + unsigned int nodeAnimationNum; + if (!_binaryReader.read(&nodeAnimationNum)) { CCLOGINFO("Failed to read AnimationData: animNum '%s'.", _path.c_str()); return false; } - - for (unsigned int i = 0; i < animNum; ++i) + for (unsigned int i = 0; i < nodeAnimationNum; ++i) { std::string boneName = _binaryReader.readString(); unsigned int keyframeNum; @@ -1259,83 +1601,21 @@ bool Bundle3D::loadNodesJson(NodeDatas& nodedatas) const rapidjson::Value& nodes = _jsonReader[NODES]; if(!nodes.IsArray()) return false; - loadBoneNamesJson(nodes); - // traverse the nodes again for (rapidjson::SizeType i = 0; i < nodes.Size(); i++) { - _skeleton = false; const rapidjson::Value& jnode = nodes[i]; std::string id = jnode[ID].GetString(); NodeData* nodedata = parseNodesRecursivelyJson(jnode); - //bool isSkeleton; - //isSkeleton = checkIsSkeletonJson(jnode); - - if (_skeleton) + bool isSkeleton=jnode["skeleton"].GetBool(); + if (isSkeleton) nodedatas.skeleton.push_back(nodedata); else nodedatas.nodes.push_back(nodedata); } - return true; } - -void Bundle3D::loadBoneNamesJson(const rapidjson::Value& jnodes) -{ - for (rapidjson::SizeType i = 0; i < jnodes.Size(); i++) - { - parseBoneNameRecursivelyJson(jnodes[i]); - } -} - -void Bundle3D::parseBoneNameRecursivelyJson(const rapidjson::Value& jnode) -{ - std::string id = jnode[ID].GetString(); - if (jnode.HasMember(PARTS)) - { - const rapidjson::Value& parts = jnode[PARTS]; - - for (rapidjson::SizeType i = 0; i < parts.Size(); i++) - { - const rapidjson::Value& part = parts[i]; - - if (part.HasMember(BONES)) - { - const rapidjson::Value& bones = part[BONES]; - - for (rapidjson::SizeType j = 0; j < bones.Size(); j++) - { - const rapidjson::Value& bone = bones[j]; - std::string bonename = bone[NODE].GetString(); - - if (!checkIsBone(bonename)) - { - _bonenames.push_back(bonename); - } - } - } - } - } - - if (jnode.HasMember(CHILDREN)) - { - const rapidjson::Value& children = jnode[CHILDREN]; - - for (rapidjson::SizeType i = 0; i < children.Size(); i++) - { - parseBoneNameRecursivelyJson(children[i]); - } - } -} - -bool Bundle3D::checkIsBone(const std::string& name) -{ - std::list::iterator iter = std::find(_bonenames.begin(), _bonenames.end(), name); - bool ret = (iter != _bonenames.end()) ? true : false; - return ret; -} - NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) { NodeData* nodedata; @@ -1347,10 +1627,6 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) // id nodedata->id = jvalue[ID].GetString(); - // check is skeleton - if (checkIsBone(nodedata->id)) - _skeleton = true; - // transform Mat4 tranform; const rapidjson::Value& jtransform = jvalue[TRANSFORM]; @@ -1430,116 +1706,144 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) bool Bundle3D::loadNodesBinary(NodeDatas& nodedatas) { - if (!seekToFirstType(BUNDLE_TYPE_NODE)) - return false; - - loadBoneNamesBinary(); - if (!seekToFirstType(BUNDLE_TYPE_NODE)) return false; unsigned int nodeSize = 0; if (_binaryReader.read(&nodeSize, 4, 1) != 1) { - CCLOGINFO("Failed to read nodes: size '%s'.", _path.c_str()); + CCASSERT(false, "Failed to read nodes: size '%s'.", _path.c_str()); return false; } // traverse the nodes again for (rapidjson::SizeType i = 0; i < nodeSize; i++) { - std::string id = _binaryReader.readString(); - NodeData* nodedata = parseNodesRecursivelyBinary(); + bool skeleton = false; + NodeData* nodedata = parseNodesRecursivelyBinary(skeleton); - if (_skeleton) + if (skeleton) nodedatas.skeleton.push_back(nodedata); else nodedatas.nodes.push_back(nodedata); } return true; } - -void Bundle3D::loadBoneNamesBinary() -{ - unsigned int nodeSize=0; - if (_binaryReader.read(&nodeSize, 4, 1) != 1) - { - CCLOGINFO("Failed to read nodes: size '%s'.", _path.c_str()); - return; - } - - for (unsigned int i = 0; i < nodeSize; i++) - { - parseBoneNameRecursivelyBinary(); - } -} - -void Bundle3D::parseBoneNameRecursivelyBinary() +NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) { + // id std::string id = _binaryReader.readString(); - - Mat4 nodeMat; - if (!_binaryReader.readMatrix(nodeMat.m)) - return; - - // read pass - unsigned int partsSize=0; + if (_binaryReader.read(&skeleton, 1, 1) != 1) + { + CCASSERT(false, "Failed to read is sleleton"); + return false; + } + // transform + Mat4 transform; + if (!_binaryReader.readMatrix(transform.m)) + { + CCASSERT(false,"Failed to read transform matrix"); + return false; + } + // parts + unsigned int partsSize = 0; if (_binaryReader.read(&partsSize, 4, 1) != 1) { - CCASSERT("Failed to read part size: '%s'.", _path.c_str()); - return; + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; } + NodeData* nodedata; if (partsSize > 0) { - for (unsigned i = 0; i < partsSize; i++) + nodedata = new ModelNodeData(); + nodedata->id = id; + nodedata->transform = transform; + ModelNodeData* modelnodedata = dynamic_cast(nodedata); + + for (rapidjson::SizeType i = 0; i < partsSize; i++) { - unsigned int boneSize=0; - if (_binaryReader.read(&boneSize, 4, 1) != 1) + modelnodedata->subMeshId = _binaryReader.readString(); + modelnodedata->matrialId = _binaryReader.readString(); + + if (modelnodedata->subMeshId == "" || modelnodedata->matrialId == "") { - CCASSERT("Failed to read bone: size '%s'.", _path.c_str()); - return; + std::string err = "Node " + nodedata->id + " part is missing meshPartId or materialId"; + CCASSERT(false, err.c_str()); + return nullptr; } - if (boneSize > 0) + // read bone + unsigned int bonesSize = 0; + if (_binaryReader.read(&bonesSize, 4, 1) != 1) { - for (unsigned j = 0; j < boneSize; j++) + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; + } + + if (bonesSize > 0) + { + for (rapidjson::SizeType j = 0; j < bonesSize; j++) { - std::string bonename = _binaryReader.readString(); + std::string name = _binaryReader.readString(); + modelnodedata->bones.push_back(name); - Mat4 boneMat; - if (!_binaryReader.readMatrix(boneMat.m)) - return; - - if (!checkIsBone(bonename)) + Mat4 invbindpos; + if (!_binaryReader.readMatrix(invbindpos.m)) { - _bonenames.push_back(bonename); + return false; + } + + modelnodedata->invBindPose.push_back(invbindpos); + } + } + unsigned int uvMapping = 0; + if (_binaryReader.read(&uvMapping, 4, 1) != 1) + { + CCLOGINFO("Failed to read nodedata: uvMapping '%s'.", _path.c_str()); + return false; + } + for( int i = 0 ;i < uvMapping ; i++ ) + { + unsigned int textureIndexSize=0; + if (_binaryReader.read(&textureIndexSize, 4, 1) != 1) + { + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; + } + for(int j =0; j < textureIndexSize ; j++ ) + { + unsigned int index=0; + if (_binaryReader.read(&index, 4, 1) != 1) + { + return false; } } } } } + else + { + nodedata = new NodeData(); + nodedata->id = id; + nodedata->transform = transform; + } - // read children unsigned int childrenSize = 0; if (_binaryReader.read(&childrenSize, 4, 1) != 1) { - CCASSERT("Failed to read children size: '%s'.", _path.c_str()); - return; + CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); + return false; } - if (childrenSize > 0) { - for (rapidjson::SizeType i = 0; i < childrenSize; i++) + for (rapidjson::SizeType i = 0; i < childrenSize; i++) { - parseBoneNameRecursivelyBinary(); + NodeData* tempdata = parseNodesRecursivelyBinary(skeleton); + nodedata->children.push_back(tempdata); } } -} - -NodeData* Bundle3D::parseNodesRecursivelyBinary() -{ - return nullptr; + return nodedata; } GLenum Bundle3D::parseGLType(const std::string& str) @@ -1610,7 +1914,7 @@ NTextureData::Usage Bundle3D::parseGLTextureType(const std::string& str) } else if (str == "NORMAL") { - return NTextureData::Usage::Normal; + return NTextureData::Usage::Normal; } else if (str == "REFLECTION") { @@ -1618,7 +1922,7 @@ NTextureData::Usage Bundle3D::parseGLTextureType(const std::string& str) } else if (str == "SHININESS") { - return NTextureData::Usage::Shininess; + return NTextureData::Usage::Shininess; } else if (str == "SPECULAR") { @@ -1626,7 +1930,7 @@ NTextureData::Usage Bundle3D::parseGLTextureType(const std::string& str) } else if (str == "TRANSPARENCY") { - return NTextureData::Usage::Transparency; + return NTextureData::Usage::Transparency; } else { @@ -1695,22 +1999,21 @@ Reference* Bundle3D::seekToFirstType(unsigned int type) } Bundle3D::Bundle3D() -:_isBinary(false), -_modelPath(""), -_path(""), -_version(""), -_jsonBuffer(nullptr), -_binaryBuffer(nullptr), -_referenceCount(0), -_references(nullptr), -_skeleton(false) + :_isBinary(false), + _modelPath(""), + _path(""), + _version(""), + _jsonBuffer(nullptr), + _binaryBuffer(nullptr), + _referenceCount(0), + _references(nullptr) { } Bundle3D::~Bundle3D() { clear(); - + } NS_CC_END diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index 2fc9bf02e5..66c6b5232c 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -113,10 +113,14 @@ protected: bool loadMeshDataJson_0_1(MeshDatas& meshdatas); bool loadMeshDataJson_0_2(MeshDatas& meshdatas); bool loadMeshDatasBinary(MeshDatas& meshdatas); + bool loadMeshDatasBinary_0_1(MeshDatas& meshdatas); + bool loadMeshDatasBinary_0_2(MeshDatas& meshdatas); bool loadMaterialsJson(MaterialDatas& materialdatas); bool loadMaterialDataJson_0_1(MaterialDatas& materialdatas); bool loadMaterialDataJson_0_2(MaterialDatas& materialdatas); bool loadMaterialsBinary(MaterialDatas& materialdatas); + bool loadMaterialsBinary_0_1(MaterialDatas& materialdatas); + bool loadMaterialsBinary_0_2(MaterialDatas& materialdatas); bool loadMeshDataJson(MeshData* meshdata){return true;} bool loadMeshDataJson_0_1(MeshData* meshdata){return true;} bool loadMeshDataJson_0_2(MeshData* meshdata){return true;} @@ -163,17 +167,13 @@ protected: * load nodes of json */ bool loadNodesJson(NodeDatas& nodedatas); - void loadBoneNamesJson(const rapidjson::Value& jnodes); - void parseBoneNameRecursivelyJson(const rapidjson::Value& jnode); NodeData* parseNodesRecursivelyJson(const rapidjson::Value& jvalue); /** * load nodes of binary */ bool loadNodesBinary(NodeDatas& nodedatas); - void loadBoneNamesBinary(); - void parseBoneNameRecursivelyBinary(); - NodeData* parseNodesRecursivelyBinary(); + NodeData* parseNodesRecursivelyBinary(bool& skeleton); /** * get define data type @@ -228,11 +228,7 @@ protected: BundleReader _binaryReader; unsigned int _referenceCount; Reference* _references; - bool _isBinary; - - std::list _bonenames; - bool _skeleton; }; NS_CC_END From 2f600f8af448c684e9be40aa1b39d9b96e7acc0e Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 17:52:27 +0800 Subject: [PATCH 33/67] fix bundle mac --- cocos/3d/CCBundle3D.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 470f37116f..c2d4649062 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -1714,7 +1714,7 @@ bool Bundle3D::loadNodesBinary(NodeDatas& nodedatas) unsigned int nodeSize = 0; if (_binaryReader.read(&nodeSize, 4, 1) != 1) { - CCASSERT(false, "Failed to read nodes: size '%s'.", _path.c_str()); + CCASSERT(false, "Failed to read nodes"); return false; } @@ -1738,21 +1738,21 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) if (_binaryReader.read(&skeleton, 1, 1) != 1) { CCASSERT(false, "Failed to read is sleleton"); - return false; + return nullptr; } // transform Mat4 transform; if (!_binaryReader.readMatrix(transform.m)) { CCASSERT(false,"Failed to read transform matrix"); - return false; + return nullptr; } // parts unsigned int partsSize = 0; if (_binaryReader.read(&partsSize, 4, 1) != 1) { CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); - return false; + return nullptr; } NodeData* nodedata; @@ -1780,7 +1780,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) if (_binaryReader.read(&bonesSize, 4, 1) != 1) { CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); - return false; + return nullptr; } if (bonesSize > 0) @@ -1793,7 +1793,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) Mat4 invbindpos; if (!_binaryReader.readMatrix(invbindpos.m)) { - return false; + return nullptr; } modelnodedata->invBindPose.push_back(invbindpos); @@ -1803,7 +1803,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) if (_binaryReader.read(&uvMapping, 4, 1) != 1) { CCLOGINFO("Failed to read nodedata: uvMapping '%s'.", _path.c_str()); - return false; + return nullptr; } for( int i = 0 ;i < uvMapping ; i++ ) { @@ -1811,14 +1811,14 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) if (_binaryReader.read(&textureIndexSize, 4, 1) != 1) { CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); - return false; + return nullptr; } for(int j =0; j < textureIndexSize ; j++ ) { unsigned int index=0; if (_binaryReader.read(&index, 4, 1) != 1) { - return false; + return nullptr; } } } @@ -1835,7 +1835,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) if (_binaryReader.read(&childrenSize, 4, 1) != 1) { CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); - return false; + return nullptr; } if (childrenSize > 0) { From b9c28dd8d7b0dba769964b4ea9b057ec6c85e5e3 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 17:57:14 +0800 Subject: [PATCH 34/67] return true --- cocos/3d/CCBundle3D.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index c2d4649062..c458b81ad9 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -848,6 +848,7 @@ bool Bundle3D::loadMaterialsBinary_0_1(MaterialDatas& materialdatas) textureData.id=""; materialData.textures.push_back(textureData); materialdatas.materials.push_back(materialData); + return true; } bool Bundle3D::loadMaterialsBinary_0_2(MaterialDatas& materialdatas) @@ -876,6 +877,7 @@ bool Bundle3D::loadMaterialsBinary_0_2(MaterialDatas& materialdatas) materialData.textures.push_back(textureData); materialdatas.materials.push_back(materialData); } + return true; } bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) { From 3fd122391c5efeb6d40ca327cecbb2342f91f9d4 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 18:01:57 +0800 Subject: [PATCH 35/67] reset sprite3dtest --- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index a9b76173ce..2410ffb068 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -46,7 +46,6 @@ static int sceneIdx = -1; static std::function createFunctions[] = { - CL(Sprite3DMirrorTest), CL(Sprite3DBasicTest), CL(Sprite3DHitTest), #if (CC_TARGET_PLATFORM != CC_PLATFORM_WP8) && (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) @@ -1272,17 +1271,17 @@ std::string Sprite3DMirrorTest::subtitle() const void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) { - std::string fileName = "Sprite3DTest/orc.c3t"; + std::string fileName = "Sprite3DTest/orc.c3b"; auto sprite = Sprite3D::create(fileName); - sprite->setScale(6); + sprite->setScale(5); sprite->setRotation3D(Vec3(0,180,0)); addChild(sprite); sprite->setPosition( Vec2( p.x - 80, p.y) ); -// //test attach -// auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); -// sprite->getAttachNode("Bip001 R Hand")->addChild(sp); -// + //test attach + auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); + sprite->getAttachNode("Bip001 R Hand")->addChild(sp); + auto animation = Animation3D::create(fileName); if (animation) { @@ -1293,25 +1292,25 @@ void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) _sprite = sprite; _hasWeapon = true; -// //create mirror Sprite3D -// sprite = Sprite3D::create(fileName); -// sprite->setScale(5); -// sprite->setScaleX(-5); -// sprite->setCullFace(GL_FRONT); -// sprite->setRotation3D(Vec3(0,180,0)); -// addChild(sprite); -// sprite->setPosition( Vec2( p.x + 80, p.y) ); -// -// //test attach -// sp = Sprite3D::create("Sprite3DTest/axe.c3b"); -// sprite->getAttachNode("Bip001 R Hand")->addChild(sp); -// -// animation = Animation3D::create(fileName); -// if (animation) -// { -// auto animate = Animate3D::create(animation); -// -// sprite->runAction(RepeatForever::create(animate)); -// } -// _mirrorSprite = sprite; + //create mirror Sprite3D + sprite = Sprite3D::create(fileName); + sprite->setScale(5); + sprite->setScaleX(-5); + sprite->setCullFace(GL_FRONT); + sprite->setRotation3D(Vec3(0,180,0)); + addChild(sprite); + sprite->setPosition( Vec2( p.x + 80, p.y) ); + + //test attach + sp = Sprite3D::create("Sprite3DTest/axe.c3b"); + sprite->getAttachNode("Bip001 R Hand")->addChild(sp); + + animation = Animation3D::create(fileName); + if (animation) + { + auto animate = Animate3D::create(animation); + + sprite->runAction(RepeatForever::create(animate)); + } + _mirrorSprite = sprite; } From 7311d5139ba3ce8743086742b2dcd6b52ff0ea04 Mon Sep 17 00:00:00 2001 From: lvlong Date: Mon, 18 Aug 2014 18:02:58 +0800 Subject: [PATCH 36/67] add VERTEX_ATTRIB_TEX_COORD1 --- cocos/renderer/CCGLProgram.cpp | 2 ++ cocos/renderer/CCGLProgram.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/cocos/renderer/CCGLProgram.cpp b/cocos/renderer/CCGLProgram.cpp index 7533d991be..8a6d786731 100644 --- a/cocos/renderer/CCGLProgram.cpp +++ b/cocos/renderer/CCGLProgram.cpp @@ -94,6 +94,7 @@ const char* GLProgram::UNIFORM_NAME_ALPHA_TEST_VALUE = "CC_alpha_value"; const char* GLProgram::ATTRIBUTE_NAME_COLOR = "a_color"; const char* GLProgram::ATTRIBUTE_NAME_POSITION = "a_position"; const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD = "a_texCoord"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD1 = "a_texCoord1"; const char* GLProgram::ATTRIBUTE_NAME_NORMAL = "a_normal"; const char* GLProgram::ATTRIBUTE_NAME_BLEND_WEIGHT = "a_blendWeight"; const char* GLProgram::ATTRIBUTE_NAME_BLEND_INDEX = "a_blendIndex"; @@ -281,6 +282,7 @@ void GLProgram::bindPredefinedVertexAttribs() {GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION}, {GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORD}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD1, GLProgram::VERTEX_ATTRIB_TEX_COORD1}, {GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::VERTEX_ATTRIB_NORMAL}, }; diff --git a/cocos/renderer/CCGLProgram.h b/cocos/renderer/CCGLProgram.h index 5ccd78f738..683a1e9157 100644 --- a/cocos/renderer/CCGLProgram.h +++ b/cocos/renderer/CCGLProgram.h @@ -83,7 +83,9 @@ public: { VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_COLOR, + VERTEX_ATTRIB_TEX_COORD, + VERTEX_ATTRIB_TEX_COORD1, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_BLEND_INDEX, @@ -152,6 +154,7 @@ public: static const char* ATTRIBUTE_NAME_COLOR; static const char* ATTRIBUTE_NAME_POSITION; static const char* ATTRIBUTE_NAME_TEX_COORD; + static const char* ATTRIBUTE_NAME_TEX_COORD1; static const char* ATTRIBUTE_NAME_NORMAL; static const char* ATTRIBUTE_NAME_BLEND_WEIGHT; static const char* ATTRIBUTE_NAME_BLEND_INDEX; From d6ed1af1f766efecac59f2102fa54b0c74eb7771 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 18:34:18 +0800 Subject: [PATCH 37/67] compute submesh aabb error --- cocos/3d/CCMesh.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 309c2d2ab9..364f92aca9 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -252,9 +252,9 @@ void Mesh::buildSubMeshes() //calculate aabb for sub mesh AABB aabb; int stride = _renderdata._vertexsizeBytes / sizeof(float); - for(size_t i = 0; i < it.size(); i++) + for(const auto& index : it) { - Vec3 point = Vec3(_renderdata._vertexs[it[i * stride] ], _renderdata._vertexs[ it[i * stride + 1] ], _renderdata._vertexs[it[i * stride + 2] ]); + Vec3 point = Vec3(_renderdata._vertexs[index * stride ], _renderdata._vertexs[ index * stride + 1], _renderdata._vertexs[index * stride + 2 ]); aabb.updateMinMax(&point, 1); } subMesh->_aabb = aabb; From d5df1f3ab29b731129c5fc742028131dc14ea42e Mon Sep 17 00:00:00 2001 From: yangxiao Date: Mon, 18 Aug 2014 18:56:01 +0800 Subject: [PATCH 38/67] forget return true --- cocos/3d/CCBundle3D.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index c458b81ad9..d47d00ce21 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -641,6 +641,8 @@ bool Bundle3D::loadMeshDatasBinary_0_2(MeshDatas& meshdatas) } meshdatas.meshDatas.push_back(meshdata); + + return true; } bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) { From 9c25139895842af0a4fe5d58e232a6c4b2f4163a Mon Sep 17 00:00:00 2001 From: lvlong Date: Mon, 18 Aug 2014 20:22:18 +0800 Subject: [PATCH 39/67] animation & animations --- cocos/3d/CCBundle3D.cpp | 16 +++++++++++++--- cocos/3d/CCSprite3D.cpp | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index c458b81ad9..9c767355dd 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -77,7 +77,7 @@ static const char* MATERIALS = "materials"; static const char* ANIMATIONS = "animations"; static const char* TRANSFORM = "transform"; static const char* OLDTRANSFORM = "tansform"; -static const char* ANIMATION = "animations"; +static const char* ANIMATION = "animation"; static const char* MATERIALDATA_MATERIAL = "material"; static const char* MATERIALDATA_MATERIALS = "materials"; @@ -1117,9 +1117,15 @@ bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas) bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata) { - if (!_jsonReader.HasMember(ANIMATION)) return false; + std::string anim = ""; + if (_version == "1.2" || _version == "0.2") + anim = ANIMATION; + else + anim = ANIMATIONS; - const rapidjson::Value& animation_data_array = _jsonReader[ANIMATION]; + if (!_jsonReader.HasMember(anim.c_str())) return false; + + const rapidjson::Value& animation_data_array = _jsonReader[anim.c_str()]; if (animation_data_array.Size()==0) return false; const rapidjson::Value& animation_data_array_val_0 = animation_data_array[(rapidjson::SizeType)0]; @@ -1956,6 +1962,10 @@ unsigned int Bundle3D::parseGLProgramAttribute(const std::string& str) { return GLProgram::VERTEX_ATTRIB_TEX_COORD; } + else if (str == "VERTEX_ATTRIB_TEX_COORD1") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD1; + } else if (str == "VERTEX_ATTRIB_NORMAL") { return GLProgram::VERTEX_ATTRIB_NORMAL; diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 6fbba908b2..9e848db2ad 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -46,7 +46,7 @@ NS_CC_BEGIN -std::string s_attributeNames[] = {GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::ATTRIBUTE_NAME_BLEND_WEIGHT, GLProgram::ATTRIBUTE_NAME_BLEND_INDEX}; +std::string s_attributeNames[] = {GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::ATTRIBUTE_NAME_TEX_COORD1, GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::ATTRIBUTE_NAME_BLEND_WEIGHT, GLProgram::ATTRIBUTE_NAME_BLEND_INDEX}; Sprite3D* Sprite3D::create(const std::string &modelPath) { From 43bc54b13418a1508974ed9f351e97649dc3154c Mon Sep 17 00:00:00 2001 From: lvlong Date: Mon, 18 Aug 2014 20:28:59 +0800 Subject: [PATCH 40/67] delete empty line --- cocos/renderer/CCGLProgram.h | 1 - 1 file changed, 1 deletion(-) diff --git a/cocos/renderer/CCGLProgram.h b/cocos/renderer/CCGLProgram.h index 683a1e9157..973c2d8d6d 100644 --- a/cocos/renderer/CCGLProgram.h +++ b/cocos/renderer/CCGLProgram.h @@ -83,7 +83,6 @@ public: { VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_COLOR, - VERTEX_ATTRIB_TEX_COORD, VERTEX_ATTRIB_TEX_COORD1, VERTEX_ATTRIB_NORMAL, From f2729c7ef2d952003896357372a3474a618395b6 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Tue, 19 Aug 2014 11:56:09 +0800 Subject: [PATCH 41/67] cache work --- cocos/3d/CCMeshSkin.cpp | 50 --------------- cocos/3d/CCMeshSkin.h | 28 --------- cocos/3d/CCSkeleton3D.cpp | 52 ---------------- cocos/3d/CCSkeleton3D.h | 28 --------- cocos/3d/CCSprite3D.cpp | 126 +++++++++++++++++++++++++++++++++----- cocos/3d/CCSprite3D.h | 43 +++++++++++++ 6 files changed, 154 insertions(+), 173 deletions(-) diff --git a/cocos/3d/CCMeshSkin.cpp b/cocos/3d/CCMeshSkin.cpp index 8c0db04e0d..bf2ef106ad 100644 --- a/cocos/3d/CCMeshSkin.cpp +++ b/cocos/3d/CCMeshSkin.cpp @@ -149,54 +149,4 @@ Bone3D* MeshSkin::getRootBone() const return root; } -//////////////////////////////////////////////////////////////////////// -MeshSkinDataCache* MeshSkinDataCache::_cacheInstance = nullptr; - -MeshSkinDataCache* MeshSkinDataCache::getInstance() -{ - if (_cacheInstance == nullptr) - _cacheInstance = new MeshSkinDataCache(); - return _cacheInstance; -} -void MeshSkinDataCache::destroyInstance() -{ - if (_cacheInstance) - { - CC_SAFE_DELETE(_cacheInstance); - } -} - -const SkinData* MeshSkinDataCache::getMeshSkinData(const std::string& key) const -{ - auto it = _skinDatas.find(key); - if (it != _skinDatas.end()) - return &it->second; - - return nullptr; -} - -bool MeshSkinDataCache::addMeshSkinData(const std::string& key, const SkinData& skin) -{ - if (_skinDatas.find(key) != _skinDatas.end()) - return false; // already have this key - - _skinDatas[key] = skin; - - return true; -} - -void MeshSkinDataCache::removeAllMeshSkinData() -{ - _skinDatas.clear(); -} - -MeshSkinDataCache::MeshSkinDataCache() -{ - -} -MeshSkinDataCache::~MeshSkinDataCache() -{ - -} - NS_CC_END diff --git a/cocos/3d/CCMeshSkin.h b/cocos/3d/CCMeshSkin.h index 69f62f5ed3..a48e5c0e62 100644 --- a/cocos/3d/CCMeshSkin.h +++ b/cocos/3d/CCMeshSkin.h @@ -100,34 +100,6 @@ protected: Vec4* _matrixPalette; }; -/** - * MeshSkinData Cache - */ -class MeshSkinDataCache -{ -public: - /**get & destroy*/ - static MeshSkinDataCache* getInstance(); - static void destroyInstance(); - - /**get mesh skin data from cache*/ - const SkinData* getMeshSkinData(const std::string& key) const; - - /**add mesh skin data to cache*/ - bool addMeshSkinData(const std::string& key, const SkinData& skinData); - - /**remove all mesh skin data*/ - void removeAllMeshSkinData(); - -protected: - MeshSkinDataCache(); - ~MeshSkinDataCache(); - - static MeshSkinDataCache* _cacheInstance; // instance - - std::unordered_map _skinDatas; //cached skindatas -}; - NS_CC_END #endif // __CCSKIN_H__ diff --git a/cocos/3d/CCSkeleton3D.cpp b/cocos/3d/CCSkeleton3D.cpp index eb1d785814..76a40eb7a0 100644 --- a/cocos/3d/CCSkeleton3D.cpp +++ b/cocos/3d/CCSkeleton3D.cpp @@ -318,8 +318,6 @@ int Skeleton3D::getBoneIndex(Bone3D* bone) const //refresh bone world matrix void Skeleton3D::updateBoneMatrix() { - //_rootBone->setWorldMatDirty(true); - //_rootBone->updateWorldMat(); for (const auto& it : _rootBones) { it->setWorldMatDirty(true); it->updateWorldMat(); @@ -350,54 +348,4 @@ Bone3D* Skeleton3D::createBone3D(const NodeData& nodedata) return bone; } -//////////////////////////////////////////////////////////////////////// -Skeleton3DDataCache* Skeleton3DDataCache::_cacheInstance = nullptr; - -Skeleton3DDataCache* Skeleton3DDataCache::getInstance() -{ - if (_cacheInstance == nullptr) - _cacheInstance = new Skeleton3DDataCache(); - return _cacheInstance; -} -void Skeleton3DDataCache::destroyInstance() -{ - if (_cacheInstance) - { - CC_SAFE_DELETE(_cacheInstance); - } -} - -const Skeleton3DData* Skeleton3DDataCache::getSkeletonData(const std::string& key) const -{ - auto it = _skeletonDatas.find(key); - if (it != _skeletonDatas.end()) - return &it->second; - - return nullptr; -} - -bool Skeleton3DDataCache::addSkeletonData(const std::string& key, const Skeleton3DData& data) -{ - if (_skeletonDatas.find(key) != _skeletonDatas.end()) - return false; // already have this key - - _skeletonDatas[key] = data; - - return true; -} - -void Skeleton3DDataCache::removeAllSkeletonData() -{ - _skeletonDatas.clear(); -} - -Skeleton3DDataCache::Skeleton3DDataCache() -{ - -} -Skeleton3DDataCache::~Skeleton3DDataCache() -{ - -} - NS_CC_END diff --git a/cocos/3d/CCSkeleton3D.h b/cocos/3d/CCSkeleton3D.h index 90fff8030a..c647e3fbee 100644 --- a/cocos/3d/CCSkeleton3D.h +++ b/cocos/3d/CCSkeleton3D.h @@ -228,34 +228,6 @@ protected: Vector _rootBones; }; -/** - * Skeleton3DData Cache - */ -class Skeleton3DDataCache -{ -public: - /**get & destroy*/ - static Skeleton3DDataCache* getInstance(); - static void destroyInstance(); - - /**get mesh skin data from cache*/ - const Skeleton3DData* getSkeletonData(const std::string& key) const; - - /**add skeleton data to cache*/ - bool addSkeletonData(const std::string& key, const Skeleton3DData& skeletonData); - - /**remove all skeleton data*/ - void removeAllSkeletonData(); - -CC_CONSTRUCTOR_ACCESS: - Skeleton3DDataCache(); - ~Skeleton3DDataCache(); - - static Skeleton3DDataCache* _cacheInstance; // instance - - std::unordered_map _skeletonDatas; //cached skeleton datas -}; - NS_CC_END #endif // __CCSKELETON3D_H__ diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 6fbba908b2..31c3a698a2 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -75,7 +75,26 @@ Sprite3D* Sprite3D::create(const std::string &modelPath, const std::string &text bool Sprite3D::loadFromCache(const std::string& path) { - //FIX ME, TODO + auto spritedata = Sprite3DCache::getInstance()->getSpriteData(path); + if (spritedata) + { + for (auto it : spritedata->meshes) { + _meshes.pushBack(it); + } + _skeleton = Skeleton3D::create(spritedata->nodedatas->skeleton); + CC_SAFE_RETAIN(_skeleton); + + for(const auto& it : spritedata->nodedatas->nodes) + { + if(it) + { + createNode(it, this, *(spritedata->materialdatas), spritedata->nodedatas->nodes.size() == 1); + } + } + + genGLProgramState(); + return true; + } return false; } @@ -84,25 +103,29 @@ bool Sprite3D::loadFromCache(const std::string& path) bool Sprite3D::loadFromObj(const std::string& path) { std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); - std::string key = fullPath + "#"; MeshDatas meshdatas; - MaterialDatas materialdatas; - NodeDatas nodeDatas; - bool ret = Bundle3D::loadObj(meshdatas, materialdatas, nodeDatas, fullPath); - if (ret) + MaterialDatas* materialdatas = new MaterialDatas(); + NodeDatas* nodeDatas = new NodeDatas(); + bool ret = Bundle3D::loadObj(meshdatas, *materialdatas, *nodeDatas, fullPath); + if (ret && initFrom(*nodeDatas, meshdatas, *materialdatas)) { - return initFrom(nodeDatas, meshdatas, materialdatas); + //add to cache + auto data = new Sprite3DCache::Sprite3DData(); + data->materialdatas = materialdatas; + data->nodedatas = nodeDatas; + data->meshes = _meshes; + Sprite3DCache::getInstance()->addSprite3DData(path, data); + return true; } -// //add mesh to cache -// MeshCache::getInstance()->addMesh(key, _mesh); + delete materialdatas; + delete nodeDatas; return false; } bool Sprite3D::loadFromC3x(const std::string& path) { std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path); - std::string key = fullPath + "#"; //load from .c3b or .c3t auto bundle = Bundle3D::getInstance(); @@ -110,15 +133,25 @@ bool Sprite3D::loadFromC3x(const std::string& path) return false; MeshDatas meshdatas; - MaterialDatas materialdatas; - NodeDatas nodeDatas; + MaterialDatas* materialdatas = new MaterialDatas(); + NodeDatas* nodeDatas = new NodeDatas(); if (bundle->loadMeshDatas(meshdatas) - && bundle->loadMaterials(materialdatas) - && bundle->loadNodes(nodeDatas)) + && bundle->loadMaterials(*materialdatas) + && bundle->loadNodes(*nodeDatas) + && initFrom(*nodeDatas, meshdatas, *materialdatas)) { - return initFrom(nodeDatas, meshdatas, materialdatas); + //add to cache + auto data = new Sprite3DCache::Sprite3DData(); + data->materialdatas = materialdatas; + data->nodedatas = nodeDatas; + data->meshes = _meshes; + Sprite3DCache::getInstance()->addSprite3DData(path, data); + return true; } + delete materialdatas; + delete nodeDatas; + return false; } @@ -543,4 +576,67 @@ MeshSkin* Sprite3D::getSkin() const return nullptr; } +/////////////////////////////////////////////////////////////////////////////////// +Sprite3DCache* Sprite3DCache::_cacheInstance = nullptr; +Sprite3DCache* Sprite3DCache::getInstance() +{ + if (_cacheInstance == nullptr) + _cacheInstance = new Sprite3DCache(); + return _cacheInstance; +} +void Sprite3DCache::destroyInstance() +{ + if (_cacheInstance) + { + delete _cacheInstance; + _cacheInstance = nullptr; + } +} + +Sprite3DCache::Sprite3DData* Sprite3DCache::getSpriteData(const std::string& key) const +{ + auto it = _spriteDatas.find(key); + if (it != _spriteDatas.end()) + return it->second; + return nullptr; +} + +bool Sprite3DCache::addSprite3DData(const std::string& key, Sprite3DCache::Sprite3DData* spritedata) +{ + auto it = _spriteDatas.find(key); + if (it == _spriteDatas.end()) + { + _spriteDatas[key] = spritedata; + return true; + } + return false; +} + +void Sprite3DCache::removeSprite3DData(const std::string& key) +{ + auto it = _spriteDatas.find(key); + if (it != _spriteDatas.end()) + { + delete it->second; + } + _spriteDatas.erase(it); +} + +void Sprite3DCache::removeAllSprite3DData() +{ + for (auto& it : _spriteDatas) { + delete it.second; + } + _spriteDatas.clear(); +} + +Sprite3DCache::Sprite3DCache() +{ + +} +Sprite3DCache::~Sprite3DCache() +{ + removeAllSprite3DData(); +} + NS_CC_END diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index fa3d4841a2..98005cfa22 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -35,6 +35,7 @@ #include "renderer/CCMeshCommand.h" #include "3d/CCAABB.h" #include "3d/CCBundle3DData.h" +#include "3d/CCMesh.h" NS_CC_BEGIN @@ -160,6 +161,48 @@ protected: bool _aabbDirty; }; +/////////////////////////////////////////////////////// +class Sprite3DCache +{ +public: + struct Sprite3DData + { + Vector meshes; + NodeDatas* nodedatas; + MaterialDatas* materialdatas; + ~Sprite3DData() + { + if (nodedatas) + delete nodedatas; + if (materialdatas) + delete materialdatas; + meshes.clear(); + } + }; + + /**get & destroy*/ + static Sprite3DCache* getInstance(); + static void destroyInstance(); + + Sprite3DData* getSpriteData(const std::string& key) const; + + bool addSprite3DData(const std::string& key, Sprite3DData* spritedata); + + void removeSprite3DData(const std::string& key); + + void removeAllSprite3DData(); + + CC_CONSTRUCTOR_ACCESS: + Sprite3DCache(); + ~Sprite3DCache(); + +protected: + + + static Sprite3DCache* _cacheInstance; + std::unordered_map _spriteDatas; //cached sprite datas +}; + extern std::string CC_DLL s_attributeNames[];//attribute names array NS_CC_END From 5cf30a363ca2b757b4b2f93035638434307a04b0 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Tue, 19 Aug 2014 13:54:06 +0800 Subject: [PATCH 42/67] remove unused code --- cocos/3d/CCBundle3D.cpp | 8 -------- cocos/3d/CCBundle3D.h | 6 ------ cocos/3d/CCBundle3DData.h | 40 --------------------------------------- 3 files changed, 54 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 7822df415f..3be70d7db8 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -367,14 +367,6 @@ bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animati } } -bool Bundle3D::loadSkeletonData(const std::string& id, Skeleton3DData* skeletondata) -{ - skeletondata->resetData(); - - //TODO - return true; -} - //since 3.3, to support reskin bool Bundle3D::loadMeshDatas(MeshDatas& meshdatas) { diff --git a/cocos/3d/CCBundle3D.h b/cocos/3d/CCBundle3D.h index 5712eaba1c..467015f272 100644 --- a/cocos/3d/CCBundle3D.h +++ b/cocos/3d/CCBundle3D.h @@ -91,12 +91,6 @@ public: */ virtual bool loadAnimationData(const std::string& id, Animation3DData* animationdata); - /** - * load skeleton data from bundle - * - */ - virtual bool loadSkeletonData(const std::string& id, Skeleton3DData* skeletondata); - //since 3.3, to support reskin virtual bool loadMeshDatas(MeshDatas& meshdatas); //since 3.3, to support reskin diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index d179a7bb6b..eb622febe7 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -243,46 +243,6 @@ struct SkinData }; -/**skin data*/ -struct Skeleton3DData -{ - std::vector boneNames; //bone names - std::vector inverseBindPoseMatrices; //bind pose of skin bone - std::vector boneOriginMatrices; // original bone transform - - //bone child info, both skinbone and node bone - std::map > boneChild;//key parent, value child - int rootBoneIndex; - - void resetData() - { - boneNames.clear(); - inverseBindPoseMatrices.clear(); - boneOriginMatrices.clear(); - boneChild.clear(); - rootBoneIndex = -1; - } - - void addBoneNames(const std::string& name) - { - auto it = std::find(boneNames.begin(), boneNames.end(), name); - if (it == boneNames.end()) - boneNames.push_back(name); - } - - int getBoneNameIndex(const std::string& name)const - { - int i = 0; - for (auto iter : boneNames) - { - if ((iter) == name) - return i; - i++; - } - return -1; - } -}; - /**material data, */ struct MaterialData { From 9d3bab3810d8d515a882e52ba262d7c7d1fafbaf Mon Sep 17 00:00:00 2001 From: liuliang Date: Tue, 19 Aug 2014 14:03:41 +0800 Subject: [PATCH 43/67] Modification is compatible with the old model --- cocos/3d/CCBundle3D.cpp | 94 ++++++- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 229 ++++++++++++++++++ .../Classes/Sprite3DTest/Sprite3DTest.h | 27 +++ 3 files changed, 338 insertions(+), 12 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 7822df415f..dd96aeadc7 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -111,7 +111,7 @@ NS_CC_BEGIN // set origin matrices std::string parent_name = val[ID].GetString(); - int parent_name_index = skinData->getSkinBoneNameIndex(parent_name); + unsigned int parent_name_index = skinData->getSkinBoneNameIndex(parent_name); if (parent_name_index < 0) { skinData->addNodeBoneNames(parent_name); @@ -424,26 +424,30 @@ bool Bundle3D::loadMeshDatasBinary(MeshDatas& meshdatas) for(int i = 0; i < meshSize ; i++ ) { MeshData* meshData = new MeshData(); + unsigned int attribSize=0; // read mesh data - if (_binaryReader.read(&meshData->attribCount, 4, 1) != 1 || meshData->attribCount < 1) + if (_binaryReader.read(&attribSize, 4, 1) != 1 || attribSize < 1) { CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); return false; } + meshData->attribCount = attribSize; meshData->attribs.resize(meshData->attribCount); - for (ssize_t i = 0; i < meshData->attribCount; i++) + for (ssize_t j = 0; j < meshData->attribCount; j++) { - unsigned int vUsage, vSize; - if (_binaryReader.read(&vUsage, 4, 1) != 1 || _binaryReader.read(&vSize, 4, 1) != 1) + std::string attribute=""; + unsigned int vSize; + if (_binaryReader.read(&vSize, 4, 1) != 1) { CCLOGINFO("Failed to read meshdata: usage or size '%s'.", _path.c_str()); return false; } - - meshData->attribs[i].size = vSize; - meshData->attribs[i].attribSizeBytes = meshData->attribs[i].size * 4; - meshData->attribs[i].type = GL_FLOAT; - meshData->attribs[i].vertexAttrib = vUsage; + std::string type = _binaryReader.readString(); + attribute=_binaryReader.readString(); + meshData->attribs[j].size = vSize; + meshData->attribs[j].attribSizeBytes = meshData->attribs[j].size * 4; + meshData->attribs[j].type = parseGLType(type); + meshData->attribs[j].vertexAttrib = parseGLProgramAttribute(attribute); } unsigned int vertexSizeInFloat = 0; // Read vertex data @@ -464,7 +468,7 @@ bool Bundle3D::loadMeshDatasBinary(MeshDatas& meshdatas) unsigned int meshPartCount = 1; _binaryReader.read(&meshPartCount, 4, 1); - for (unsigned int i = 0; i < meshPartCount; ++i) + for (unsigned int k = 0; k < meshPartCount; ++k) { std::vector indexArray; std:: string meshPartid = _binaryReader.readString(); @@ -504,7 +508,20 @@ bool Bundle3D::loadMeshDatasBinary_0_1(MeshDatas& meshdatas) CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); return false; } + enum + { + VERTEX_ATTRIB_POSITION, + VERTEX_ATTRIB_COLOR, + VERTEX_ATTRIB_TEX_COORD, + VERTEX_ATTRIB_NORMAL, + VERTEX_ATTRIB_BLEND_WEIGHT, + VERTEX_ATTRIB_BLEND_INDEX, + VERTEX_ATTRIB_MAX, + + // backward compatibility + VERTEX_ATTRIB_TEX_COORDS = VERTEX_ATTRIB_TEX_COORD, + }; for (ssize_t i = 0; i < attribSize; i++) { unsigned int vUsage, vSize; @@ -518,6 +535,26 @@ bool Bundle3D::loadMeshDatasBinary_0_1(MeshDatas& meshdatas) meshVertexAttribute.size = vSize; meshVertexAttribute.attribSizeBytes = vSize * 4; meshVertexAttribute.type = GL_FLOAT; + if(vUsage == VERTEX_ATTRIB_NORMAL) + { + vUsage= GLProgram::VERTEX_ATTRIB_NORMAL; + } + else if(vUsage == VERTEX_ATTRIB_BLEND_WEIGHT) + { + vUsage= GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT; + } + else if(vUsage == VERTEX_ATTRIB_BLEND_INDEX) + { + vUsage= GLProgram::VERTEX_ATTRIB_BLEND_INDEX; + } + else if(vUsage == VERTEX_ATTRIB_POSITION) + { + vUsage= GLProgram::VERTEX_ATTRIB_POSITION; + } + else if(vUsage == VERTEX_ATTRIB_TEX_COORD) + { + vUsage= GLProgram::VERTEX_ATTRIB_TEX_COORD; + } meshVertexAttribute.vertexAttrib = vUsage; meshdata->attribs.push_back(meshVertexAttribute); @@ -579,7 +616,20 @@ bool Bundle3D::loadMeshDatasBinary_0_2(MeshDatas& meshdatas) CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); return false; } + enum + { + VERTEX_ATTRIB_POSITION, + VERTEX_ATTRIB_COLOR, + VERTEX_ATTRIB_TEX_COORD, + VERTEX_ATTRIB_NORMAL, + VERTEX_ATTRIB_BLEND_WEIGHT, + VERTEX_ATTRIB_BLEND_INDEX, + VERTEX_ATTRIB_MAX, + + // backward compatibility + VERTEX_ATTRIB_TEX_COORDS = VERTEX_ATTRIB_TEX_COORD, + }; for (ssize_t i = 0; i < attribSize; i++) { unsigned int vUsage, vSize; @@ -593,6 +643,26 @@ bool Bundle3D::loadMeshDatasBinary_0_2(MeshDatas& meshdatas) meshVertexAttribute.size = vSize; meshVertexAttribute.attribSizeBytes = vSize * 4; meshVertexAttribute.type = GL_FLOAT; + if(vUsage == VERTEX_ATTRIB_NORMAL) + { + vUsage= GLProgram::VERTEX_ATTRIB_NORMAL; + } + else if(vUsage == VERTEX_ATTRIB_BLEND_WEIGHT) + { + vUsage= GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT; + } + else if(vUsage == VERTEX_ATTRIB_BLEND_INDEX) + { + vUsage= GLProgram::VERTEX_ATTRIB_BLEND_INDEX; + } + else if(vUsage == VERTEX_ATTRIB_POSITION) + { + vUsage= GLProgram::VERTEX_ATTRIB_POSITION; + } + else if(vUsage == VERTEX_ATTRIB_TEX_COORD) + { + vUsage= GLProgram::VERTEX_ATTRIB_TEX_COORD; + } meshVertexAttribute.vertexAttrib = vUsage; meshdata->attribs.push_back(meshVertexAttribute); @@ -802,7 +872,7 @@ bool Bundle3D::loadMaterialsBinary(MaterialDatas& materialdatas) unsigned int textruenum = 1; _binaryReader.read(&textruenum, 4, 1); - for(int i = 0; i < textruenum ; i++ ) + for(int j = 0; j < textruenum ; j++ ) { NTextureData textureData; textureData.id = _binaryReader.readString(); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 2410ffb068..c4537a75db 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -58,6 +58,7 @@ static std::function createFunctions[] = #endif CL(Animate3DTest), CL(AttachmentTest), + CL(ChangeClothTest), CL(Sprite3DWithOBBPerfromanceTest), CL(Sprite3DMirrorTest) }; @@ -997,7 +998,235 @@ void AttachmentTest::onTouchesEnded(const std::vector& touches, Event* e } _hasWeapon = !_hasWeapon; } +ChangeClothTest::ChangeClothTest() +: _hasWeapon(false) +, _sprite(nullptr) +{ + _girl_Xiashen[0]= "Girl_Xiashen_01"; + _girl_Xiashen[1]= "Girl_Xiashen_02"; + _girl_Shangshen[0] = "Girl_Shangshen_01"; + _girl_Shangshen[1] = "Girl_Shangshen_02"; + _girl_Xie[0] = "Girl_Xie_01"; + _girl_Xie[1] = "Girl_Xie_02"; + _girl_Toufa[0]= "Girl_Toufa_01"; + _girl_Toufa[1]= "Girl_Toufa_02"; + _useShangshenId = 0; + _useXiashenId = 0; + _useXieId =0; + _useToufaId = 0; + auto s = Director::getInstance()->getWinSize(); + addNewSpriteWithCoords( Vec2(s.width/2, s.height/2) ); + + auto listener = EventListenerTouchAllAtOnce::create(); + listener->onTouchesEnded = CC_CALLBACK_2(ChangeClothTest::onTouchesEnded, this); + _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); + auto item1 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/hair_normal.png", "Sprite3DTest/ChangeClothUI/hair_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeHair,this) ); + auto item2 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/glasses_normal.png", "Sprite3DTest/ChangeClothUI/glasses_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeGlasses,this) ); + auto item3 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/coat_normal.png", "Sprite3DTest/ChangeClothUI/coat_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeUpBody,this) ); + auto item4 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/trousers_normal.png", "Sprite3DTest/ChangeClothUI/trousers_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeBottomBody,this) ); + auto item5 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/shoe_normal.png", "Sprite3DTest/ChangeClothUI/shoe_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeShoot,this) ); + item1->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height ) ); + item2->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *2 ) ); + item3->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*3 ) ); + item4->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *4 ) ); + item5->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *5 ) ); + auto pMenu1 = CCMenu::create(item1,item2,item3,item4,item5,NULL); + pMenu1->setPosition(Vec2(0,0)); + this->addChild(pMenu1, 10); + +} +void ChangeClothTest::menuCallback_changeHair(Ref* sender) +{ + _useToufaId++; + if(_useToufaId > 1 ) + { + _useToufaId = 0; + } + if(_useToufaId >= 0 && _sprite) + { + for(int i = 0; i < 2; i++ ) + { + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Toufa[i]); + if(subMesh) + { + if(i == _useToufaId ) + { + subMesh->setVisible(true); + } + else + { + subMesh->setVisible(false); + } + } + } + } +} +void ChangeClothTest::menuCallback_changeGlasses(Ref* sender) +{ + SubMeshState* subMesh = _sprite->getSubMeshStateByName("Girl_Yanjing_01"); + if(subMesh) + { + if(subMesh->isVisible()) + { + subMesh->setVisible(false); + } + else + { + subMesh->setVisible(true); + } + } +} +void ChangeClothTest::menuCallback_changeUpBody(Ref* sender) +{ + _useShangshenId++; + if(_useShangshenId > 1 ) + { + _useShangshenId = 0; + } + if(_useShangshenId >= 0 && _sprite) + { + for(int i = 0; i < 2; i++ ) + { + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Shangshen[i]); + if(subMesh) + { + if(i == _useShangshenId ) + { + subMesh->setVisible(true); + } + else + { + subMesh->setVisible(false); + } + } + } + } +} +void ChangeClothTest::menuCallback_changeBottomBody(Ref* sender) +{ + _useXiashenId++; + if(_useXiashenId > 1 ) + { + _useXiashenId = 0; + } + if(_useXiashenId >= 0 && _sprite) + { + for(int i = 0; i < 2; i++ ) + { + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Xiashen[i]); + if(subMesh) + { + if(i == _useXiashenId ) + { + subMesh->setVisible(true); + } + else + { + subMesh->setVisible(false); + } + } + } + } +} +void ChangeClothTest::menuCallback_changeShoot(Ref* sender) +{ + _useXieId++; + if(_useXieId > 1 ) + { + _useXieId = 0; + } + if(_useXieId >= 0 && _sprite) + { + for(int i = 0; i < 2; i++ ) + { + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Xie[i]); + if(subMesh) + { + if(i == _useXieId ) + { + subMesh->setVisible(true); + } + else + { + subMesh->setVisible(false); + } + } + } + } + +} +std::string ChangeClothTest::title() const +{ + return "Testing Sprite3D ChangeCloth"; +} +std::string ChangeClothTest::subtitle() const +{ + return ""; +} +void ChangeClothTest::addNewSpriteWithCoords(Vec2 p) +{ + std::string fileName = "Sprite3DTest/GirlTest.c3b"; + auto sprite = Sprite3D::create(fileName); + sprite->setScale(4); + sprite->setRotation3D(Vec3(0,0,0)); + SubMeshState* girl_Xiashen_01 = sprite->getSubMeshStateByName(_girl_Xiashen[1]); + if(girl_Xiashen_01) + { + girl_Xiashen_01->setVisible(false); + } + SubMeshState* girl_Xie_01 = sprite->getSubMeshStateByName(_girl_Xie[1]); + if(girl_Xie_01) + { + girl_Xie_01->setVisible(false); + } + SubMeshState* girl_Toufa_01 = sprite->getSubMeshStateByName(_girl_Toufa[1]); + if(girl_Toufa_01) + { + girl_Toufa_01->setVisible(false); + } + SubMeshState* girl_Shangshen_01 = sprite->getSubMeshStateByName( _girl_Shangshen[1]); + if(girl_Shangshen_01) + { + girl_Shangshen_01->setVisible(false); + } + addChild(sprite); + sprite->setPosition( Vec2( p.x, p.y-60) ); + auto animation = Animation3D::create(fileName); + if (animation) + { + auto animate = Animate3D::create(animation); + + sprite->runAction(RepeatForever::create(animate)); + } + //test attach + /*auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); + sprite->getAttachNode("Bip001 R Hand")->addChild(sp); + + auto animation = Animation3D::create(fileName); + if (animation) + { + auto animate = Animate3D::create(animation); + + sprite->runAction(RepeatForever::create(animate)); + }*/ + _sprite = sprite; + _hasWeapon = true; +} + +void ChangeClothTest::onTouchesEnded(const std::vector& touches, Event* event) +{ + /* if (_hasWeapon) + { + _sprite->removeAllAttachNode(); + } + else + { + auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); + _sprite->getAttachNode("Bip001 R Hand")->addChild(sp); + } + _hasWeapon = !_hasWeapon;*/ +} Sprite3DWithOBBPerfromanceTest::Sprite3DWithOBBPerfromanceTest() { auto listener = EventListenerTouchAllAtOnce::create(); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h index 175c57f793..ff18310d2b 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h @@ -246,6 +246,33 @@ protected: cocos2d::Sprite3D* _sprite; }; +class ChangeClothTest : public Sprite3DTestDemo +{ +public: + CREATE_FUNC(ChangeClothTest); + ChangeClothTest(); + virtual std::string title() const override; + virtual std::string subtitle() const override; + void onTouchesEnded(const std::vector& touches, Event* event); + void addNewSpriteWithCoords(Vec2 p); + // void menuCallback_changeCap(Ref* sender); + void menuCallback_changeHair(Ref* sender); + void menuCallback_changeGlasses(Ref* sender); + void menuCallback_changeUpBody(Ref* sender); + void menuCallback_changeBottomBody(Ref* sender); + void menuCallback_changeShoot(Ref* sender); +protected: + bool _hasWeapon; + std::string _girl_Xiashen[2]; + int _useXiashenId; + std::string _girl_Shangshen[2]; + int _useShangshenId; + std::string _girl_Xie[2]; + int _useXieId; + std::string _girl_Toufa[2]; + int _useToufaId; + cocos2d::Sprite3D* _sprite; +}; class Sprite3DWithOBBPerfromanceTest : public Sprite3DTestDemo { public: From 06dfaf9db59e9fdaaa434b05aeba93f67e0d146f Mon Sep 17 00:00:00 2001 From: liuliang Date: Tue, 19 Aug 2014 14:21:48 +0800 Subject: [PATCH 44/67] Modify change interface --- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index c4537a75db..aae9a03454 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1020,16 +1020,22 @@ ChangeClothTest::ChangeClothTest() auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesEnded = CC_CALLBACK_2(ChangeClothTest::onTouchesEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); - auto item1 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/hair_normal.png", "Sprite3DTest/ChangeClothUI/hair_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeHair,this) ); - auto item2 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/glasses_normal.png", "Sprite3DTest/ChangeClothUI/glasses_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeGlasses,this) ); - auto item3 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/coat_normal.png", "Sprite3DTest/ChangeClothUI/coat_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeUpBody,this) ); - auto item4 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/trousers_normal.png", "Sprite3DTest/ChangeClothUI/trousers_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeBottomBody,this) ); - auto item5 = CCMenuItemImage::create("Sprite3DTest/ChangeClothUI/shoe_normal.png", "Sprite3DTest/ChangeClothUI/shoe_selected.png", CC_CALLBACK_1(ChangeClothTest::menuCallback_changeShoot,this) ); - item1->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height ) ); - item2->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *2 ) ); - item3->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*3 ) ); - item4->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *4 ) ); - item5->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *5 ) ); + TTFConfig ttfConfig("fonts/arial.ttf", 20); + auto label1 = Label::createWithTTF(ttfConfig,"Hair"); + auto item1 = MenuItemLabel::create(label1,CC_CALLBACK_1(ChangeClothTest::menuCallback_changeHair,this) ); + auto label2 = Label::createWithTTF(ttfConfig,"Glasses"); + auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(ChangeClothTest::menuCallback_changeGlasses,this) ); + auto label3 = Label::createWithTTF(ttfConfig,"UpBody"); + auto item3 = MenuItemLabel::create(label3,CC_CALLBACK_1(ChangeClothTest::menuCallback_changeUpBody,this) ); + auto label4 = Label::createWithTTF(ttfConfig,"Pants"); + auto item4 = MenuItemLabel::create(label4, CC_CALLBACK_1(ChangeClothTest::menuCallback_changeBottomBody,this) ); + auto label5 = Label::createWithTTF(ttfConfig,"Shoes"); + auto item5 = MenuItemLabel::create(label5,CC_CALLBACK_1(ChangeClothTest::menuCallback_changeShoot,this) ); + item1->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*4 ) ); + item2->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *5 ) ); + item3->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*6 ) ); + item4->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *7 ) ); + item5->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *8 ) ); auto pMenu1 = CCMenu::create(item1,item2,item3,item4,item5,NULL); pMenu1->setPosition(Vec2(0,0)); this->addChild(pMenu1, 10); From 94be97f72457b5ea84a721deea74d3fc3a942c7c Mon Sep 17 00:00:00 2001 From: liuliang Date: Tue, 19 Aug 2014 14:30:27 +0800 Subject: [PATCH 45/67] Modify change interface --- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 96 +++++++++---------- .../Classes/Sprite3DTest/Sprite3DTest.h | 16 ++-- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index aae9a03454..40bcdc8da2 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1002,18 +1002,18 @@ ChangeClothTest::ChangeClothTest() : _hasWeapon(false) , _sprite(nullptr) { - _girl_Xiashen[0]= "Girl_Xiashen_01"; - _girl_Xiashen[1]= "Girl_Xiashen_02"; - _girl_Shangshen[0] = "Girl_Shangshen_01"; - _girl_Shangshen[1] = "Girl_Shangshen_02"; - _girl_Xie[0] = "Girl_Xie_01"; - _girl_Xie[1] = "Girl_Xie_02"; - _girl_Toufa[0]= "Girl_Toufa_01"; - _girl_Toufa[1]= "Girl_Toufa_02"; - _useShangshenId = 0; - _useXiashenId = 0; - _useXieId =0; - _useToufaId = 0; + _girlPants[0]= "Girl_Xiashen_01"; + _girlPants[1]= "Girl_Xiashen_02"; + _girlUpBody[0] = "Girl_Shangshen_01"; + _girlUpBody[1] = "Girl_Shangshen_02"; + _girlShoes[0] = "Girl_Xie_01"; + _girlShoes[1] = "Girl_Xie_02"; + _girlHair[0]= "Girl_Toufa_01"; + _girlHair[1]= "Girl_Toufa_02"; + _usePantsId = 0; + _useUpBodyId = 0; + _useShoesId =0; + _useHairId = 0; auto s = Director::getInstance()->getWinSize(); addNewSpriteWithCoords( Vec2(s.width/2, s.height/2) ); @@ -1043,19 +1043,19 @@ ChangeClothTest::ChangeClothTest() } void ChangeClothTest::menuCallback_changeHair(Ref* sender) { - _useToufaId++; - if(_useToufaId > 1 ) + _useHairId++; + if(_useHairId > 1 ) { - _useToufaId = 0; + _useHairId = 0; } - if(_useToufaId >= 0 && _sprite) + if(_useHairId >= 0 && _sprite) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Toufa[i]); + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlHair[i]); if(subMesh) { - if(i == _useToufaId ) + if(i == _useHairId ) { subMesh->setVisible(true); } @@ -1084,19 +1084,19 @@ void ChangeClothTest::menuCallback_changeGlasses(Ref* sender) } void ChangeClothTest::menuCallback_changeUpBody(Ref* sender) { - _useShangshenId++; - if(_useShangshenId > 1 ) + _useUpBodyId++; + if(_useUpBodyId > 1 ) { - _useShangshenId = 0; + _useUpBodyId = 0; } - if(_useShangshenId >= 0 && _sprite) + if(_useUpBodyId >= 0 && _sprite) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Shangshen[i]); + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlUpBody[i]); if(subMesh) { - if(i == _useShangshenId ) + if(i == _useUpBodyId ) { subMesh->setVisible(true); } @@ -1110,19 +1110,19 @@ void ChangeClothTest::menuCallback_changeUpBody(Ref* sender) } void ChangeClothTest::menuCallback_changeBottomBody(Ref* sender) { - _useXiashenId++; - if(_useXiashenId > 1 ) + _usePantsId++; + if(_usePantsId > 1 ) { - _useXiashenId = 0; + _usePantsId = 0; } - if(_useXiashenId >= 0 && _sprite) + if(_usePantsId >= 0 && _sprite) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Xiashen[i]); + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlPants[i]); if(subMesh) { - if(i == _useXiashenId ) + if(i == _usePantsId ) { subMesh->setVisible(true); } @@ -1136,19 +1136,19 @@ void ChangeClothTest::menuCallback_changeBottomBody(Ref* sender) } void ChangeClothTest::menuCallback_changeShoot(Ref* sender) { - _useXieId++; - if(_useXieId > 1 ) + _useShoesId++; + if(_useShoesId > 1 ) { - _useXieId = 0; + _useShoesId = 0; } - if(_useXieId >= 0 && _sprite) + if(_useShoesId >= 0 && _sprite) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girl_Xie[i]); + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlShoes[i]); if(subMesh) { - if(i == _useXieId ) + if(i == _useShoesId ) { subMesh->setVisible(true); } @@ -1176,25 +1176,25 @@ void ChangeClothTest::addNewSpriteWithCoords(Vec2 p) auto sprite = Sprite3D::create(fileName); sprite->setScale(4); sprite->setRotation3D(Vec3(0,0,0)); - SubMeshState* girl_Xiashen_01 = sprite->getSubMeshStateByName(_girl_Xiashen[1]); - if(girl_Xiashen_01) + SubMeshState* girlPants = sprite->getSubMeshStateByName(_girlPants[1]); + if(girlPants) { - girl_Xiashen_01->setVisible(false); + girlPants->setVisible(false); } - SubMeshState* girl_Xie_01 = sprite->getSubMeshStateByName(_girl_Xie[1]); - if(girl_Xie_01) + SubMeshState* girlShoes = sprite->getSubMeshStateByName(_girlShoes[1]); + if(girlShoes) { - girl_Xie_01->setVisible(false); + girlShoes->setVisible(false); } - SubMeshState* girl_Toufa_01 = sprite->getSubMeshStateByName(_girl_Toufa[1]); - if(girl_Toufa_01) + SubMeshState* girlHair = sprite->getSubMeshStateByName(_girlHair[1]); + if(girlHair) { - girl_Toufa_01->setVisible(false); + girlHair->setVisible(false); } - SubMeshState* girl_Shangshen_01 = sprite->getSubMeshStateByName( _girl_Shangshen[1]); - if(girl_Shangshen_01) + SubMeshState* girlUpBody = sprite->getSubMeshStateByName( _girlUpBody[1]); + if(girlUpBody) { - girl_Shangshen_01->setVisible(false); + girlUpBody->setVisible(false); } addChild(sprite); sprite->setPosition( Vec2( p.x, p.y-60) ); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h index ff18310d2b..adda6e1cd6 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h @@ -263,14 +263,14 @@ public: void menuCallback_changeShoot(Ref* sender); protected: bool _hasWeapon; - std::string _girl_Xiashen[2]; - int _useXiashenId; - std::string _girl_Shangshen[2]; - int _useShangshenId; - std::string _girl_Xie[2]; - int _useXieId; - std::string _girl_Toufa[2]; - int _useToufaId; + std::string _girlPants[2]; + int _usePantsId; + std::string _girlUpBody[2]; + int _useUpBodyId; + std::string _girlShoes[2]; + int _useShoesId; + std::string _girlHair[2]; + int _useHairId; cocos2d::Sprite3D* _sprite; }; class Sprite3DWithOBBPerfromanceTest : public Sprite3DTestDemo From 54423efe9f49c800be4fa8acbd215fb35fe4afbf Mon Sep 17 00:00:00 2001 From: yangxiao Date: Tue, 19 Aug 2014 15:25:00 +0800 Subject: [PATCH 46/67] fix reskin --- cocos/3d/CCSprite3D.cpp | 3 + .../Classes/Sprite3DTest/Sprite3DTest.cpp | 98 +++++++------------ .../Classes/Sprite3DTest/Sprite3DTest.h | 20 ++-- 3 files changed, 50 insertions(+), 71 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index a82c36b342..d576848f8e 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -470,7 +470,10 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) int i = 0; for (auto& submeshstate : _subMeshStates) { if (!submeshstate->isVisible()) + { + i++; continue; + } auto& meshCommand = _meshCommands[i++]; diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 98c9c51924..14dff39b25 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -59,7 +59,7 @@ static std::function createFunctions[] = #endif CL(Animate3DTest), CL(AttachmentTest), - CL(ChangeClothTest), + CL(Sprite3DReskinTest), CL(Sprite3DWithOBBPerfromanceTest), CL(Sprite3DMirrorTest) }; @@ -999,39 +999,26 @@ void AttachmentTest::onTouchesEnded(const std::vector& touches, Event* e } _hasWeapon = !_hasWeapon; } -ChangeClothTest::ChangeClothTest() -: _hasWeapon(false) -, _sprite(nullptr) +Sprite3DReskinTest::Sprite3DReskinTest() +: _sprite(nullptr) { - _girlPants[0]= "Girl_Xiashen_01"; - _girlPants[1]= "Girl_Xiashen_02"; - _girlUpBody[0] = "Girl_Shangshen_01"; - _girlUpBody[1] = "Girl_Shangshen_02"; - _girlShoes[0] = "Girl_Xie_01"; - _girlShoes[1] = "Girl_Xie_02"; - _girlHair[0]= "Girl_Toufa_01"; - _girlHair[1]= "Girl_Toufa_02"; - _usePantsId = 0; - _useUpBodyId = 0; - _useShoesId =0; - _useHairId = 0; auto s = Director::getInstance()->getWinSize(); addNewSpriteWithCoords( Vec2(s.width/2, s.height/2) ); auto listener = EventListenerTouchAllAtOnce::create(); - listener->onTouchesEnded = CC_CALLBACK_2(ChangeClothTest::onTouchesEnded, this); + listener->onTouchesEnded = CC_CALLBACK_2(Sprite3DReskinTest::onTouchesEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); TTFConfig ttfConfig("fonts/arial.ttf", 20); auto label1 = Label::createWithTTF(ttfConfig,"Hair"); - auto item1 = MenuItemLabel::create(label1,CC_CALLBACK_1(ChangeClothTest::menuCallback_changeHair,this) ); + auto item1 = MenuItemLabel::create(label1,CC_CALLBACK_1(Sprite3DReskinTest::menuCallback_switchHair,this) ); auto label2 = Label::createWithTTF(ttfConfig,"Glasses"); - auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(ChangeClothTest::menuCallback_changeGlasses,this) ); - auto label3 = Label::createWithTTF(ttfConfig,"UpBody"); - auto item3 = MenuItemLabel::create(label3,CC_CALLBACK_1(ChangeClothTest::menuCallback_changeUpBody,this) ); + auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(Sprite3DReskinTest::menuCallback_switchGlasses,this) ); + auto label3 = Label::createWithTTF(ttfConfig,"Coat"); + auto item3 = MenuItemLabel::create(label3,CC_CALLBACK_1(Sprite3DReskinTest::menuCallback_switchCoat,this) ); auto label4 = Label::createWithTTF(ttfConfig,"Pants"); - auto item4 = MenuItemLabel::create(label4, CC_CALLBACK_1(ChangeClothTest::menuCallback_changeBottomBody,this) ); + auto item4 = MenuItemLabel::create(label4, CC_CALLBACK_1(Sprite3DReskinTest::menuCallback_switchPants,this) ); auto label5 = Label::createWithTTF(ttfConfig,"Shoes"); - auto item5 = MenuItemLabel::create(label5,CC_CALLBACK_1(ChangeClothTest::menuCallback_changeShoot,this) ); + auto item5 = MenuItemLabel::create(label5,CC_CALLBACK_1(Sprite3DReskinTest::menuCallback_switchShoes,this) ); item1->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*4 ) ); item2->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height *5 ) ); item3->setPosition( Vec2(VisibleRect::left().x+50, VisibleRect::bottom().y+item1->getContentSize().height*6 ) ); @@ -1042,7 +1029,7 @@ ChangeClothTest::ChangeClothTest() this->addChild(pMenu1, 10); } -void ChangeClothTest::menuCallback_changeHair(Ref* sender) +void Sprite3DReskinTest::menuCallback_switchHair(Ref* sender) { _useHairId++; if(_useHairId > 1 ) @@ -1068,7 +1055,7 @@ void ChangeClothTest::menuCallback_changeHair(Ref* sender) } } } -void ChangeClothTest::menuCallback_changeGlasses(Ref* sender) +void Sprite3DReskinTest::menuCallback_switchGlasses(Ref* sender) { SubMeshState* subMesh = _sprite->getSubMeshStateByName("Girl_Yanjing_01"); if(subMesh) @@ -1083,7 +1070,7 @@ void ChangeClothTest::menuCallback_changeGlasses(Ref* sender) } } } -void ChangeClothTest::menuCallback_changeUpBody(Ref* sender) +void Sprite3DReskinTest::menuCallback_switchCoat(Ref* sender) { _useUpBodyId++; if(_useUpBodyId > 1 ) @@ -1094,7 +1081,7 @@ void ChangeClothTest::menuCallback_changeUpBody(Ref* sender) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlUpBody[i]); + SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlUpperBody[i]); if(subMesh) { if(i == _useUpBodyId ) @@ -1109,7 +1096,7 @@ void ChangeClothTest::menuCallback_changeUpBody(Ref* sender) } } } -void ChangeClothTest::menuCallback_changeBottomBody(Ref* sender) +void Sprite3DReskinTest::menuCallback_switchPants(Ref* sender) { _usePantsId++; if(_usePantsId > 1 ) @@ -1135,7 +1122,7 @@ void ChangeClothTest::menuCallback_changeBottomBody(Ref* sender) } } } -void ChangeClothTest::menuCallback_changeShoot(Ref* sender) +void Sprite3DReskinTest::menuCallback_switchShoes(Ref* sender) { _useShoesId++; if(_useShoesId > 1 ) @@ -1162,37 +1149,50 @@ void ChangeClothTest::menuCallback_changeShoot(Ref* sender) } } -std::string ChangeClothTest::title() const +std::string Sprite3DReskinTest::title() const { - return "Testing Sprite3D ChangeCloth"; + return "Testing Sprite3D Reskin"; } -std::string ChangeClothTest::subtitle() const +std::string Sprite3DReskinTest::subtitle() const { return ""; } -void ChangeClothTest::addNewSpriteWithCoords(Vec2 p) +void Sprite3DReskinTest::addNewSpriteWithCoords(Vec2 p) { + _girlPants[0]= "Girl_Xiashen_01"; + _girlPants[1]= "Girl_Xiashen_02"; + _girlUpperBody[0] = "Girl_Shangshen_01"; + _girlUpperBody[1] = "Girl_Shangshen_02"; + _girlShoes[0] = "Girl_Xie_01"; + _girlShoes[1] = "Girl_Xie_02"; + _girlHair[0]= "Girl_Toufa_01"; + _girlHair[1]= "Girl_Toufa_02"; + _usePantsId = 0; + _useUpBodyId = 0; + _useShoesId =0; + _useHairId = 0; + std::string fileName = "Sprite3DTest/GirlTest.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(4); sprite->setRotation3D(Vec3(0,0,0)); - SubMeshState* girlPants = sprite->getSubMeshStateByName(_girlPants[1]); + auto girlPants = sprite->getSubMeshStateByName(_girlPants[1]); if(girlPants) { girlPants->setVisible(false); } - SubMeshState* girlShoes = sprite->getSubMeshStateByName(_girlShoes[1]); + auto girlShoes = sprite->getSubMeshStateByName(_girlShoes[1]); if(girlShoes) { girlShoes->setVisible(false); } - SubMeshState* girlHair = sprite->getSubMeshStateByName(_girlHair[1]); + auto girlHair = sprite->getSubMeshStateByName(_girlHair[1]); if(girlHair) { girlHair->setVisible(false); } - SubMeshState* girlUpBody = sprite->getSubMeshStateByName( _girlUpBody[1]); + auto girlUpBody = sprite->getSubMeshStateByName( _girlUpperBody[1]); if(girlUpBody) { girlUpBody->setVisible(false); @@ -1206,33 +1206,11 @@ void ChangeClothTest::addNewSpriteWithCoords(Vec2 p) sprite->runAction(RepeatForever::create(animate)); } - //test attach - /*auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); - sprite->getAttachNode("Bip001 R Hand")->addChild(sp); - - auto animation = Animation3D::create(fileName); - if (animation) - { - auto animate = Animate3D::create(animation); - - sprite->runAction(RepeatForever::create(animate)); - }*/ _sprite = sprite; - _hasWeapon = true; } -void ChangeClothTest::onTouchesEnded(const std::vector& touches, Event* event) +void Sprite3DReskinTest::onTouchesEnded(const std::vector& touches, Event* event) { - /* if (_hasWeapon) - { - _sprite->removeAllAttachNode(); - } - else - { - auto sp = Sprite3D::create("Sprite3DTest/axe.c3b"); - _sprite->getAttachNode("Bip001 R Hand")->addChild(sp); - } - _hasWeapon = !_hasWeapon;*/ } Sprite3DWithOBBPerfromanceTest::Sprite3DWithOBBPerfromanceTest() { diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h index adda6e1cd6..b2ac350077 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h @@ -246,26 +246,24 @@ protected: cocos2d::Sprite3D* _sprite; }; -class ChangeClothTest : public Sprite3DTestDemo +class Sprite3DReskinTest : public Sprite3DTestDemo { public: - CREATE_FUNC(ChangeClothTest); - ChangeClothTest(); + CREATE_FUNC(Sprite3DReskinTest); + Sprite3DReskinTest(); virtual std::string title() const override; virtual std::string subtitle() const override; void onTouchesEnded(const std::vector& touches, Event* event); void addNewSpriteWithCoords(Vec2 p); - // void menuCallback_changeCap(Ref* sender); - void menuCallback_changeHair(Ref* sender); - void menuCallback_changeGlasses(Ref* sender); - void menuCallback_changeUpBody(Ref* sender); - void menuCallback_changeBottomBody(Ref* sender); - void menuCallback_changeShoot(Ref* sender); + void menuCallback_switchHair(Ref* sender); + void menuCallback_switchGlasses(Ref* sender); + void menuCallback_switchCoat(Ref* sender); + void menuCallback_switchPants(Ref* sender); + void menuCallback_switchShoes(Ref* sender); protected: - bool _hasWeapon; std::string _girlPants[2]; int _usePantsId; - std::string _girlUpBody[2]; + std::string _girlUpperBody[2]; int _useUpBodyId; std::string _girlShoes[2]; int _useShoesId; From 93ee44c912bbd71d579041e3750f4ef89771be2c Mon Sep 17 00:00:00 2001 From: lvlong Date: Wed, 20 Aug 2014 10:24:46 +0800 Subject: [PATCH 47/67] format code --- cocos/3d/CCBundle3D.cpp | 179 +++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 93 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index c1b00938ea..01fbfada20 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -48,22 +48,19 @@ THE SOFTWARE. static const char* VERSION = "version"; static const char* ID = "id"; - -static const char* MESHDATA_DEFAULTPART = "body"; -static const char* MESHDATA_VERTEXSIZE = "vertexsize"; -static const char* MESHDATA_VERTEX = "vertex"; -static const char* MESHDATA_VERTICES = "vertices"; -static const char* MESHDATA_INDEXNUM = "indexnum"; -static const char* MESHDATA_INDICES = "indices"; -static const char* MESHDATA_SUBMESH = "submesh"; -static const char* MESHDATA_ATTRIBUTES = "attributes"; -static const char* MESHDATA_SIZE = "size"; -static const char* MESHDATA_TYPE = "type"; -static const char* MESHDATA_ATTRIBUTE = "attribute"; - -static const char* SKINDATA_SKIN = "skin"; -static const char* SKINDATA_BINDSHAPE = "bindshape"; - +static const char* DEFAULTPART = "body"; +static const char* VERTEXSIZE = "vertexsize"; +static const char* VERTEX = "vertex"; +static const char* VERTICES = "vertices"; +static const char* INDEXNUM = "indexnum"; +static const char* INDICES = "indices"; +static const char* SUBMESH = "submesh"; +static const char* ATTRIBUTES = "attributes"; +static const char* SIZE = "size"; +static const char* TYPE = "type"; +static const char* ATTRIBUTE = "attribute"; +static const char* SKIN = "skin"; +static const char* BINDSHAPE = "bindshape"; static const char* MESH = "mesh"; static const char* MESHES = "meshes"; static const char* MESHPARTID = "meshpartid"; @@ -78,25 +75,21 @@ static const char* ANIMATIONS = "animations"; static const char* TRANSFORM = "transform"; static const char* OLDTRANSFORM = "tansform"; static const char* ANIMATION = "animation"; - -static const char* MATERIALDATA_MATERIAL = "material"; -static const char* MATERIALDATA_MATERIALS = "materials"; -static const char* MATERIALDATA_BASE = "base"; -static const char* MATERIALDATA_FILENAME = "filename"; -static const char* MATERIALDATA_TEXTURES = "textures"; - -static const char* ANIMATIONDATA_ANIMATION = "animation"; -static const char* ANIMATIONDATA_LENGTH = "length"; -static const char* ANIMATIONDATA_BONEID = "boneId"; -static const char* ANIMATIONDATA_KEYFRAMES = "keyframes"; -static const char* ANIMATIONDATA_TRANSLATION = "translation"; -static const char* ANIMATIONDATA_ROTATION = "rotation"; -static const char* ANIMATIONDATA_SCALE = "scale"; -static const char* ANIMATIONDATA_KEYTIME = "keytime"; +static const char* MATERIAL = "material"; +static const char* BASE = "base"; +static const char* FILENAME = "filename"; +static const char* TEXTURES = "textures"; +static const char* LENGTH = "length"; +static const char* BONEID = "boneId"; +static const char* KEYFRAMES = "keyframes"; +static const char* TRANSLATION = "translation"; +static const char* ROTATION = "rotation"; +static const char* SCALE = "scale"; +static const char* KEYTIME = "keytime"; NS_CC_BEGIN - void getChildMap(std::map >& map, SkinData* skinData, const rapidjson::Value& val) +void getChildMap(std::map >& map, SkinData* skinData, const rapidjson::Value& val) { if (!skinData) return; @@ -111,7 +104,7 @@ NS_CC_BEGIN // set origin matrices std::string parent_name = val[ID].GetString(); - unsigned int parent_name_index = skinData->getSkinBoneNameIndex(parent_name); + int parent_name_index = skinData->getSkinBoneNameIndex(parent_name); if (parent_name_index < 0) { skinData->addNodeBoneNames(parent_name); @@ -478,7 +471,7 @@ bool Bundle3D::loadMeshDatasBinary(MeshDatas& meshdatas) return false; } meshData->subMeshIndices.push_back(indexArray); - meshData->numIndex = meshData->subMeshIndices.size(); + meshData->numIndex = (int)meshData->subMeshIndices.size(); } meshdatas.meshDatas.push_back(meshData); } @@ -714,7 +707,7 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) MeshData* meshData = new MeshData(); const rapidjson::Value& mesh_data = mesh_data_array[index]; // mesh_vertex_attribute - const rapidjson::Value& mesh_vertex_attribute = mesh_data[MESHDATA_ATTRIBUTES]; + const rapidjson::Value& mesh_vertex_attribute = mesh_data[ATTRIBUTES]; MeshVertexAttrib tempAttrib; meshData->attribCount=mesh_vertex_attribute.Size(); meshData->attribs.resize(meshData->attribCount); @@ -722,9 +715,9 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - int size = mesh_vertex_attribute_val[MESHDATA_SIZE].GetInt(); - std::string type = mesh_vertex_attribute_val[MESHDATA_TYPE].GetString(); - std::string attribute = mesh_vertex_attribute_val[MESHDATA_ATTRIBUTE].GetString(); + int size = mesh_vertex_attribute_val[SIZE].GetInt(); + std::string type = mesh_vertex_attribute_val[TYPE].GetString(); + std::string attribute = mesh_vertex_attribute_val[ATTRIBUTE].GetString(); tempAttrib.size = size; tempAttrib.attribSizeBytes = sizeof(float) * size; @@ -734,7 +727,7 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) } // mesh vertices //////////////////////////////////////////////////////////////////////////////////////////////// - const rapidjson::Value& mesh_data_vertex_array = mesh_data[MESHDATA_VERTICES]; + const rapidjson::Value& mesh_data_vertex_array = mesh_data[VERTICES]; meshData->vertexSizeInFloat=mesh_data_vertex_array.Size(); for (rapidjson::SizeType i = 0; i < mesh_data_vertex_array.Size(); i++) { @@ -749,12 +742,12 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) const rapidjson::Value& mesh_part = mesh_part_array[i]; meshData->subMeshIds.push_back(mesh_part[ID].GetString()); // index_number - const rapidjson::Value& indices_val_array = mesh_part[MESHDATA_INDICES]; + const rapidjson::Value& indices_val_array = mesh_part[INDICES]; for (rapidjson::SizeType j = 0; j < indices_val_array.Size(); j++) indexArray.push_back((unsigned short)indices_val_array[j].GetUint()); meshData->subMeshIndices.push_back(indexArray); - meshData->numIndex=meshData->subMeshIndices.size(); + meshData->numIndex = (int)meshData->subMeshIndices.size(); } meshdatas.meshDatas.push_back(meshData); } @@ -945,22 +938,22 @@ bool Bundle3D::loadMaterialsBinary_0_2(MaterialDatas& materialdatas) } bool Bundle3D::loadMaterialsJson(MaterialDatas& materialdatas) { - if (!_jsonReader.HasMember(MATERIALDATA_MATERIALS)) + if (!_jsonReader.HasMember(MATERIALS)) return false; - const rapidjson::Value& material_array = _jsonReader[MATERIALDATA_MATERIALS]; + const rapidjson::Value& material_array = _jsonReader[MATERIALS]; for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) { NMaterialData materialData; const rapidjson::Value& material_val = material_array[i]; materialData.id = material_val[ID].GetString(); - if (material_val.HasMember(MATERIALDATA_TEXTURES)) + if (material_val.HasMember(TEXTURES)) { - const rapidjson::Value& testure_array = material_val[MATERIALDATA_TEXTURES]; + const rapidjson::Value& testure_array = material_val[TEXTURES]; for (rapidjson::SizeType j = 0; j < testure_array.Size(); j++) { NTextureData textureData; const rapidjson::Value& texture_val = testure_array[j]; - std::string filename = texture_val[MATERIALDATA_FILENAME].GetString(); + std::string filename = texture_val[FILENAME].GetString(); textureData.filename = _modelPath + filename; textureData.type = parseGLTextureType(texture_val["type"].GetString()); textureData.wrapS = parseGLType(texture_val["wrapModeU"].GetString()); @@ -1001,40 +994,40 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) MeshData* meshdata= new MeshData(); const rapidjson::Value& mesh_data_val = mesh_data_array[(rapidjson::SizeType)0]; - const rapidjson::Value& mesh_data_body_array = mesh_data_val[MESHDATA_DEFAULTPART]; + const rapidjson::Value& mesh_data_body_array = mesh_data_val[DEFAULTPART]; const rapidjson::Value& mesh_data_body_array_0 = mesh_data_body_array[(rapidjson::SizeType)0]; // mesh_vertex_attribute - const rapidjson::Value& mesh_vertex_attribute = mesh_data_val[MESHDATA_ATTRIBUTES]; + const rapidjson::Value& mesh_vertex_attribute = mesh_data_val[ATTRIBUTES]; meshdata->attribCount = mesh_vertex_attribute.Size(); meshdata->attribs.resize(meshdata->attribCount); for (rapidjson::SizeType i = 0; i < mesh_vertex_attribute.Size(); i++) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - meshdata->attribs[i].size = mesh_vertex_attribute_val[MESHDATA_SIZE].GetUint(); + meshdata->attribs[i].size = mesh_vertex_attribute_val[SIZE].GetUint(); meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; - meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[MESHDATA_TYPE].GetString()); - meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[MESHDATA_ATTRIBUTE].GetString()); + meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[TYPE].GetString()); + meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[ATTRIBUTE].GetString()); } // vertices - meshdata->vertexSizeInFloat = mesh_data_body_array_0[MESHDATA_VERTEXSIZE].GetInt(); + meshdata->vertexSizeInFloat = mesh_data_body_array_0[VERTEXSIZE].GetInt(); meshdata->vertex.resize(meshdata->vertexSizeInFloat); - const rapidjson::Value& mesh_data_body_vertices = mesh_data_body_array_0[MESHDATA_VERTICES]; + const rapidjson::Value& mesh_data_body_vertices = mesh_data_body_array_0[VERTICES]; for (rapidjson::SizeType i = 0; i < mesh_data_body_vertices.Size(); i++) meshdata->vertex[i] = mesh_data_body_vertices[i].GetDouble(); // index_number - unsigned int indexnum = mesh_data_body_array_0[MESHDATA_INDEXNUM].GetUint(); + unsigned int indexnum = mesh_data_body_array_0[INDEXNUM].GetUint(); // indices std::vector indices; indices.resize(indexnum); - const rapidjson::Value& indices_val_array = mesh_data_body_array_0[MESHDATA_INDICES]; + const rapidjson::Value& indices_val_array = mesh_data_body_array_0[INDICES]; for (rapidjson::SizeType i = 0; i < indices_val_array.Size(); i++) indices[i] = (unsigned short)indices_val_array[i].GetUint(); @@ -1050,45 +1043,45 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) const rapidjson::Value& mesh_array_0 = mesh_array[(rapidjson::SizeType)0]; // mesh_vertex_attribute - const rapidjson::Value& mesh_vertex_attribute = mesh_array_0[MESHDATA_ATTRIBUTES]; + const rapidjson::Value& mesh_vertex_attribute = mesh_array_0[ATTRIBUTES]; meshdata->attribCount = mesh_vertex_attribute.Size(); meshdata->attribs.resize(meshdata->attribCount); for (rapidjson::SizeType i = 0; i < mesh_vertex_attribute.Size(); i++) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - meshdata->attribs[i].size = mesh_vertex_attribute_val[MESHDATA_SIZE].GetUint(); + meshdata->attribs[i].size = mesh_vertex_attribute_val[SIZE].GetUint(); meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; - meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[MESHDATA_TYPE].GetString()); - meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[MESHDATA_ATTRIBUTE].GetString()); + meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[TYPE].GetString()); + meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[ATTRIBUTE].GetString()); } // vertices - const rapidjson::Value& mesh_data_vertex = mesh_array_0[MESHDATA_VERTEX]; + const rapidjson::Value& mesh_data_vertex = mesh_array_0[VERTEX]; const rapidjson::Value& mesh_data_vertex_0 = mesh_data_vertex[(rapidjson::SizeType)0]; - meshdata->vertexSizeInFloat = mesh_data_vertex_0[MESHDATA_VERTEXSIZE].GetInt(); + meshdata->vertexSizeInFloat = mesh_data_vertex_0[VERTEXSIZE].GetInt(); meshdata->vertex.resize(meshdata->vertexSizeInFloat); - const rapidjson::Value& mesh_data_body_vertices = mesh_data_vertex_0[MESHDATA_VERTICES]; + const rapidjson::Value& mesh_data_body_vertices = mesh_data_vertex_0[VERTICES]; for (rapidjson::SizeType i = 0; i < mesh_data_body_vertices.Size(); i++) meshdata->vertex[i] = mesh_data_body_vertices[i].GetDouble(); // submesh - const rapidjson::Value& mesh_submesh_array = mesh_array_0[MESHDATA_SUBMESH]; + const rapidjson::Value& mesh_submesh_array = mesh_array_0[SUBMESH]; for (rapidjson::SizeType i = 0; i < mesh_submesh_array.Size(); i++) { const rapidjson::Value& mesh_submesh_val = mesh_submesh_array[i]; //std::string id = mesh_submesh_val[ID].GetString(); // index_number - unsigned int indexnum = mesh_submesh_val[MESHDATA_INDEXNUM].GetUint(); + unsigned int indexnum = mesh_submesh_val[INDEXNUM].GetUint(); // indices std::vector indices; indices.resize(indexnum); - const rapidjson::Value& indices_val_array = mesh_submesh_val[MESHDATA_INDICES]; + const rapidjson::Value& indices_val_array = mesh_submesh_val[INDICES]; for (rapidjson::SizeType j = 0; j < indices_val_array.Size(); j++) indices[j] = (unsigned short)indices_val_array[j].GetUint(); @@ -1100,9 +1093,9 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) bool Bundle3D::loadSkinDataJson(SkinData* skindata) { - if (!_jsonReader.HasMember(SKINDATA_SKIN )) return false; + if (!_jsonReader.HasMember(SKIN )) return false; - const rapidjson::Value& skin_data_array = _jsonReader[SKINDATA_SKIN ]; + const rapidjson::Value& skin_data_array = _jsonReader[SKIN ]; assert(skin_data_array.IsArray()); const rapidjson::Value& skin_data_array_val_0 = skin_data_array[(rapidjson::SizeType)0]; @@ -1118,7 +1111,7 @@ bool Bundle3D::loadSkinDataJson(SkinData* skindata) skindata->addSkinBoneNames(name); Mat4 mat_bind_pos; - const rapidjson::Value& bind_pos = skin_data_bone[SKINDATA_BINDSHAPE]; + const rapidjson::Value& bind_pos = skin_data_bone[BINDSHAPE]; for (rapidjson::SizeType j = 0; j < bind_pos.Size(); j++) { mat_bind_pos.m[j] = bind_pos[j].GetDouble(); @@ -1137,19 +1130,19 @@ bool Bundle3D::loadSkinDataJson(SkinData* skindata) bool Bundle3D::loadMaterialDataJson_0_1(MaterialDatas& materialdatas) { - if (!_jsonReader.HasMember(MATERIALDATA_MATERIAL)) + if (!_jsonReader.HasMember(MATERIAL)) return false; NMaterialData materialData; - const rapidjson::Value& material_data_array = _jsonReader[MATERIALDATA_MATERIAL]; + const rapidjson::Value& material_data_array = _jsonReader[MATERIAL]; const rapidjson::Value& material_data_array_0 = material_data_array[(rapidjson::SizeType)0]; - const rapidjson::Value& material_data_base_array = material_data_array_0[MATERIALDATA_BASE]; + const rapidjson::Value& material_data_base_array = material_data_array_0[BASE]; const rapidjson::Value& material_data_base_array_0 = material_data_base_array[(rapidjson::SizeType)0]; NTextureData textureData; // set texture - textureData.filename =_modelPath + material_data_base_array_0[MATERIALDATA_FILENAME].GetString(); + textureData.filename =_modelPath + material_data_base_array_0[FILENAME].GetString(); textureData.type= NTextureData::Usage::Diffuse; textureData.id=""; materialData.textures.push_back(textureData); @@ -1159,10 +1152,10 @@ bool Bundle3D::loadMaterialDataJson_0_1(MaterialDatas& materialdatas) bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas) { - if (!_jsonReader.HasMember(MATERIALDATA_MATERIAL)) + if (!_jsonReader.HasMember(MATERIAL)) return false; NMaterialData materialData; - const rapidjson::Value& material_array = _jsonReader[MATERIALDATA_MATERIAL]; + const rapidjson::Value& material_array = _jsonReader[MATERIAL]; for (rapidjson::SizeType i = 0; i < material_array.Size(); i++) { @@ -1170,7 +1163,7 @@ bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas) const rapidjson::Value& material_val = material_array[i]; // set texture - textureData.filename = _modelPath + material_val[MATERIALDATA_TEXTURES].GetString(); + textureData.filename = _modelPath + material_val[TEXTURES].GetString(); textureData.type= NTextureData::Usage::Diffuse; textureData.id=""; materialData.textures.push_back(textureData); @@ -1194,42 +1187,42 @@ bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata) const rapidjson::Value& animation_data_array_val_0 = animation_data_array[(rapidjson::SizeType)0]; - animationdata->_totalTime = animation_data_array_val_0[ANIMATIONDATA_LENGTH].GetDouble(); + animationdata->_totalTime = animation_data_array_val_0[LENGTH].GetDouble(); const rapidjson::Value& bones = animation_data_array_val_0[BONES]; for (rapidjson::SizeType i = 0; i < bones.Size(); i++) { const rapidjson::Value& bone = bones[i]; - std::string bone_name = bone[ANIMATIONDATA_BONEID].GetString(); + std::string bone_name = bone[BONEID].GetString(); - if ( bone.HasMember(ANIMATIONDATA_KEYFRAMES)) + if ( bone.HasMember(KEYFRAMES)) { - const rapidjson::Value& bone_keyframes = bone[ANIMATIONDATA_KEYFRAMES]; + const rapidjson::Value& bone_keyframes = bone[KEYFRAMES]; rapidjson::SizeType keyframe_size = bone_keyframes.Size(); for (rapidjson::SizeType j = 0; j < keyframe_size; j++) { const rapidjson::Value& bone_keyframe = bone_keyframes[j]; - if ( bone_keyframe.HasMember(ANIMATIONDATA_TRANSLATION)) + if ( bone_keyframe.HasMember(TRANSLATION)) { - const rapidjson::Value& bone_keyframe_translation = bone_keyframe[ANIMATIONDATA_TRANSLATION]; - float keytime = bone_keyframe[ANIMATIONDATA_KEYTIME].GetDouble(); + const rapidjson::Value& bone_keyframe_translation = bone_keyframe[TRANSLATION]; + float keytime = bone_keyframe[KEYTIME].GetDouble(); Vec3 val = Vec3(bone_keyframe_translation[(rapidjson::SizeType)0].GetDouble(), bone_keyframe_translation[1].GetDouble(), bone_keyframe_translation[2].GetDouble()); animationdata->_translationKeys[bone_name].push_back(Animation3DData::Vec3Key(keytime,val)); } - if ( bone_keyframe.HasMember(ANIMATIONDATA_ROTATION)) + if ( bone_keyframe.HasMember(ROTATION)) { - const rapidjson::Value& bone_keyframe_rotation = bone_keyframe[ANIMATIONDATA_ROTATION]; - float keytime = bone_keyframe[ANIMATIONDATA_KEYTIME].GetDouble(); + const rapidjson::Value& bone_keyframe_rotation = bone_keyframe[ROTATION]; + float keytime = bone_keyframe[KEYTIME].GetDouble(); Quaternion val = Quaternion(bone_keyframe_rotation[(rapidjson::SizeType)0].GetDouble(),bone_keyframe_rotation[1].GetDouble(),bone_keyframe_rotation[2].GetDouble(),bone_keyframe_rotation[3].GetDouble()); animationdata->_rotationKeys[bone_name].push_back(Animation3DData::QuatKey(keytime,val)); } - if ( bone_keyframe.HasMember(ANIMATIONDATA_SCALE)) + if ( bone_keyframe.HasMember(SCALE)) { - const rapidjson::Value& bone_keyframe_scale = bone_keyframe[ANIMATIONDATA_SCALE]; - float keytime = bone_keyframe[ANIMATIONDATA_KEYTIME].GetDouble(); + const rapidjson::Value& bone_keyframe_scale = bone_keyframe[SCALE]; + float keytime = bone_keyframe[KEYTIME].GetDouble(); Vec3 val = Vec3(bone_keyframe_scale[(rapidjson::SizeType)0].GetDouble(), bone_keyframe_scale[1].GetDouble(), bone_keyframe_scale[2].GetDouble()); animationdata->_scaleKeys[bone_name].push_back(Animation3DData::Vec3Key(keytime,val)); } @@ -1749,11 +1742,11 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) modelnodedata->bones.push_back(bone[NODE].GetString()); Mat4 invbindpos; - const rapidjson::Value& jtransform = bone[TRANSFORM]; + const rapidjson::Value& jinvbindpos = bone[TRANSFORM]; - for (rapidjson::SizeType k = 0; k < jtransform.Size(); k++) + for (rapidjson::SizeType k = 0; k < jinvbindpos.Size(); k++) { - invbindpos.m[k] = jtransform[k].GetDouble(); + invbindpos.m[k] = jinvbindpos[k].GetDouble(); } //invbindpos.inverse(); @@ -1877,7 +1870,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) CCLOGINFO("Failed to read nodedata: uvMapping '%s'.", _path.c_str()); return nullptr; } - for( int i = 0 ;i < uvMapping ; i++ ) + for( int j = 0 ;j < uvMapping ; j++ ) { unsigned int textureIndexSize=0; if (_binaryReader.read(&textureIndexSize, 4, 1) != 1) @@ -1885,7 +1878,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) CCLOGINFO("Failed to read meshdata: attribCount '%s'.", _path.c_str()); return nullptr; } - for(int j =0; j < textureIndexSize ; j++ ) + for(int k =0; k < textureIndexSize ; k++ ) { unsigned int index=0; if (_binaryReader.read(&index, 4, 1) != 1) From c6cd9b029d56fc7d214433b6d089c6501e3d32fd Mon Sep 17 00:00:00 2001 From: liuliang Date: Wed, 20 Aug 2014 11:40:04 +0800 Subject: [PATCH 48/67] Modify the parsing --- cocos/3d/CCBundle3D.cpp | 59 ++++++++------- cocos/3d/CCBundle3DData.h | 5 +- cocos/3d/CCSprite3D.cpp | 151 +++++++++++++++++++------------------- 3 files changed, 110 insertions(+), 105 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index dd96aeadc7..e46eb84d51 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -298,12 +298,13 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD meshdata->subMeshIndices.push_back(it.mesh.indices); meshdata->subMeshIds.push_back(str); - + auto node = new NodeData(); auto modelnode = new ModelNodeData(); modelnode->matrialId = str; modelnode->subMeshId = str; modelnode->id = it.name; - nodedatas.nodes.push_back(modelnode); + node->modelNodeDatas.push_back(modelnode); + nodedatas.nodes.push_back(node); } return true; } @@ -744,22 +745,22 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) //////////////////////////////////////////////////////////////////////////////////////////////// const rapidjson::Value& mesh_data_vertex_array = mesh_data[MESHDATA_VERTICES]; meshData->vertexSizeInFloat=mesh_data_vertex_array.Size(); - for (rapidjson::SizeType i = 0; i < mesh_data_vertex_array.Size(); i++) + for (rapidjson::SizeType j = 0; j < mesh_data_vertex_array.Size(); j++) { - meshData->vertex.push_back(mesh_data_vertex_array[i].GetDouble()); + meshData->vertex.push_back(mesh_data_vertex_array[j].GetDouble()); } // mesh part //////////////////////////////////////////////////////////////////////////////////////////////// const rapidjson::Value& mesh_part_array = mesh_data[PARTS]; - for (rapidjson::SizeType i = 0; i < mesh_part_array.Size(); i++) + for (rapidjson::SizeType k = 0; k < mesh_part_array.Size(); k++) { std::vector indexArray; - const rapidjson::Value& mesh_part = mesh_part_array[i]; + const rapidjson::Value& mesh_part = mesh_part_array[k]; meshData->subMeshIds.push_back(mesh_part[ID].GetString()); // index_number const rapidjson::Value& indices_val_array = mesh_part[MESHDATA_INDICES]; - for (rapidjson::SizeType j = 0; j < indices_val_array.Size(); j++) - indexArray.push_back((unsigned short)indices_val_array[j].GetUint()); + for (rapidjson::SizeType h = 0; h < indices_val_array.Size(); h++) + indexArray.push_back((unsigned short)indices_val_array[h].GetUint()); meshData->subMeshIndices.push_back(indexArray); meshData->numIndex=meshData->subMeshIndices.size(); @@ -801,13 +802,15 @@ bool Bundle3D::loadNodes(NodeDatas& nodedatas) } } nodedatas.skeleton.push_back(nodeDatas[skinData.rootBoneIndex]); + auto node= new NodeData(); auto modelnode = new ModelNodeData(); modelnode->matrialId = ""; modelnode->subMeshId = ""; modelnode->id = ""; modelnode->bones = skinData.skinBoneNames; modelnode->invBindPose = skinData.inverseBindPoseMatrices; - nodedatas.nodes.push_back(modelnode); + node->modelNodeDatas.push_back(modelnode); + nodedatas.nodes.push_back(node); } else { @@ -1700,11 +1703,11 @@ bool Bundle3D::loadNodesJson(NodeDatas& nodedatas) } NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) { - NodeData* nodedata; - if (jvalue.HasMember(PARTS)) - nodedata = new ModelNodeData(); - else - nodedata = new NodeData(); + NodeData* nodedata = new NodeData();; + //if (jvalue.HasMember(PARTS)) + // nodedata = new ModelNodeData(); + //else + //nodedata = new NodeData(); // id nodedata->id = jvalue[ID].GetString(); @@ -1724,10 +1727,11 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) if (jvalue.HasMember(PARTS)) { const rapidjson::Value& parts = jvalue[PARTS]; - ModelNodeData* modelnodedata = dynamic_cast(nodedata); + for (rapidjson::SizeType i = 0; i < parts.Size(); i++) { + ModelNodeData* modelnodedata = new ModelNodeData();; const rapidjson::Value& part = parts[i]; modelnodedata->subMeshId = part[MESHPARTID].GetString(); modelnodedata->matrialId = part[MATERIALID].GetString(); @@ -1768,6 +1772,7 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) modelnodedata->invBindPose.push_back(invbindpos); } } + nodedata->modelNodeDatas.push_back(modelnodedata); } } @@ -1782,7 +1787,6 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) nodedata->children.push_back(tempdata); } } - return nodedata; } @@ -1835,16 +1839,14 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) return nullptr; } - NodeData* nodedata; + NodeData* nodedata = new NodeData(); + nodedata->id = id; + nodedata->transform = transform; if (partsSize > 0) { - nodedata = new ModelNodeData(); - nodedata->id = id; - nodedata->transform = transform; - ModelNodeData* modelnodedata = dynamic_cast(nodedata); - for (rapidjson::SizeType i = 0; i < partsSize; i++) { + ModelNodeData* modelnodedata = new ModelNodeData(); modelnodedata->subMeshId = _binaryReader.readString(); modelnodedata->matrialId = _binaryReader.readString(); @@ -1902,14 +1904,15 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) } } } + nodedata->modelNodeDatas.push_back(modelnodedata); } } - else - { - nodedata = new NodeData(); - nodedata->id = id; - nodedata->transform = transform; - } + //else + //{ + // nodedata = new NodeData(); + // nodedata->id = id; + // nodedata->transform = transform; + //} unsigned int childrenSize = 0; if (_binaryReader.read(&childrenSize, 4, 1) != 1) diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index d179a7bb6b..514c87bff3 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -54,8 +54,9 @@ struct NodeData { std::string id; Mat4 transform; - std::vector children; - + std::vector modelNodeDatas; + std::vector children; + virtual ~NodeData() { resetData(); diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 9e848db2ad..cef0250f5e 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -247,101 +247,103 @@ GLProgram* Sprite3D::getDefaultGLProgram(bool textured) void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas, bool singleSprite) { Node* node=nullptr; - ModelNodeData* modelNodeData=nodedata->asModelNodeData(); - if(modelNodeData) + for(const auto& it : nodedata->modelNodeDatas) { - if(modelNodeData->bones.size() > 0 || singleSprite) + if(it) { - auto subMeshState = SubMeshState::create(modelNodeData->id); - if(subMeshState) + if(it->bones.size() > 0 || singleSprite) { - _subMeshStates.pushBack(subMeshState); - subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); - if (_skeleton && modelNodeData->bones.size()) + auto subMeshState = SubMeshState::create(it->id); + if(subMeshState) { - auto skin = MeshSkin::create(_skeleton, modelNodeData->bones, modelNodeData->invBindPose); - subMeshState->setSkin(skin); - } - subMeshState->_visibleChanged = std::bind(&Sprite3D::onAABBDirty, this); - - if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) - { - const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - subMeshState->setTexture(textureData->filename); - } - else - { - const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); - if(materialData) + _subMeshStates.pushBack(subMeshState); + subMeshState->setSubMesh(getSubMesh(it->subMeshId)); + if (_skeleton && it->bones.size()) { - const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); - if(textureData) - { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); - if(tex) - { - Texture2D::TexParams texParams; - texParams.minFilter = GL_LINEAR; - texParams.magFilter = GL_LINEAR; - texParams.wrapS = textureData->wrapS; - texParams.wrapT = textureData->wrapT; - tex->setTexParameters(texParams); - subMeshState->setTexture(tex); - } + auto skin = MeshSkin::create(_skeleton, it->bones, it->invBindPose); + subMeshState->setSkin(skin); + } + subMeshState->_visibleChanged = std::bind(&Sprite3D::onAABBDirty, this); + if (it->matrialId == "" && matrialdatas.materials.size()) + { + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); + subMeshState->setTexture(textureData->filename); + } + else + { + const NMaterialData* materialData=matrialdatas.getMaterialData(it->matrialId); + if(materialData) + { + const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); + if(textureData) + { + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + + } } } } } - } - else - { - auto sprite = new Sprite3D(); - if (sprite) + else { - auto subMeshState = SubMeshState::create(modelNodeData->id); - subMeshState->setSubMesh(getSubMesh(modelNodeData->subMeshId)); - if (modelNodeData->matrialId == "" && matrialdatas.materials.size()) + auto sprite = new Sprite3D(); + if (sprite) { - const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - subMeshState->setTexture(textureData->filename); - } - else - { - const NMaterialData* materialData=matrialdatas.getMaterialData(modelNodeData->matrialId); - if(materialData) + auto subMeshState = SubMeshState::create(it->id); + subMeshState->setSubMesh(getSubMesh(it->subMeshId)); + if (it->matrialId == "" && matrialdatas.materials.size()) { - const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); - if(textureData) + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); + subMeshState->setTexture(textureData->filename); + } + else + { + const NMaterialData* materialData=matrialdatas.getMaterialData(it->matrialId); + if(materialData) { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); - if(tex) + const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); + if(textureData) { - Texture2D::TexParams texParams; - texParams.minFilter = GL_LINEAR; - texParams.magFilter = GL_LINEAR; - texParams.wrapS = textureData->wrapS; - texParams.wrapT = textureData->wrapT; - tex->setTexParameters(texParams); - subMeshState->setTexture(tex); - } + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + } } } + sprite->setAdditionalTransform(&nodedata->transform); + sprite->addSubMeshState(subMeshState); + sprite->autorelease(); + sprite->genGLProgramState(); + if(root) + { + root->addChild(sprite); + } } - sprite->setAdditionalTransform(&nodedata->transform); - sprite->addSubMeshState(subMeshState); - sprite->autorelease(); - sprite->genGLProgramState(); - if(root) - { - root->addChild(sprite); - } - } - node=sprite; + node=sprite; + } } } - else + if(nodedata->modelNodeDatas.size() ==0 ) { node= Node::create(); if(node) @@ -438,7 +440,6 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) for (auto& submeshstate : _subMeshStates) { if (!submeshstate->isVisible()) continue; - auto& meshCommand = _meshCommands[i++]; GLuint textureID = submeshstate->getTexture() ? submeshstate->getTexture()->getName() : 0; From df272ee7f5db2d98f8106b045542ede5f8e78f6b Mon Sep 17 00:00:00 2001 From: liuliang Date: Wed, 20 Aug 2014 13:53:15 +0800 Subject: [PATCH 49/67] Modify the parsing --- cocos/3d/CCSprite3D.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 6d696fcd8e..be74e1acf7 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -286,7 +286,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m { if(it->bones.size() > 0 || singleSprite) { - auto subMeshState = SubMeshState::create(it->id); + auto subMeshState = SubMeshState::create(nodedata->id); if(subMeshState) { _subMeshStates.pushBack(subMeshState); @@ -333,7 +333,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m auto sprite = new Sprite3D(); if (sprite) { - auto subMeshState = SubMeshState::create(it->id); + auto subMeshState = SubMeshState::create(nodedata->id); subMeshState->setSubMesh(getSubMesh(it->subMeshId)); if (it->matrialId == "" && matrialdatas.materials.size()) { From 79857c471bd521bb44382157ffa50c32610aff6b Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 20 Aug 2014 15:02:16 +0800 Subject: [PATCH 50/67] multiply Mesh attrib support --- cocos/3d/CCSubMeshState.cpp | 94 +++++++++++++++++++++++++++++++++++++ cocos/3d/CCSubMeshState.h | 21 +++++++++ tools/cocos2d-console | 2 +- 3 files changed, 116 insertions(+), 1 deletion(-) diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index 1695030977..a3e5e7b389 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -30,6 +30,7 @@ #include "3d/CCSubMeshState.h" #include "3d/CCMeshSkin.h" #include "3d/CCSubMesh.h" +#include "3d/CCSprite3D.h" #include "base/ccMacros.h" #include "base/CCEventCustom.h" @@ -40,6 +41,7 @@ #include "renderer/ccGLStateCache.h" #include "renderer/CCTexture2D.h" #include "renderer/CCTextureCache.h" +#include "renderer/CCGLProgramCache.h" using namespace std; @@ -52,6 +54,8 @@ SubMeshState::SubMeshState() , _skin(nullptr) , _subMesh(nullptr) , _visibleChanged(nullptr) +, _glProgramState(nullptr) +, _blend(BlendFunc::ALPHA_NON_PREMULTIPLIED) { } @@ -60,6 +64,7 @@ SubMeshState::~SubMeshState() CC_SAFE_RELEASE(_texture); CC_SAFE_RELEASE(_skin); CC_SAFE_RELEASE(_subMesh); + CC_SAFE_RELEASE(_glProgramState); } SubMeshState* SubMeshState::create() @@ -80,6 +85,55 @@ SubMeshState* SubMeshState::create(const std::string& name) return state; } +GLProgram* SubMeshState::getDefaultGLProgram(bool textured) +{ + if (_subMesh) + { + auto mesh = _subMesh->getMesh(); + bool hasSkin = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) + && mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT); + + if(textured) + { + if (hasSkin) + return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_SKINPOSITION_TEXTURE); + + return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION_TEXTURE); + } + else + { + return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); + } + } + return nullptr; +} + +void SubMeshState::genGLProgramState() +{ + if (_subMesh) + { + CC_SAFE_RELEASE(_glProgramState); + auto mesh = _subMesh->getMesh(); + if (mesh) + { + _glProgramState = GLProgramState::getOrCreateWithGLProgram(getDefaultGLProgram(mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD))); + _glProgramState->retain(); + long offset = 0; + auto attributeCount = mesh->getMeshVertexAttribCount(); + for (auto k = 0; k < attributeCount; k++) { + auto meshattribute = mesh->getMeshVertexAttribute(k); + _glProgramState->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], + meshattribute.size, + meshattribute.type, + GL_FALSE, + mesh->getVertexSizeInBytes(), + (GLvoid*)offset); + offset += meshattribute.attribSizeBytes; + } + } + } +} + void SubMeshState::setVisible(bool visible) { if (_visible != visible) @@ -103,6 +157,7 @@ void SubMeshState::setTexture(Texture2D* tex) CC_SAFE_RETAIN(tex); CC_SAFE_RELEASE(_texture); _texture = tex; + bindMeshCommand(); } } @@ -125,6 +180,19 @@ void SubMeshState::setSubMesh(SubMesh* subMesh) CC_SAFE_RELEASE(_subMesh); _subMesh = subMesh; calcuateAABB(); + genGLProgramState(); + bindMeshCommand(); + } +} + +void SubMeshState::setGLProgramState(GLProgramState* glProgramState) +{ + if (_glProgramState != glProgramState) + { + CC_SAFE_RETAIN(glProgramState); + CC_SAFE_RELEASE(_glProgramState); + _glProgramState = glProgramState; + bindMeshCommand(); } } @@ -144,4 +212,30 @@ void SubMeshState::calcuateAABB() } } +void SubMeshState::bindMeshCommand() +{ + if (_glProgramState && _subMesh && _texture) + { + GLuint texID = _texture ? _texture->getName() : 0; + _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh(), _blend); + } +} + +void SubMeshState::setBlendFunc(const BlendFunc &blendFunc) +{ + if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) + { + _blend = blendFunc; + if (_glProgramState && _subMesh && _texture) + { + GLuint texID = _texture ? _texture->getName() : 0; + _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh(), _blend); + } + } +} +const BlendFunc &SubMeshState::getBlendFunc() const +{ + return _blend; +} + NS_CC_END diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index 05f1d10119..8dd37bed0d 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -35,6 +35,8 @@ #include "base/ccTypes.h" #include "math/CCMath.h" #include "renderer/CCGLProgram.h" +#include "renderer/CCGLProgramState.h" +#include "renderer/CCMeshCommand.h" #include "3d/3dExport.h" NS_CC_BEGIN @@ -70,13 +72,27 @@ public: /**sub mesh getter */ SubMesh* getSubMesh() const { return _subMesh; } + const MeshCommand* getMeshCommand() const { return &_meshCommand; } + + /**get GLProgramState*/ + GLProgramState* getGLProgramState() const { return _glProgramState; } + /**name getter */ const std::string& getName() const { return _name; } + + void setBlendFunc(const BlendFunc &blendFunc); + const BlendFunc &getBlendFunc() const; CC_CONSTRUCTOR_ACCESS: SubMeshState(); virtual ~SubMeshState(); + + void genGLProgramState(); + + GLProgram* getDefaultGLProgram(bool textured); + + void setGLProgramState(GLProgramState* glProgramState); /**skin setter*/ void setSkin(MeshSkin* skin); @@ -88,6 +104,8 @@ CC_CONSTRUCTOR_ACCESS: const AABB& getAABB() const { return _aabb; } void calcuateAABB(); + + void bindMeshCommand(); protected: Texture2D* _texture; //texture that submesh is using MeshSkin* _skin; //skin @@ -96,6 +114,9 @@ protected: //since 3.3 std::string _name; SubMesh* _subMesh; + GLProgramState* _glProgramState; + MeshCommand _meshCommand; + BlendFunc _blend; AABB _aabb; std::function _visibleChanged; }; diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 5db5a4283a..b2a0338f0a 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 5db5a4283aa22e362901e2924146ad66c2e1484f +Subproject commit b2a0338f0a6d51878ce96c4e0521d083e232e67b From bd4aec4bcd091a1bbb9ae2e24d30ef866bf7eda7 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 20 Aug 2014 18:20:19 +0800 Subject: [PATCH 51/67] support multi-attribs --- cocos/3d/CCSprite3D.cpp | 101 ++++++++---------- cocos/3d/CCSprite3D.h | 8 +- cocos/3d/CCSubMeshState.cpp | 61 +---------- cocos/3d/CCSubMeshState.h | 6 +- cocos/renderer/CCMeshCommand.cpp | 8 +- cocos/renderer/CCMeshCommand.h | 2 +- .../Classes/Camera3DTest/Camera3DTest.cpp | 3 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 2 +- 8 files changed, 60 insertions(+), 131 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index be74e1acf7..db52c4ff7a 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -165,6 +165,7 @@ Sprite3D::Sprite3D() Sprite3D::~Sprite3D() { _subMeshStates.clear(); + _glProgramStates.clear(); _meshes.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); @@ -174,6 +175,7 @@ bool Sprite3D::initWithFile(const std::string &path) { _subMeshStates.clear(); _meshes.clear(); + _glProgramStates.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); @@ -224,59 +226,49 @@ bool Sprite3D::initFrom(const NodeDatas& nodeDatas, const MeshDatas& meshdatas, void Sprite3D::genGLProgramState() { - if (_meshes.size() == 0) - return; - - //all the mesh should have the same attributes, FIX ME - auto mesh = _meshes.at(0); - - auto programstate = GLProgramState::getOrCreateWithGLProgram(getDefaultGLProgram(mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD))); - long offset = 0; - auto attributeCount = mesh->getMeshVertexAttribCount(); - for (auto k = 0; k < attributeCount; k++) { - auto meshattribute = mesh->getMeshVertexAttribute(k); - programstate->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], - meshattribute.size, - meshattribute.type, - GL_FALSE, - mesh->getVertexSizeInBytes(), - (GLvoid*)offset); - offset += meshattribute.attribSizeBytes; + std::unordered_map glProgramestates; + for(auto& mesh : _meshes) + { + bool textured = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD); + bool hasSkin = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) + && mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT); + + GLProgram* glProgram = nullptr; + if(textured) + { + if (hasSkin) + glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_SKINPOSITION_TEXTURE); + else + glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION_TEXTURE); + } + else + { + glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); + } + + auto programstate = GLProgramState::create(glProgram); + long offset = 0; + auto attributeCount = mesh->getMeshVertexAttribCount(); + for (auto k = 0; k < attributeCount; k++) { + auto meshattribute = mesh->getMeshVertexAttribute(k); + programstate->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], + meshattribute.size, + meshattribute.type, + GL_FALSE, + mesh->getVertexSizeInBytes(), + (GLvoid*)offset); + offset += meshattribute.attribSizeBytes; + } + + _glProgramStates.pushBack(programstate); + glProgramestates[mesh] = programstate; } - setGLProgramState(programstate); - auto count = _subMeshStates.size(); - _meshCommands.resize(count); - for (int i = 0; i < count; i++) { - auto tex = _subMeshStates.at(i)->getTexture(); - GLuint texID = tex ? tex->getName() : 0; - _meshCommands[i].genMaterialID(texID, programstate, _subMeshStates.at(i)->getSubMesh()->getMesh(), _blend); + for (auto& it : _subMeshStates) { + it->setGLProgramState(glProgramestates[it->getSubMesh()->getMesh()]); } } -GLProgram* Sprite3D::getDefaultGLProgram(bool textured) -{ - if (_meshes.size() == 0) - return nullptr; - - //all the mesh should have the same attributes, FIX ME - auto mesh = _meshes.at(0); - - bool hasSkin = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) - && mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT); - - if(textured) - { - if (hasSkin) - return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_SKINPOSITION_TEXTURE); - - return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION_TEXTURE); - } - else - { - return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); - } -} void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas, bool singleSprite) { Node* node=nullptr; @@ -465,7 +457,6 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) if (_skeleton) _skeleton->updateBoneMatrix(); - GLProgramState* programstate = getGLProgramState(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; @@ -476,8 +467,8 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) i++; continue; } - - auto& meshCommand = _meshCommands[i++]; + auto programstate = submeshstate->getGLProgramState(); + auto& meshCommand = submeshstate->getMeshCommand(); GLuint textureID = submeshstate->getTexture() ? submeshstate->getTexture()->getName() : 0; auto submesh = submeshstate->getSubMesh(); @@ -544,15 +535,15 @@ Rect Sprite3D::getBoundingBox() const void Sprite3D::setCullFace(GLenum cullFace) { - for (auto& it : _meshCommands) { - it.setCullFace(cullFace); + for (auto& it : _subMeshStates) { + it->getMeshCommand().setCullFace(cullFace); } } void Sprite3D::setCullFaceEnabled(bool enable) { - for (auto& it : _meshCommands) { - it.setCullFaceEnabled(enable); + for (auto& it : _subMeshStates) { + it->getMeshCommand().setCullFaceEnabled(enable); } } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 9ec045b117..6ffff020c9 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -130,9 +130,6 @@ CC_CONSTRUCTOR_ACCESS: /**draw*/ virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; - /**get default shader*/ - virtual GLProgram* getDefaultGLProgram(bool textured = true); - /**generate default GLProgramState*/ void genGLProgramState(); @@ -147,8 +144,6 @@ protected: Skeleton3D* _skeleton; //skeleton - std::vector _meshCommands; //render command each for one submesh - Vector _subMeshStates; // SubMeshStates std::unordered_map _attachments; @@ -156,7 +151,8 @@ protected: BlendFunc _blend; //since 3.3 - Vector _meshes; + Vector _meshes; + Vector _glProgramStates; mutable AABB _aabb; // cache current aabb mutable Mat4 _nodeToWorldTransform; // cache the matrix diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index a3e5e7b389..c89e8885c2 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -71,6 +71,7 @@ SubMeshState* SubMeshState::create() { auto state = new SubMeshState(); state->autorelease(); + state->bindMeshCommand(); return state; } @@ -79,61 +80,12 @@ SubMeshState* SubMeshState::create(const std::string& name) { auto state = new SubMeshState(); state->autorelease(); - + state->bindMeshCommand(); state->_name = name; return state; } -GLProgram* SubMeshState::getDefaultGLProgram(bool textured) -{ - if (_subMesh) - { - auto mesh = _subMesh->getMesh(); - bool hasSkin = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) - && mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_WEIGHT); - - if(textured) - { - if (hasSkin) - return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_SKINPOSITION_TEXTURE); - - return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION_TEXTURE); - } - else - { - return GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_POSITION); - } - } - return nullptr; -} - -void SubMeshState::genGLProgramState() -{ - if (_subMesh) - { - CC_SAFE_RELEASE(_glProgramState); - auto mesh = _subMesh->getMesh(); - if (mesh) - { - _glProgramState = GLProgramState::getOrCreateWithGLProgram(getDefaultGLProgram(mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD))); - _glProgramState->retain(); - long offset = 0; - auto attributeCount = mesh->getMeshVertexAttribCount(); - for (auto k = 0; k < attributeCount; k++) { - auto meshattribute = mesh->getMeshVertexAttribute(k); - _glProgramState->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], - meshattribute.size, - meshattribute.type, - GL_FALSE, - mesh->getVertexSizeInBytes(), - (GLvoid*)offset); - offset += meshattribute.attribSizeBytes; - } - } - } -} - void SubMeshState::setVisible(bool visible) { if (_visible != visible) @@ -180,7 +132,6 @@ void SubMeshState::setSubMesh(SubMesh* subMesh) CC_SAFE_RELEASE(_subMesh); _subMesh = subMesh; calcuateAABB(); - genGLProgramState(); bindMeshCommand(); } } @@ -217,7 +168,7 @@ void SubMeshState::bindMeshCommand() if (_glProgramState && _subMesh && _texture) { GLuint texID = _texture ? _texture->getName() : 0; - _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh(), _blend); + _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh()->getVertexBuffer(), _subMesh->getIndexBuffer(), _blend); } } @@ -226,11 +177,7 @@ void SubMeshState::setBlendFunc(const BlendFunc &blendFunc) if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) { _blend = blendFunc; - if (_glProgramState && _subMesh && _texture) - { - GLuint texID = _texture ? _texture->getName() : 0; - _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh(), _blend); - } + bindMeshCommand(); } } const BlendFunc &SubMeshState::getBlendFunc() const diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index 8dd37bed0d..f453220ec5 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -72,8 +72,6 @@ public: /**sub mesh getter */ SubMesh* getSubMesh() const { return _subMesh; } - const MeshCommand* getMeshCommand() const { return &_meshCommand; } - /**get GLProgramState*/ GLProgramState* getGLProgramState() const { return _glProgramState; } @@ -88,11 +86,11 @@ CC_CONSTRUCTOR_ACCESS: SubMeshState(); virtual ~SubMeshState(); - void genGLProgramState(); - GLProgram* getDefaultGLProgram(bool textured); void setGLProgramState(GLProgramState* glProgramState); + + MeshCommand& getMeshCommand() { return _meshCommand; } /**skin setter*/ void setSkin(MeshSkin* skin); diff --git a/cocos/renderer/CCMeshCommand.cpp b/cocos/renderer/CCMeshCommand.cpp index 8b69a7c3b0..dbe69989d6 100644 --- a/cocos/renderer/CCMeshCommand.cpp +++ b/cocos/renderer/CCMeshCommand.cpp @@ -172,18 +172,16 @@ void MeshCommand::restoreRenderState() s_cullFace = 0; } -void MeshCommand::genMaterialID(GLuint texID, void* glProgramState, void* mesh, const BlendFunc& blend) +void MeshCommand::genMaterialID(GLuint texID, void* glProgramState, GLuint vertexBuffer, GLuint indexBuffer, const BlendFunc& blend) { int* intstate = static_cast(glProgramState); - int* intmesh = static_cast(mesh); - int statekey[] = {intstate[0], 0}, meshkey[] = {intmesh[0], 0}; + int statekey[] = {intstate[0], 0}; if (sizeof(void*) > sizeof(int)) { statekey[1] = intstate[1]; - meshkey[1] = intmesh[1]; } - int intArray[] = {(int)texID, statekey[0], statekey[1], meshkey[0], meshkey[1], (int)blend.src, (int)blend.dst}; + int intArray[] = {(int)texID, statekey[0], statekey[1], (int)vertexBuffer, (int)indexBuffer, (int)blend.src, (int)blend.dst}; _materialID = XXH32((const void*)intArray, sizeof(intArray), 0); } diff --git a/cocos/renderer/CCMeshCommand.h b/cocos/renderer/CCMeshCommand.h index fcbf7881a9..d394aac366 100644 --- a/cocos/renderer/CCMeshCommand.h +++ b/cocos/renderer/CCMeshCommand.h @@ -70,7 +70,7 @@ public: void batchDraw(); void postBatchDraw(); - void genMaterialID(GLuint texID, void* glProgramState, void* mesh, const BlendFunc& blend); + void genMaterialID(GLuint texID, void* glProgramState, GLuint vertexBuffer, GLuint indexBuffer, const BlendFunc& blend); uint32_t getMaterialID() const { return _materialID; } diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 6f0eda505a..7b4f069aaa 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -263,7 +263,7 @@ void Camera3DTestDemo::onEnter() addChild(layer3D,0); _layer3D=layer3D; _curState=State_None; - addNewSpriteWithCoords( Vec3(0,0,0),"Sprite3DTest/girl.c3b",true,0.2,true); + addNewSpriteWithCoords( Vec3(0,0,0),"Sprite3DTest/Girl(1).c3t",true,0.2,true); TTFConfig ttfConfig("fonts/arial.ttf", 20); auto label1 = Label::createWithTTF(ttfConfig,"zoom out"); auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(Camera3DTestDemo::scaleCameraCallback,this,1)); @@ -353,7 +353,6 @@ void Camera3DTestDemo::addNewSpriteWithCoords(Vec3 p,std::string fileName,bool p { auto sprite = Sprite3D::create(fileName); - sprite->setScale(1); _layer3D->addChild(sprite); float globalZOrder=sprite->getGlobalZOrder(); sprite->setPosition3D( Vec3( p.x, p.y,p.z) ); diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 14dff39b25..0047a49e98 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -1173,7 +1173,7 @@ void Sprite3DReskinTest::addNewSpriteWithCoords(Vec2 p) _useShoesId =0; _useHairId = 0; - std::string fileName = "Sprite3DTest/GirlTest.c3b"; + std::string fileName = "Sprite3DTest/ReskinGirl.c3b"; auto sprite = Sprite3D::create(fileName); sprite->setScale(4); sprite->setRotation3D(Vec3(0,0,0)); From fcf4d79b065aabeeb0768979725855aeff0cf2b2 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 20 Aug 2014 19:01:04 +0800 Subject: [PATCH 52/67] setGLProgramState support --- cocos/2d/CCNode.h | 4 ++-- cocos/3d/CCSprite3D.cpp | 23 ++++++++++++++++++++--- cocos/3d/CCSprite3D.h | 6 ++++++ cocos/3d/CCSubMeshState.cpp | 2 ++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index 3d4d7500b4..186d8b3fca 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -961,7 +961,7 @@ public: CC_DEPRECATED_ATTRIBUTE GLProgram* getShaderProgram() const { return getGLProgram(); } GLProgramState *getGLProgramState() const; - void setGLProgramState(GLProgramState *glProgramState); + virtual void setGLProgramState(GLProgramState *glProgramState); /** * Sets the shader program for this node @@ -974,7 +974,7 @@ public: * * @param shaderProgram The shader program */ - void setGLProgram(GLProgram *glprogram); + virtual void setGLProgram(GLProgram *glprogram); CC_DEPRECATED_ATTRIBUTE void setShaderProgram(GLProgram *glprogram) { setGLProgram(glprogram); } /// @} end of Shader Program diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index db52c4ff7a..93d9828ae5 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -414,7 +414,9 @@ void Sprite3D::setTexture(const std::string& texFile) void Sprite3D::setTexture(Texture2D* texture) { - _subMeshStates.at(0)->setTexture(texture); + for (auto& state : _subMeshStates) { + state->setTexture(texture); + } } AttachNode* Sprite3D::getAttachNode(const std::string& boneName) { @@ -474,8 +476,6 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) auto submesh = submeshstate->getSubMesh(); meshCommand.init(_globalZOrder, textureID, programstate, _blend, submesh->getMesh()->getVertexBuffer(), submesh->getIndexBuffer(), (GLenum)submesh->getPrimitiveType(), (GLenum)submesh->getIndexFormat(), submesh->getIndexCount(), transform); - meshCommand.setCullFaceEnabled(true); - meshCommand.setDepthTestEnabled(true); auto skin = submeshstate->getSkin(); if (skin) { @@ -488,11 +488,28 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) } } +void Sprite3D::setGLProgramState(GLProgramState *glProgramState) +{ + Node::setGLProgramState(glProgramState); + for (auto& state : _subMeshStates) { + state->setGLProgramState(glProgramState); + } +} +void Sprite3D::setGLProgram(GLProgram *glprogram) +{ + Node::setGLProgram(glprogram); + setGLProgramState(getGLProgramState()); +} + void Sprite3D::setBlendFunc(const BlendFunc &blendFunc) { if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) { _blend = blendFunc; + for(auto& state : _subMeshStates) + { + state->setBlendFunc(blendFunc); + } } } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 6ffff020c9..e547e551d4 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -91,6 +91,12 @@ public: virtual void setBlendFunc(const BlendFunc &blendFunc) override; virtual const BlendFunc &getBlendFunc() const override; + // overrides + /** set GLProgramState, you should bind attributes by yourself */ + virtual void setGLProgramState(GLProgramState *glProgramState) override; + /** just rember bind attributes */ + virtual void setGLProgram(GLProgram *glprogram) override; + /* * Get AABB * If the sprite has animation, it can't be calculated accuratly, diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index c89e8885c2..99819279d5 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -169,6 +169,8 @@ void SubMeshState::bindMeshCommand() { GLuint texID = _texture ? _texture->getName() : 0; _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh()->getVertexBuffer(), _subMesh->getIndexBuffer(), _blend); + _meshCommand.setCullFaceEnabled(true); + _meshCommand.setDepthTestEnabled(true); } } From 3a69fc9b1475feb68f05e1c9355ccec7a465d8ae Mon Sep 17 00:00:00 2001 From: yangxiao Date: Wed, 20 Aug 2014 19:19:49 +0800 Subject: [PATCH 53/67] rename ModelDataNode to ModelData --- cocos/3d/CCBundle3D.cpp | 11 +++++------ cocos/3d/CCBundle3DData.h | 18 +++++------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 04100375eb..51e676cd91 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -292,10 +292,10 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD meshdata->subMeshIndices.push_back(it.mesh.indices); meshdata->subMeshIds.push_back(str); auto node = new NodeData(); - auto modelnode = new ModelNodeData(); + auto modelnode = new ModelData(); modelnode->matrialId = str; modelnode->subMeshId = str; - modelnode->id = it.name; + node->id = it.name; node->modelNodeDatas.push_back(modelnode); nodedatas.nodes.push_back(node); } @@ -788,10 +788,9 @@ bool Bundle3D::loadNodes(NodeDatas& nodedatas) } nodedatas.skeleton.push_back(nodeDatas[skinData.rootBoneIndex]); auto node= new NodeData(); - auto modelnode = new ModelNodeData(); + auto modelnode = new ModelData(); modelnode->matrialId = ""; modelnode->subMeshId = ""; - modelnode->id = ""; modelnode->bones = skinData.skinBoneNames; modelnode->invBindPose = skinData.inverseBindPoseMatrices; node->modelNodeDatas.push_back(modelnode); @@ -1716,7 +1715,7 @@ NodeData* Bundle3D::parseNodesRecursivelyJson(const rapidjson::Value& jvalue) for (rapidjson::SizeType i = 0; i < parts.Size(); i++) { - ModelNodeData* modelnodedata = new ModelNodeData();; + auto modelnodedata = new ModelData();; const rapidjson::Value& part = parts[i]; modelnodedata->subMeshId = part[MESHPARTID].GetString(); modelnodedata->matrialId = part[MATERIALID].GetString(); @@ -1831,7 +1830,7 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) { for (rapidjson::SizeType i = 0; i < partsSize; i++) { - ModelNodeData* modelnodedata = new ModelNodeData(); + auto modelnodedata = new ModelData(); modelnodedata->subMeshId = _binaryReader.readString(); modelnodedata->matrialId = _binaryReader.readString(); diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index fa60120d7d..f5cc5d3d1c 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -48,13 +48,13 @@ struct MeshVertexAttrib }; -struct ModelNodeData; +struct ModelData; /** Node data, since 3.3 */ struct NodeData { std::string id; Mat4 transform; - std::vector modelNodeDatas; + std::vector modelNodeDatas; std::vector children; virtual ~NodeData() @@ -71,21 +71,18 @@ struct NodeData } children.clear(); } - virtual ModelNodeData* asModelNodeData() - { - return nullptr; - } + }; /** model node data, since 3.3 */ -struct ModelNodeData : public NodeData +struct ModelData { std::string subMeshId; std::string matrialId; std::vector bones; std::vector invBindPose; - virtual ~ModelNodeData() + virtual ~ModelData() { resetData(); } @@ -93,11 +90,6 @@ struct ModelNodeData : public NodeData { bones.clear(); invBindPose.clear(); - NodeData::resetData(); - } - virtual ModelNodeData* asModelNodeData() - { - return this; } }; From 1f349cb3febd0e82be45b074dfa422c234ee8c0e Mon Sep 17 00:00:00 2001 From: lvlong Date: Thu, 21 Aug 2014 10:38:33 +0800 Subject: [PATCH 54/67] fix binary load bug. --- cocos/3d/CCBundle3D.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 51e676cd91..dee749e6c9 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -70,6 +70,7 @@ static const char* NODES = "nodes"; static const char* CHILDREN = "children"; static const char* PARTS = "parts"; static const char* BONES = "bones"; +static const char* SKELETON = "skeleton"; static const char* MATERIALS = "materials"; static const char* ANIMATIONS = "animations"; static const char* TRANSFORM = "transform"; @@ -1677,7 +1678,7 @@ bool Bundle3D::loadNodesJson(NodeDatas& nodedatas) std::string id = jnode[ID].GetString(); NodeData* nodedata = parseNodesRecursivelyJson(jnode); - bool isSkeleton=jnode["skeleton"].GetBool(); + bool isSkeleton = jnode[SKELETON].GetBool(); if (isSkeleton) nodedatas.skeleton.push_back(nodedata); else @@ -1803,11 +1804,16 @@ NodeData* Bundle3D::parseNodesRecursivelyBinary(bool& skeleton) { // id std::string id = _binaryReader.readString(); - if (_binaryReader.read(&skeleton, 1, 1) != 1) + // is skeleton + bool skeleton_; + if (_binaryReader.read(&skeleton_, 1, 1) != 1) { CCASSERT(false, "Failed to read is sleleton"); return nullptr; } + if (skeleton_) + skeleton = true; + // transform Mat4 transform; if (!_binaryReader.readMatrix(transform.m)) From 082689971d993d66f6c25b0c4d24b150add4f93a Mon Sep 17 00:00:00 2001 From: liuliang Date: Thu, 21 Aug 2014 11:23:31 +0800 Subject: [PATCH 55/67] Modify the model resolution --- cocos/3d/CCBundle3D.cpp | 8 +-- cocos/3d/CCSprite3D.cpp | 111 +++++++++++++++++++++++++--------------- cocos/3d/CCSprite3D.h | 2 + 3 files changed, 75 insertions(+), 46 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index 51e676cd91..7b5597d28f 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -56,7 +56,7 @@ static const char* INDEXNUM = "indexnum"; static const char* INDICES = "indices"; static const char* SUBMESH = "submesh"; static const char* ATTRIBUTES = "attributes"; -static const char* SIZE = "size"; +static const char* ATTRIBUTESIZE = "size"; static const char* TYPE = "type"; static const char* ATTRIBUTE = "attribute"; static const char* SKIN = "skin"; @@ -716,7 +716,7 @@ bool Bundle3D::loadMeshDatasJson(MeshDatas& meshdatas) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - int size = mesh_vertex_attribute_val[SIZE].GetInt(); + int size = mesh_vertex_attribute_val[ATTRIBUTESIZE].GetInt(); std::string type = mesh_vertex_attribute_val[TYPE].GetString(); std::string attribute = mesh_vertex_attribute_val[ATTRIBUTE].GetString(); @@ -1008,7 +1008,7 @@ bool Bundle3D::loadMeshDataJson_0_1(MeshDatas& meshdatas) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - meshdata->attribs[i].size = mesh_vertex_attribute_val[SIZE].GetUint(); + meshdata->attribs[i].size = mesh_vertex_attribute_val[ATTRIBUTESIZE].GetUint(); meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[TYPE].GetString()); meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[ATTRIBUTE].GetString()); @@ -1052,7 +1052,7 @@ bool Bundle3D::loadMeshDataJson_0_2(MeshDatas& meshdatas) { const rapidjson::Value& mesh_vertex_attribute_val = mesh_vertex_attribute[i]; - meshdata->attribs[i].size = mesh_vertex_attribute_val[SIZE].GetUint(); + meshdata->attribs[i].size = mesh_vertex_attribute_val[ATTRIBUTESIZE].GetUint(); meshdata->attribs[i].attribSizeBytes = meshdata->attribs[i].size * 4; meshdata->attribs[i].type = parseGLType(mesh_vertex_attribute_val[TYPE].GetString()); meshdata->attribs[i].vertexAttrib = parseGLProgramAttribute(mesh_vertex_attribute_val[ATTRIBUTE].GetString()); diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 93d9828ae5..da17f67db0 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -218,12 +218,77 @@ bool Sprite3D::initFrom(const NodeDatas& nodeDatas, const MeshDatas& meshdatas, createNode(it, this, materialdatas, nodeDatas.nodes.size() == 1); } } - + for(const auto& it : nodeDatas.skeleton) + { + if(it) + { + createAttachSprite3DNode(it,materialdatas); + } + } genGLProgramState(); return true; } +Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,const MaterialDatas& matrialdatas) +{ + auto sprite = new Sprite3D(); + if (sprite) + { + auto subMeshState = SubMeshState::create(nodedata->id); + subMeshState->setSubMesh(getSubMesh(modeldata->subMeshId)); + if (modeldata->matrialId == "" && matrialdatas.materials.size()) + { + const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); + subMeshState->setTexture(textureData->filename); + } + else + { + const NMaterialData* materialData=matrialdatas.getMaterialData(modeldata->matrialId); + if(materialData) + { + const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); + if(textureData) + { + auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); + if(tex) + { + Texture2D::TexParams texParams; + texParams.minFilter = GL_LINEAR; + texParams.magFilter = GL_LINEAR; + texParams.wrapS = textureData->wrapS; + texParams.wrapT = textureData->wrapT; + tex->setTexParameters(texParams); + subMeshState->setTexture(tex); + } + } + } + } + sprite->setAdditionalTransform(&nodedata->transform); + sprite->addSubMeshState(subMeshState); + sprite->autorelease(); + sprite->genGLProgramState(); + } + return sprite; +} +void Sprite3D::createAttachSprite3DNode(NodeData* nodedata,const MaterialDatas& matrialdatas) +{ + for(const auto& it : nodedata->modelNodeDatas) + { + if(it && getAttachNode(nodedata->id)) + { + auto sprite = createSprite3DNode(nodedata,it,matrialdatas); + if (sprite) + { + getAttachNode(nodedata->id)->addChild(sprite); + } + } + } + for(const auto& it : nodedata->children) + { + createAttachSprite3DNode(it,matrialdatas); + } +} void Sprite3D::genGLProgramState() { std::unordered_map glProgramestates; @@ -322,43 +387,9 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m } else { - auto sprite = new Sprite3D(); + auto sprite = createSprite3DNode(nodedata,it,matrialdatas); if (sprite) { - auto subMeshState = SubMeshState::create(nodedata->id); - subMeshState->setSubMesh(getSubMesh(it->subMeshId)); - if (it->matrialId == "" && matrialdatas.materials.size()) - { - const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - subMeshState->setTexture(textureData->filename); - } - else - { - const NMaterialData* materialData=matrialdatas.getMaterialData(it->matrialId); - if(materialData) - { - const NTextureData* textureData = materialData->getTextureData(NTextureData::Usage::Diffuse); - if(textureData) - { - auto tex = Director::getInstance()->getTextureCache()->addImage(textureData->filename); - if(tex) - { - Texture2D::TexParams texParams; - texParams.minFilter = GL_LINEAR; - texParams.magFilter = GL_LINEAR; - texParams.wrapS = textureData->wrapS; - texParams.wrapT = textureData->wrapT; - tex->setTexParameters(texParams); - subMeshState->setTexture(tex); - } - - } - } - } - sprite->setAdditionalTransform(&nodedata->transform); - sprite->addSubMeshState(subMeshState); - sprite->autorelease(); - sprite->genGLProgramState(); if(root) { root->addChild(sprite); @@ -380,13 +411,9 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m } } } - for(int i = 0; i < nodedata->children.size(); i++ ) + for(const auto& it : nodedata->children) { - NodeData* childData = nodedata->children[i]; - if(childData) - { - createNode(childData,node, matrialdatas, singleSprite); - } + createNode(it,node, matrialdatas, singleSprite); } } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index e547e551d4..b035aa9f0e 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -140,6 +140,8 @@ CC_CONSTRUCTOR_ACCESS: void genGLProgramState(); void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas, bool singleSprite); + void createAttachSprite3DNode(NodeData* nodedata,const MaterialDatas& matrialdatas); + Sprite3D* createSprite3DNode(NodeData* nodedata,ModelData* modeldata,const MaterialDatas& matrialdatas); /**get SubMesh by Id*/ SubMesh* getSubMesh(const std::string& subMeshId) const; void addSubMeshState(SubMeshState* subMeshState); From 7753f4c4711e0912ea8b6c480f405f425e24b51a Mon Sep 17 00:00:00 2001 From: lvlong Date: Thu, 21 Aug 2014 13:30:51 +0800 Subject: [PATCH 56/67] modify assert(0) --- cocos/3d/CCBundle3D.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index dee749e6c9..da8ff0fea4 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -981,7 +981,7 @@ bool Bundle3D::loadJson(const std::string& path) _jsonBuffer[size] = '\0'; if (_jsonReader.ParseInsitu<0>(_jsonBuffer).HasParseError()) { - assert(0); + CCASSERT(false, "Parse json failed"); clear(); return false; } @@ -1100,7 +1100,7 @@ bool Bundle3D::loadSkinDataJson(SkinData* skindata) const rapidjson::Value& skin_data_array = _jsonReader[SKIN ]; - assert(skin_data_array.IsArray()); + CCASSERT(skin_data_array.IsArray(), "skin data is not an array"); const rapidjson::Value& skin_data_array_val_0 = skin_data_array[(rapidjson::SizeType)0]; if (!skin_data_array_val_0.HasMember(BONES)) @@ -2009,7 +2009,7 @@ NTextureData::Usage Bundle3D::parseGLTextureType(const std::string& str) } else { - CCASSERT(false, "Wrong GL type"); + CCASSERT(false, "Wrong Texture type"); return NTextureData::Usage::Unknown; } } @@ -2045,7 +2045,7 @@ unsigned int Bundle3D::parseGLProgramAttribute(const std::string& str) } else { - assert(0); + CCASSERT(false, "Wrong Attribute type"); return -1; } } From d00bcbccb088f47397c0978bb3bc418655565260 Mon Sep 17 00:00:00 2001 From: lvlong Date: Thu, 21 Aug 2014 18:14:24 +0800 Subject: [PATCH 57/67] add texture coord2-7 --- cocos/3d/CCBundle3D.cpp | 24 ++++++++++++++++++++++++ cocos/3d/CCSprite3D.cpp | 2 +- cocos/renderer/CCGLProgram.cpp | 12 ++++++++++++ cocos/renderer/CCGLProgram.h | 12 ++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index da8ff0fea4..8ee8ecb374 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -2031,6 +2031,30 @@ unsigned int Bundle3D::parseGLProgramAttribute(const std::string& str) { return GLProgram::VERTEX_ATTRIB_TEX_COORD1; } + else if (str == "VERTEX_ATTRIB_TEX_COORD2") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD2; + } + else if (str == "VERTEX_ATTRIB_TEX_COORD3") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD3; + } + else if (str == "VERTEX_ATTRIB_TEX_COORD4") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD4; + } + else if (str == "VERTEX_ATTRIB_TEX_COORD5") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD5; + } + else if (str == "VERTEX_ATTRIB_TEX_COORD6") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD6; + } + else if (str == "VERTEX_ATTRIB_TEX_COORD7") + { + return GLProgram::VERTEX_ATTRIB_TEX_COORD7; + } else if (str == "VERTEX_ATTRIB_NORMAL") { return GLProgram::VERTEX_ATTRIB_NORMAL; diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 93d9828ae5..5ee02715ac 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -46,7 +46,7 @@ NS_CC_BEGIN -std::string s_attributeNames[] = {GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::ATTRIBUTE_NAME_TEX_COORD1, GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::ATTRIBUTE_NAME_BLEND_WEIGHT, GLProgram::ATTRIBUTE_NAME_BLEND_INDEX}; +std::string s_attributeNames[] = {GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::ATTRIBUTE_NAME_TEX_COORD1, GLProgram::ATTRIBUTE_NAME_TEX_COORD2,GLProgram::ATTRIBUTE_NAME_TEX_COORD3,GLProgram::ATTRIBUTE_NAME_TEX_COORD4,GLProgram::ATTRIBUTE_NAME_TEX_COORD5,GLProgram::ATTRIBUTE_NAME_TEX_COORD6,GLProgram::ATTRIBUTE_NAME_TEX_COORD7,GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::ATTRIBUTE_NAME_BLEND_WEIGHT, GLProgram::ATTRIBUTE_NAME_BLEND_INDEX}; Sprite3D* Sprite3D::create(const std::string &modelPath) { diff --git a/cocos/renderer/CCGLProgram.cpp b/cocos/renderer/CCGLProgram.cpp index 8a6d786731..4b757c5b0f 100644 --- a/cocos/renderer/CCGLProgram.cpp +++ b/cocos/renderer/CCGLProgram.cpp @@ -95,6 +95,12 @@ const char* GLProgram::ATTRIBUTE_NAME_COLOR = "a_color"; const char* GLProgram::ATTRIBUTE_NAME_POSITION = "a_position"; const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD = "a_texCoord"; const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD1 = "a_texCoord1"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD2 = "a_texCoord2"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD3 = "a_texCoord3"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD4 = "a_texCoord4"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD5 = "a_texCoord5"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD6 = "a_texCoord6"; +const char* GLProgram::ATTRIBUTE_NAME_TEX_COORD7 = "a_texCoord7"; const char* GLProgram::ATTRIBUTE_NAME_NORMAL = "a_normal"; const char* GLProgram::ATTRIBUTE_NAME_BLEND_WEIGHT = "a_blendWeight"; const char* GLProgram::ATTRIBUTE_NAME_BLEND_INDEX = "a_blendIndex"; @@ -283,6 +289,12 @@ void GLProgram::bindPredefinedVertexAttribs() {GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORD}, {GLProgram::ATTRIBUTE_NAME_TEX_COORD1, GLProgram::VERTEX_ATTRIB_TEX_COORD1}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD2, GLProgram::VERTEX_ATTRIB_TEX_COORD2}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD3, GLProgram::VERTEX_ATTRIB_TEX_COORD3}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD4, GLProgram::VERTEX_ATTRIB_TEX_COORD4}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD5, GLProgram::VERTEX_ATTRIB_TEX_COORD5}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD6, GLProgram::VERTEX_ATTRIB_TEX_COORD6}, + {GLProgram::ATTRIBUTE_NAME_TEX_COORD7, GLProgram::VERTEX_ATTRIB_TEX_COORD7}, {GLProgram::ATTRIBUTE_NAME_NORMAL, GLProgram::VERTEX_ATTRIB_NORMAL}, }; diff --git a/cocos/renderer/CCGLProgram.h b/cocos/renderer/CCGLProgram.h index 973c2d8d6d..d73519562f 100644 --- a/cocos/renderer/CCGLProgram.h +++ b/cocos/renderer/CCGLProgram.h @@ -85,6 +85,12 @@ public: VERTEX_ATTRIB_COLOR, VERTEX_ATTRIB_TEX_COORD, VERTEX_ATTRIB_TEX_COORD1, + VERTEX_ATTRIB_TEX_COORD2, + VERTEX_ATTRIB_TEX_COORD3, + VERTEX_ATTRIB_TEX_COORD4, + VERTEX_ATTRIB_TEX_COORD5, + VERTEX_ATTRIB_TEX_COORD6, + VERTEX_ATTRIB_TEX_COORD7, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_BLEND_INDEX, @@ -154,6 +160,12 @@ public: static const char* ATTRIBUTE_NAME_POSITION; static const char* ATTRIBUTE_NAME_TEX_COORD; static const char* ATTRIBUTE_NAME_TEX_COORD1; + static const char* ATTRIBUTE_NAME_TEX_COORD2; + static const char* ATTRIBUTE_NAME_TEX_COORD3; + static const char* ATTRIBUTE_NAME_TEX_COORD4; + static const char* ATTRIBUTE_NAME_TEX_COORD5; + static const char* ATTRIBUTE_NAME_TEX_COORD6; + static const char* ATTRIBUTE_NAME_TEX_COORD7; static const char* ATTRIBUTE_NAME_NORMAL; static const char* ATTRIBUTE_NAME_BLEND_WEIGHT; static const char* ATTRIBUTE_NAME_BLEND_INDEX; From 2d5431353a95c0cfbadcd4fff79b4d83d03c7f3c Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 13:25:26 +0800 Subject: [PATCH 58/67] engine adjust --- cocos/3d/CCBundle3DData.h | 9 + cocos/3d/CCMesh.cpp | 702 +++++++++--------- cocos/3d/CCMesh.h | 318 ++++---- cocos/3d/CCSprite3D.cpp | 112 +-- cocos/3d/CCSprite3D.h | 20 +- cocos/3d/CCSubMesh.cpp | 150 ++-- cocos/3d/CCSubMesh.h | 134 ++-- cocos/3d/CCSubMeshState.cpp | 169 ++++- cocos/3d/CCSubMeshState.h | 51 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 36 +- .../Resources/Sprite3DTest/Girl_Lian.png | Bin 0 -> 17362 bytes .../Resources/Sprite3DTest/Girl_Maozi_01.png | Bin 0 -> 20858 bytes .../Sprite3DTest/Girl_Shangshen_01.png | Bin 0 -> 37686 bytes .../Sprite3DTest/Girl_Shangshen_02.png | Bin 0 -> 27318 bytes .../Sprite3DTest/Girl_Shangshen_03.png | Bin 0 -> 2978 bytes .../Resources/Sprite3DTest/Girl_Shou_01.png | Bin 0 -> 14654 bytes .../Resources/Sprite3DTest/Girl_Toufa_01.png | Bin 0 -> 22124 bytes .../Resources/Sprite3DTest/Girl_Toufa_02.png | Bin 0 -> 21774 bytes .../Sprite3DTest/Girl_Xiashen_01.png | Bin 0 -> 27584 bytes .../Sprite3DTest/Girl_Xiashen_02.png | Bin 0 -> 29193 bytes .../Resources/Sprite3DTest/Girl_Xie_01.png | Bin 0 -> 23289 bytes .../Resources/Sprite3DTest/Girl_Xie_02.png | Bin 0 -> 15599 bytes .../Sprite3DTest/Girl_Yanjing_01.png | Bin 0 -> 23067 bytes .../Resources/Sprite3DTest/ReskinGirl.c3b | Bin 0 -> 1221009 bytes .../Resources/Sprite3DTest/Xie_01.png | Bin 0 -> 23289 bytes 25 files changed, 962 insertions(+), 739 deletions(-) create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Lian.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Maozi_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Shangshen_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Shangshen_02.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Shangshen_03.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Shou_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Toufa_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Toufa_02.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Xiashen_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Xiashen_02.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Xie_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Xie_02.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Girl_Yanjing_01.png create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/ReskinGirl.c3b create mode 100644 tests/cpp-tests/Resources/Sprite3DTest/Xie_01.png diff --git a/cocos/3d/CCBundle3DData.h b/cocos/3d/CCBundle3DData.h index f5cc5d3d1c..63c5916c89 100644 --- a/cocos/3d/CCBundle3DData.h +++ b/cocos/3d/CCBundle3DData.h @@ -127,6 +127,15 @@ struct MeshData int attribCount; public: + int getPerVertexSize() const + { + int vertexsize = 0; + for(const auto& attrib : attribs) + { + vertexsize += attrib.attribSizeBytes; + } + return vertexsize; + } void resetData() { vertex.clear(); diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 364f92aca9..165a26fab6 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -47,356 +47,356 @@ using namespace std; NS_CC_BEGIN -bool RenderMeshData::hasVertexAttrib(int attrib) -{ - for (auto itr = _vertexAttribs.begin(); itr != _vertexAttribs.end(); itr++) - { - if ((*itr).vertexAttrib == attrib) - return true; //already has - } - return false; -} - -bool RenderMeshData::init(const std::vector& positions, - const std::vector& normals, - const std::vector& texs, - const std::vector& indices) -{ - CC_ASSERT(positions.size()<65536 * 3 && "index may out of bound"); - - _vertexAttribs.clear(); - - _vertexNum = positions.size() / 3; //number of vertex - if (_vertexNum == 0) - return false; - - if ((normals.size() != 0 && _vertexNum * 3 != normals.size()) || (texs.size() != 0 && _vertexNum * 2 != texs.size())) - return false; - - MeshVertexAttrib meshvertexattrib; - meshvertexattrib.size = 3; - meshvertexattrib.type = GL_FLOAT; - meshvertexattrib.attribSizeBytes = meshvertexattrib.size * sizeof(float); - meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; - _vertexAttribs.push_back(meshvertexattrib); - - //normal - if (normals.size()) - { - //add normal flag - meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; - _vertexAttribs.push_back(meshvertexattrib); - } - // - if (texs.size()) - { - meshvertexattrib.size = 2; - meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; - meshvertexattrib.attribSizeBytes = meshvertexattrib.size * sizeof(float); - _vertexAttribs.push_back(meshvertexattrib); - } - - _vertexs.clear(); - _vertexsizeBytes = calVertexSizeBytes(); - _vertexs.reserve(_vertexNum * _vertexsizeBytes / sizeof(float)); - - bool hasNormal = hasVertexAttrib(GLProgram::VERTEX_ATTRIB_NORMAL); - bool hasTexCoord = hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD); - //position, normal, texCoordinate into _vertexs - for(int i = 0; i < _vertexNum; i++) - { - _vertexs.push_back(positions[i * 3]); - _vertexs.push_back(positions[i * 3 + 1]); - _vertexs.push_back(positions[i * 3 + 2]); - - if (hasNormal) - { - _vertexs.push_back(normals[i * 3]); - _vertexs.push_back(normals[i * 3 + 1]); - _vertexs.push_back(normals[i * 3 + 2]); - } - - if (hasTexCoord) - { - _vertexs.push_back(texs[i * 2]); - _vertexs.push_back(texs[i * 2 + 1]); - } - } - _subMeshIndices = indices; - - return true; -} - -bool RenderMeshData::init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs) -{ - _vertexs = vertices; - _subMeshIndices = indices; - _vertexAttribs = attribs; - - _vertexsizeBytes = calVertexSizeBytes(); - - return true; -} - -int RenderMeshData::calVertexSizeBytes() -{ - int sizeBytes = 0; - for (auto it = _vertexAttribs.begin(); it != _vertexAttribs.end(); it++) { - sizeBytes += (*it).size; - CCASSERT((*it).type == GL_FLOAT, "use float"); - } - sizeBytes *= sizeof(float); - - return sizeBytes; -} - -Mesh::Mesh() -:_vertexBuffer(0) -{ -} - -Mesh::~Mesh() -{ - _subMeshes.clear(); - cleanAndFreeBuffers(); -} - -Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices) -{ - std::vector submeshIndices; - submeshIndices.push_back(indices); - return create(positions, normals, texs, submeshIndices); -} - -Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) -{ - auto mesh = new Mesh(); - if(mesh && mesh->init(positions, normals, texs, indices)) - { - mesh->autorelease(); - return mesh; - } - CC_SAFE_DELETE(mesh); - return nullptr; -} - -Mesh* Mesh::create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, const std::vector& attribs) -{ - std::vector submeshIndices; - submeshIndices.push_back(indices); - return create(vertices, vertexSizeInFloat, submeshIndices, attribs); -} - -Mesh* Mesh::create(const std::vector &vertices, int vertexSizeInFloat, const std::vector &indices, const std::vector &attribs) -{ - auto mesh = new Mesh(); - if (mesh && mesh->init(vertices, vertexSizeInFloat, indices, attribs)) - { - mesh->autorelease(); - return mesh; - } - CC_SAFE_DELETE(mesh); - return nullptr; -} - -Mesh* Mesh::create(const MeshData& meshdata) -{ - auto mesh = new Mesh(); - if (mesh && mesh->init(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs)) - { - for (int i = 0; i < (int)mesh->getSubMeshCount(); i++) { - auto submesh = mesh->getSubMesh(i); - if (meshdata.subMeshIds.size()) - submesh->_id = meshdata.subMeshIds[i]; - submesh->_mesh = mesh; - } - } - mesh->autorelease(); - return mesh; -} - -bool Mesh::init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) -{ - bool bRet = _renderdata.init(positions, normals, texs, indices); - if (!bRet) - return false; - - buildSubMeshes(); - - buildBuffer(); - - return true; -} - - -bool Mesh::init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs) -{ - bool bRet = _renderdata.init(vertices, vertexSizeInFloat, indices, attribs); - if (!bRet) - return false; - - buildSubMeshes(); - - buildBuffer(); - - return true; -} - -void Mesh::buildSubMeshes() -{ - _subMeshes.clear(); - for (auto& it : _renderdata._subMeshIndices) { - auto subMesh = SubMesh::create(PrimitiveType::TRIANGLES, IndexFormat::INDEX16, it); - _subMeshes.pushBack(subMesh); - - //calculate aabb for sub mesh - AABB aabb; - int stride = _renderdata._vertexsizeBytes / sizeof(float); - for(const auto& index : it) - { - Vec3 point = Vec3(_renderdata._vertexs[index * stride ], _renderdata._vertexs[ index * stride + 1], _renderdata._vertexs[index * stride + 2 ]); - aabb.updateMinMax(&point, 1); - } - subMesh->_aabb = aabb; - } -} - -void Mesh::cleanAndFreeBuffers() -{ - if(glIsBuffer(_vertexBuffer)) - { - glDeleteBuffers(1, &_vertexBuffer); - _vertexBuffer = 0; - } - - for (auto& it : _subMeshes) { - (*it).cleanAndFreeBuffers(); - } -} - -void Mesh::buildBuffer() -{ - cleanAndFreeBuffers(); - - glGenBuffers(1, &_vertexBuffer); - glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); - - glBufferData(GL_ARRAY_BUFFER, - _renderdata._vertexs.size() * sizeof(_renderdata._vertexs[0]), - &_renderdata._vertexs[0], - GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - for (size_t i = 0; i < _subMeshes.size(); i++) { - _subMeshes.at(i)->buildBuffer(_renderdata._subMeshIndices[i]); - } -} - -void Mesh::restore() -{ - _vertexBuffer = 0; - for (auto& it : _subMeshes) { - it->_indexBuffer = 0; - } - - buildBuffer(); -} - -SubMesh* Mesh::getSubMeshById(const std::string& subMeshId) const -{ - for (auto it : _subMeshes) { - if (it->getSubMeshId() == subMeshId) - return it; - } - return nullptr; -} - -/** - * MeshCache - */ -MeshCache* MeshCache::_cacheInstance = nullptr; - -MeshCache* MeshCache::getInstance() -{ - if (_cacheInstance == nullptr) - _cacheInstance = new MeshCache(); - - return _cacheInstance; -} -void MeshCache::destroyInstance() -{ - if (_cacheInstance) - CC_SAFE_DELETE(_cacheInstance); -} - -Mesh* MeshCache::getMesh(const std::string& key) const -{ - auto it = _meshes.find(key); - if (it != _meshes.end()) - return it->second; - - return nullptr; -} - -bool MeshCache::addMesh(const std::string& key, Mesh* mesh) -{ - auto it = _meshes.find(key); - if (it == _meshes.end()) - { - mesh->retain(); - _meshes[key] = mesh; - - return true; - } - return false; -} - -void MeshCache::removeAllMeshes() -{ - for (auto it : _meshes) { - CC_SAFE_RELEASE(it.second); - } - _meshes.clear(); -} - -void MeshCache::removeUnusedMesh() -{ - for( auto it=_meshes.cbegin(); it!=_meshes.cend(); /* nothing */) { - if(it->second->getReferenceCount() == 1) - { - it->second->release(); - _meshes.erase(it++); - } - else - ++it; - } -} - -MeshCache::MeshCache() -{ -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) - // listen the event that renderer was recreated on Android/WP8 - _rendererRecreatedListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, CC_CALLBACK_1(MeshCache::listenRendererRecreated, this)); - Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_rendererRecreatedListener, -1); -#endif -} -MeshCache::~MeshCache() -{ - removeAllMeshes(); -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) - Director::getInstance()->getEventDispatcher()->removeEventListener(_rendererRecreatedListener); -#endif -} - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) -void MeshCache::listenRendererRecreated(EventCustom* event) -{ - for (auto iter = _meshes.begin(); iter != _meshes.end(); ++iter) - { - auto mesh = iter->second; - mesh->restore(); - } -} -#endif +//bool RenderMeshData::hasVertexAttrib(int attrib) +//{ +// for (auto itr = _vertexAttribs.begin(); itr != _vertexAttribs.end(); itr++) +// { +// if ((*itr).vertexAttrib == attrib) +// return true; //already has +// } +// return false; +//} +// +//bool RenderMeshData::init(const std::vector& positions, +// const std::vector& normals, +// const std::vector& texs, +// const std::vector& indices) +//{ +// CC_ASSERT(positions.size()<65536 * 3 && "index may out of bound"); +// +// _vertexAttribs.clear(); +// +// _vertexNum = positions.size() / 3; //number of vertex +// if (_vertexNum == 0) +// return false; +// +// if ((normals.size() != 0 && _vertexNum * 3 != normals.size()) || (texs.size() != 0 && _vertexNum * 2 != texs.size())) +// return false; +// +// MeshVertexAttrib meshvertexattrib; +// meshvertexattrib.size = 3; +// meshvertexattrib.type = GL_FLOAT; +// meshvertexattrib.attribSizeBytes = meshvertexattrib.size * sizeof(float); +// meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; +// _vertexAttribs.push_back(meshvertexattrib); +// +// //normal +// if (normals.size()) +// { +// //add normal flag +// meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; +// _vertexAttribs.push_back(meshvertexattrib); +// } +// // +// if (texs.size()) +// { +// meshvertexattrib.size = 2; +// meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; +// meshvertexattrib.attribSizeBytes = meshvertexattrib.size * sizeof(float); +// _vertexAttribs.push_back(meshvertexattrib); +// } +// +// _vertexs.clear(); +// _vertexsizeBytes = calVertexSizeBytes(); +// _vertexs.reserve(_vertexNum * _vertexsizeBytes / sizeof(float)); +// +// bool hasNormal = hasVertexAttrib(GLProgram::VERTEX_ATTRIB_NORMAL); +// bool hasTexCoord = hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD); +// //position, normal, texCoordinate into _vertexs +// for(int i = 0; i < _vertexNum; i++) +// { +// _vertexs.push_back(positions[i * 3]); +// _vertexs.push_back(positions[i * 3 + 1]); +// _vertexs.push_back(positions[i * 3 + 2]); +// +// if (hasNormal) +// { +// _vertexs.push_back(normals[i * 3]); +// _vertexs.push_back(normals[i * 3 + 1]); +// _vertexs.push_back(normals[i * 3 + 2]); +// } +// +// if (hasTexCoord) +// { +// _vertexs.push_back(texs[i * 2]); +// _vertexs.push_back(texs[i * 2 + 1]); +// } +// } +// _subMeshIndices = indices; +// +// return true; +//} +// +//bool RenderMeshData::init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs) +//{ +// _vertexs = vertices; +// _subMeshIndices = indices; +// _vertexAttribs = attribs; +// +// _vertexsizeBytes = calVertexSizeBytes(); +// +// return true; +//} +// +//int RenderMeshData::calVertexSizeBytes() +//{ +// int sizeBytes = 0; +// for (auto it = _vertexAttribs.begin(); it != _vertexAttribs.end(); it++) { +// sizeBytes += (*it).size; +// CCASSERT((*it).type == GL_FLOAT, "use float"); +// } +// sizeBytes *= sizeof(float); +// +// return sizeBytes; +//} +// +//Mesh::Mesh() +//:_vertexBuffer(0) +//{ +//} +// +//Mesh::~Mesh() +//{ +// _subMeshes.clear(); +// cleanAndFreeBuffers(); +//} +// +//Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices) +//{ +// std::vector submeshIndices; +// submeshIndices.push_back(indices); +// return create(positions, normals, texs, submeshIndices); +//} +// +//Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) +//{ +// auto mesh = new Mesh(); +// if(mesh && mesh->init(positions, normals, texs, indices)) +// { +// mesh->autorelease(); +// return mesh; +// } +// CC_SAFE_DELETE(mesh); +// return nullptr; +//} +// +//Mesh* Mesh::create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, const std::vector& attribs) +//{ +// std::vector submeshIndices; +// submeshIndices.push_back(indices); +// return create(vertices, vertexSizeInFloat, submeshIndices, attribs); +//} +// +//Mesh* Mesh::create(const std::vector &vertices, int vertexSizeInFloat, const std::vector &indices, const std::vector &attribs) +//{ +// auto mesh = new Mesh(); +// if (mesh && mesh->init(vertices, vertexSizeInFloat, indices, attribs)) +// { +// mesh->autorelease(); +// return mesh; +// } +// CC_SAFE_DELETE(mesh); +// return nullptr; +//} +// +//Mesh* Mesh::create(const MeshData& meshdata) +//{ +// auto mesh = new Mesh(); +// if (mesh && mesh->init(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs)) +// { +// for (int i = 0; i < (int)mesh->getSubMeshCount(); i++) { +// auto submesh = mesh->getSubMesh(i); +// if (meshdata.subMeshIds.size()) +// submesh->_id = meshdata.subMeshIds[i]; +// submesh->_mesh = mesh; +// } +// } +// mesh->autorelease(); +// return mesh; +//} +// +//bool Mesh::init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) +//{ +// bool bRet = _renderdata.init(positions, normals, texs, indices); +// if (!bRet) +// return false; +// +// buildSubMeshes(); +// +// buildBuffer(); +// +// return true; +//} +// +// +//bool Mesh::init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs) +//{ +// bool bRet = _renderdata.init(vertices, vertexSizeInFloat, indices, attribs); +// if (!bRet) +// return false; +// +// buildSubMeshes(); +// +// buildBuffer(); +// +// return true; +//} +// +//void Mesh::buildSubMeshes() +//{ +// _subMeshes.clear(); +// for (auto& it : _renderdata._subMeshIndices) { +// auto subMesh = SubMesh::create(PrimitiveType::TRIANGLES, IndexFormat::INDEX16, it); +// _subMeshes.pushBack(subMesh); +// +// //calculate aabb for sub mesh +// AABB aabb; +// int stride = _renderdata._vertexsizeBytes / sizeof(float); +// for(const auto& index : it) +// { +// Vec3 point = Vec3(_renderdata._vertexs[index * stride ], _renderdata._vertexs[ index * stride + 1], _renderdata._vertexs[index * stride + 2 ]); +// aabb.updateMinMax(&point, 1); +// } +// subMesh->_aabb = aabb; +// } +//} +// +//void Mesh::cleanAndFreeBuffers() +//{ +// if(glIsBuffer(_vertexBuffer)) +// { +// glDeleteBuffers(1, &_vertexBuffer); +// _vertexBuffer = 0; +// } +// +// for (auto& it : _subMeshes) { +// (*it).cleanAndFreeBuffers(); +// } +//} +// +//void Mesh::buildBuffer() +//{ +// cleanAndFreeBuffers(); +// +// glGenBuffers(1, &_vertexBuffer); +// glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); +// +// glBufferData(GL_ARRAY_BUFFER, +// _renderdata._vertexs.size() * sizeof(_renderdata._vertexs[0]), +// &_renderdata._vertexs[0], +// GL_STATIC_DRAW); +// glBindBuffer(GL_ARRAY_BUFFER, 0); +// +// for (size_t i = 0; i < _subMeshes.size(); i++) { +// _subMeshes.at(i)->buildBuffer(_renderdata._subMeshIndices[i]); +// } +//} +// +//void Mesh::restore() +//{ +// _vertexBuffer = 0; +// for (auto& it : _subMeshes) { +// it->_indexBuffer = 0; +// } +// +// buildBuffer(); +//} +// +//SubMesh* Mesh::getSubMeshById(const std::string& subMeshId) const +//{ +// for (auto it : _subMeshes) { +// if (it->getSubMeshId() == subMeshId) +// return it; +// } +// return nullptr; +//} +// +///** +// * MeshCache +// */ +//MeshCache* MeshCache::_cacheInstance = nullptr; +// +//MeshCache* MeshCache::getInstance() +//{ +// if (_cacheInstance == nullptr) +// _cacheInstance = new MeshCache(); +// +// return _cacheInstance; +//} +//void MeshCache::destroyInstance() +//{ +// if (_cacheInstance) +// CC_SAFE_DELETE(_cacheInstance); +//} +// +//Mesh* MeshCache::getMesh(const std::string& key) const +//{ +// auto it = _meshes.find(key); +// if (it != _meshes.end()) +// return it->second; +// +// return nullptr; +//} +// +//bool MeshCache::addMesh(const std::string& key, Mesh* mesh) +//{ +// auto it = _meshes.find(key); +// if (it == _meshes.end()) +// { +// mesh->retain(); +// _meshes[key] = mesh; +// +// return true; +// } +// return false; +//} +// +//void MeshCache::removeAllMeshes() +//{ +// for (auto it : _meshes) { +// CC_SAFE_RELEASE(it.second); +// } +// _meshes.clear(); +//} +// +//void MeshCache::removeUnusedMesh() +//{ +// for( auto it=_meshes.cbegin(); it!=_meshes.cend(); /* nothing */) { +// if(it->second->getReferenceCount() == 1) +// { +// it->second->release(); +// _meshes.erase(it++); +// } +// else +// ++it; +// } +//} +// +//MeshCache::MeshCache() +//{ +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) +// // listen the event that renderer was recreated on Android/WP8 +// _rendererRecreatedListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, CC_CALLBACK_1(MeshCache::listenRendererRecreated, this)); +// Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_rendererRecreatedListener, -1); +//#endif +//} +//MeshCache::~MeshCache() +//{ +// removeAllMeshes(); +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) +// Director::getInstance()->getEventDispatcher()->removeEventListener(_rendererRecreatedListener); +//#endif +//} +// +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) +//void MeshCache::listenRendererRecreated(EventCustom* event) +//{ +// for (auto iter = _meshes.begin(); iter != _meshes.end(); ++iter) +// { +// auto mesh = iter->second; +// mesh->restore(); +// } +//} +//#endif NS_CC_END diff --git a/cocos/3d/CCMesh.h b/cocos/3d/CCMesh.h index dafaceb54e..0a20a1a7be 100644 --- a/cocos/3d/CCMesh.h +++ b/cocos/3d/CCMesh.h @@ -46,165 +46,165 @@ NS_CC_BEGIN class EventListenerCustom; class EventCustom; -class CC_3D_DLL RenderMeshData -{ - typedef std::vector IndexArray; - friend class Mesh; -public: - RenderMeshData(): _vertexsizeBytes(0) - { - } - bool hasVertexAttrib(int attrib); - bool init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& subMeshIndices); - bool init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); - -protected: - - int calVertexSizeBytes(); - - int _vertexsizeBytes; - ssize_t _vertexNum; - std::vector _vertexs; - std::vector _subMeshIndices; - std::vector _vertexAttribs; -}; - -/** - * Mesh: Geometry with a collection of vertex. - * Supporting various vertex formats. - */ -class CC_3D_DLL Mesh : public Ref -{ - typedef std::vector IndexArray; -public: - /**create mesh from positions, normals, and so on, sigle SubMesh*/ - static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices); - - /**create mesh from positions, normals, and so on, multi-SubMesh*/ - static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& subMeshIndices); - - /**create mesh with vertex attributes*/ - CC_DEPRECATED_ATTRIBUTE static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, int numIndex, const std::vector& attribs, int attribCount) { return create(vertices, vertexSizeInFloat, indices, attribs); } - - /** - * create Mesh - * @param vertices vertices buffer data - * @param vertexSizeInFloat size of each vertex - * @param indices index buffer data that denotes how to connect the vertex, sigle SubMesh - * @param attribs vertex attributes - */ - static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, const std::vector& attribs); - - /** - * create Mesh - * @param vertices vertices buffer data - * @param vertexSizeInFloat size of each vertex - * @param subMeshIndices index buffer data that denotes how to connect the vertex, multi-SubMesh - * @param attribs vertex attributes - */ - static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); - - static Mesh* create(const MeshData& meshdata); - - /**get vertex buffer*/ - inline GLuint getVertexBuffer() const { return _vertexBuffer; } - - /**get mesh vertex attribute count*/ - ssize_t getMeshVertexAttribCount() const { return _renderdata._vertexAttribs.size(); } - /**get MeshVertexAttribute by index*/ - const MeshVertexAttrib& getMeshVertexAttribute(int idx) const { return _renderdata._vertexAttribs[idx]; } - /**has vertex attribute?*/ - bool hasVertexAttrib(int attrib) { return _renderdata.hasVertexAttrib(attrib); } - /**get per vertex size in bytes*/ - int getVertexSizeInBytes() const { return _renderdata._vertexsizeBytes; } - - /**get sub mesh count*/ - ssize_t getSubMeshCount() const { return _subMeshes.size(); } - - /**get sub mesh by index*/ - SubMesh* getSubMesh(int index) const { return _subMeshes.at(index); } - - /**build vertex buffer from renderdata*/ - void restore(); - - /** get submesh by id */ - SubMesh* getSubMeshById(const std::string& subMeshId) const; - - /**to be deprecated, those functions have been moved to SubMesh*/ - /** get primitive type*/ - CC_DEPRECATED_ATTRIBUTE PrimitiveType getPrimitiveType() const { return _subMeshes.at(0)->getPrimitiveType(); } - /**get index count*/ - CC_DEPRECATED_ATTRIBUTE ssize_t getIndexCount() const { return _subMeshes.at(0)->getIndexCount(); } - /**get index format*/ - CC_DEPRECATED_ATTRIBUTE IndexFormat getIndexFormat() const { return _subMeshes.at(0)->getIndexFormat(); } - /**get index buffer*/ - CC_DEPRECATED_ATTRIBUTE GLuint getIndexBuffer() const {return _subMeshes.at(0)->getIndexBuffer(); } - -CC_CONSTRUCTOR_ACCESS: - - Mesh(); - virtual ~Mesh(); - /**init mesh*/ - bool init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices); - - /**init mesh*/ - bool init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs); - - /**build sub meshes*/ - void buildSubMeshes(); - /**build buffer*/ - void buildBuffer(); - /**free buffer*/ - void cleanAndFreeBuffers(); - -protected: - GLuint _vertexBuffer; - Vector _subMeshes; - - RenderMeshData _renderdata; -}; - -/** - * Mesh Cache - */ -class MeshCache -{ -public: - /**get & destroy*/ - static MeshCache* getInstance(); - static void destroyInstance(); - - /**get mesh from cache*/ - Mesh* getMesh(const std::string& key) const; - - /**add mesh to cache*/ - bool addMesh(const std::string& key, Mesh* mesh); - - /**remove all meshes*/ - void removeAllMeshes(); - - /**remove unused meshes*/ - void removeUnusedMesh(); - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) - void listenRendererRecreated(EventCustom* event); -#endif - -CC_CONSTRUCTOR_ACCESS: - - MeshCache(); - ~MeshCache(); - -protected: - - static MeshCache* _cacheInstance;//instance - - std::unordered_map _meshes; //cached meshes - -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) - EventListenerCustom* _rendererRecreatedListener; -#endif -}; +//class CC_3D_DLL RenderMeshData +//{ +// typedef std::vector IndexArray; +// friend class Mesh; +//public: +// RenderMeshData(): _vertexsizeBytes(0) +// { +// } +// bool hasVertexAttrib(int attrib); +// bool init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& subMeshIndices); +// bool init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); +// +//protected: +// +// int calVertexSizeBytes(); +// +// int _vertexsizeBytes; +// ssize_t _vertexNum; +// std::vector _vertexs; +// std::vector _subMeshIndices; +// std::vector _vertexAttribs; +//}; +// +///** +// * Mesh: Geometry with a collection of vertex. +// * Supporting various vertex formats. +// */ +//class CC_3D_DLL Mesh : public Ref +//{ +// typedef std::vector IndexArray; +//public: +// /**create mesh from positions, normals, and so on, sigle SubMesh*/ +// static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices); +// +// /**create mesh from positions, normals, and so on, multi-SubMesh*/ +// static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& subMeshIndices); +// +// /**create mesh with vertex attributes*/ +// CC_DEPRECATED_ATTRIBUTE static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, int numIndex, const std::vector& attribs, int attribCount) { return create(vertices, vertexSizeInFloat, indices, attribs); } +// +// /** +// * create Mesh +// * @param vertices vertices buffer data +// * @param vertexSizeInFloat size of each vertex +// * @param indices index buffer data that denotes how to connect the vertex, sigle SubMesh +// * @param attribs vertex attributes +// */ +// static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, const std::vector& attribs); +// +// /** +// * create Mesh +// * @param vertices vertices buffer data +// * @param vertexSizeInFloat size of each vertex +// * @param subMeshIndices index buffer data that denotes how to connect the vertex, multi-SubMesh +// * @param attribs vertex attributes +// */ +// static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); +// +// static Mesh* create(const MeshData& meshdata); +// +// /**get vertex buffer*/ +// inline GLuint getVertexBuffer() const { return _vertexBuffer; } +// +// /**get mesh vertex attribute count*/ +// ssize_t getMeshVertexAttribCount() const { return _renderdata._vertexAttribs.size(); } +// /**get MeshVertexAttribute by index*/ +// const MeshVertexAttrib& getMeshVertexAttribute(int idx) const { return _renderdata._vertexAttribs[idx]; } +// /**has vertex attribute?*/ +// bool hasVertexAttrib(int attrib) { return _renderdata.hasVertexAttrib(attrib); } +// /**get per vertex size in bytes*/ +// int getVertexSizeInBytes() const { return _renderdata._vertexsizeBytes; } +// +// /**get sub mesh count*/ +// ssize_t getSubMeshCount() const { return _subMeshes.size(); } +// +// /**get sub mesh by index*/ +// SubMesh* getSubMesh(int index) const { return _subMeshes.at(index); } +// +// /**build vertex buffer from renderdata*/ +// void restore(); +// +// /** get submesh by id */ +// SubMesh* getSubMeshById(const std::string& subMeshId) const; +// +// /**to be deprecated, those functions have been moved to SubMesh*/ +// /** get primitive type*/ +// CC_DEPRECATED_ATTRIBUTE PrimitiveType getPrimitiveType() const { return _subMeshes.at(0)->getPrimitiveType(); } +// /**get index count*/ +// CC_DEPRECATED_ATTRIBUTE ssize_t getIndexCount() const { return _subMeshes.at(0)->getIndexCount(); } +// /**get index format*/ +// CC_DEPRECATED_ATTRIBUTE IndexFormat getIndexFormat() const { return _subMeshes.at(0)->getIndexFormat(); } +// /**get index buffer*/ +// CC_DEPRECATED_ATTRIBUTE GLuint getIndexBuffer() const {return _subMeshes.at(0)->getIndexBuffer(); } +// +//CC_CONSTRUCTOR_ACCESS: +// +// Mesh(); +// virtual ~Mesh(); +// /**init mesh*/ +// bool init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices); +// +// /**init mesh*/ +// bool init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs); +// +// /**build sub meshes*/ +// void buildSubMeshes(); +// /**build buffer*/ +// void buildBuffer(); +// /**free buffer*/ +// void cleanAndFreeBuffers(); +// +//protected: +// GLuint _vertexBuffer; +// Vector _subMeshes; +// +// RenderMeshData _renderdata; +//}; +// +///** +// * Mesh Cache +// */ +//class MeshCache +//{ +//public: +// /**get & destroy*/ +// static MeshCache* getInstance(); +// static void destroyInstance(); +// +// /**get mesh from cache*/ +// Mesh* getMesh(const std::string& key) const; +// +// /**add mesh to cache*/ +// bool addMesh(const std::string& key, Mesh* mesh); +// +// /**remove all meshes*/ +// void removeAllMeshes(); +// +// /**remove unused meshes*/ +// void removeUnusedMesh(); +// +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) +// void listenRendererRecreated(EventCustom* event); +//#endif +// +//CC_CONSTRUCTOR_ACCESS: +// +// MeshCache(); +// ~MeshCache(); +// +//protected: +// +// static MeshCache* _cacheInstance;//instance +// +// std::unordered_map _meshes; //cached meshes +// +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) +// EventListenerCustom* _rendererRecreatedListener; +//#endif +//}; NS_CC_END diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index da17f67db0..9fd77bea89 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -78,8 +78,8 @@ bool Sprite3D::loadFromCache(const std::string& path) auto spritedata = Sprite3DCache::getInstance()->getSpriteData(path); if (spritedata) { - for (auto it : spritedata->meshes) { - _meshes.pushBack(it); + for (auto it : spritedata->meshVertexDatas) { + _meshVertexDatas.pushBack(it); } _skeleton = Skeleton3D::create(spritedata->nodedatas->skeleton); CC_SAFE_RETAIN(_skeleton); @@ -114,7 +114,7 @@ bool Sprite3D::loadFromObj(const std::string& path) auto data = new Sprite3DCache::Sprite3DData(); data->materialdatas = materialdatas; data->nodedatas = nodeDatas; - data->meshes = _meshes; + data->meshVertexDatas = _meshVertexDatas; Sprite3DCache::getInstance()->addSprite3DData(path, data); return true; } @@ -144,7 +144,7 @@ bool Sprite3D::loadFromC3x(const std::string& path) auto data = new Sprite3DCache::Sprite3DData(); data->materialdatas = materialdatas; data->nodedatas = nodeDatas; - data->meshes = _meshes; + data->meshVertexDatas = _meshVertexDatas; Sprite3DCache::getInstance()->addSprite3DData(path, data); return true; } @@ -164,18 +164,18 @@ Sprite3D::Sprite3D() Sprite3D::~Sprite3D() { - _subMeshStates.clear(); _glProgramStates.clear(); _meshes.clear(); + _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); } bool Sprite3D::initWithFile(const std::string &path) { - _subMeshStates.clear(); _meshes.clear(); _glProgramStates.clear(); + _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); @@ -204,8 +204,10 @@ bool Sprite3D::initFrom(const NodeDatas& nodeDatas, const MeshDatas& meshdatas, { if(it) { - Mesh* mesh = Mesh::create(*it); - _meshes.pushBack(mesh); +// Mesh* mesh = Mesh::create(*it); +// _meshes.pushBack(mesh); + auto meshvertex = MeshVertexData::create(*it); + _meshVertexDatas.pushBack(meshvertex); } } _skeleton = Skeleton3D::create(nodeDatas.skeleton); @@ -234,12 +236,11 @@ Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,c auto sprite = new Sprite3D(); if (sprite) { - auto subMeshState = SubMeshState::create(nodedata->id); - subMeshState->setSubMesh(getSubMesh(modeldata->subMeshId)); + auto mesh = Mesh::create(nodedata->id, getMeshIndexData(modeldata->subMeshId)); if (modeldata->matrialId == "" && matrialdatas.materials.size()) { const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - subMeshState->setTexture(textureData->filename); + mesh->setTexture(textureData->filename); } else { @@ -258,14 +259,14 @@ Sprite3D* Sprite3D::createSprite3DNode(NodeData* nodedata,ModelData* modeldata,c texParams.wrapS = textureData->wrapS; texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); - subMeshState->setTexture(tex); + mesh->setTexture(tex); } } } } sprite->setAdditionalTransform(&nodedata->transform); - sprite->addSubMeshState(subMeshState); + sprite->addMesh(mesh); sprite->autorelease(); sprite->genGLProgramState(); } @@ -291,8 +292,8 @@ void Sprite3D::createAttachSprite3DNode(NodeData* nodedata,const MaterialDatas& } void Sprite3D::genGLProgramState() { - std::unordered_map glProgramestates; - for(auto& mesh : _meshes) + std::unordered_map glProgramestates; + for(auto& mesh : _meshVertexDatas) { bool textured = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD); bool hasSkin = mesh->hasVertexAttrib(GLProgram::VERTEX_ATTRIB_BLEND_INDEX) @@ -315,12 +316,12 @@ void Sprite3D::genGLProgramState() long offset = 0; auto attributeCount = mesh->getMeshVertexAttribCount(); for (auto k = 0; k < attributeCount; k++) { - auto meshattribute = mesh->getMeshVertexAttribute(k); + auto meshattribute = mesh->getMeshVertexAttrib(k); programstate->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, - mesh->getVertexSizeInBytes(), + mesh->getVertexBuffer()->getSizePerVertex(), (GLvoid*)offset); offset += meshattribute.attribSizeBytes; } @@ -329,8 +330,9 @@ void Sprite3D::genGLProgramState() glProgramestates[mesh] = programstate; } - for (auto& it : _subMeshStates) { - it->setGLProgramState(glProgramestates[it->getSubMesh()->getMesh()]); + for (auto& it : _meshes) { + auto glProgramState = glProgramestates[it->getMeshIndexData()->getMeshVertexData()]; + it->setGLProgramState(glProgramState); } } @@ -343,22 +345,21 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m { if(it->bones.size() > 0 || singleSprite) { - auto subMeshState = SubMeshState::create(nodedata->id); - if(subMeshState) + auto mesh = Mesh::create(nodedata->id, getMeshIndexData(it->subMeshId)); + if(mesh) { - _subMeshStates.pushBack(subMeshState); - subMeshState->setSubMesh(getSubMesh(it->subMeshId)); + _meshes.pushBack(mesh); if (_skeleton && it->bones.size()) { auto skin = MeshSkin::create(_skeleton, it->bones, it->invBindPose); - subMeshState->setSkin(skin); + mesh->setSkin(skin); } - subMeshState->_visibleChanged = std::bind(&Sprite3D::onAABBDirty, this); + mesh->_visibleChanged = std::bind(&Sprite3D::onAABBDirty, this); if (it->matrialId == "" && matrialdatas.materials.size()) { const NTextureData* textureData = matrialdatas.materials[0].getTextureData(NTextureData::Usage::Diffuse); - subMeshState->setTexture(textureData->filename); + mesh->setTexture(textureData->filename); } else { @@ -377,7 +378,7 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m texParams.wrapS = textureData->wrapS; texParams.wrapT = textureData->wrapT; tex->setTexParameters(texParams); - subMeshState->setTexture(tex); + mesh->setTexture(tex); } } @@ -417,20 +418,21 @@ void Sprite3D::createNode(NodeData* nodedata, Node* root, const MaterialDatas& m } } -SubMesh* Sprite3D::getSubMesh(const std::string& subMeshId) const +MeshIndexData* Sprite3D::getMeshIndexData(const std::string& indexId) const { - for (auto it : _meshes) { - auto subMesh = it->getSubMeshById(subMeshId); - if (subMesh) - return subMesh; + for (auto it : _meshVertexDatas) { + auto index = it->getMeshIndexDataById(indexId); + if (index) + return index; } return nullptr; } -void Sprite3D::addSubMeshState(SubMeshState* subMeshState) +void Sprite3D::addMesh(Mesh* mesh) { - _meshes.pushBack(subMeshState->getSubMesh()->getMesh()); - _subMeshStates.pushBack(subMeshState); + auto meshVertex = mesh->getMeshIndexData()->_vertexData; + _meshVertexDatas.pushBack(meshVertex); + _meshes.pushBack(mesh); } void Sprite3D::setTexture(const std::string& texFile) @@ -441,7 +443,7 @@ void Sprite3D::setTexture(const std::string& texFile) void Sprite3D::setTexture(Texture2D* texture) { - for (auto& state : _subMeshStates) { + for (auto& state : _meshes) { state->setTexture(texture); } } @@ -490,20 +492,20 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) color.a = getDisplayedOpacity() / 255.0f; int i = 0; - for (auto& submeshstate : _subMeshStates) { - if (!submeshstate->isVisible()) + for (auto& mesh : _meshes) { + if (!mesh->isVisible()) { i++; continue; } - auto programstate = submeshstate->getGLProgramState(); - auto& meshCommand = submeshstate->getMeshCommand(); + auto programstate = mesh->getGLProgramState(); + auto& meshCommand = mesh->getMeshCommand(); - GLuint textureID = submeshstate->getTexture() ? submeshstate->getTexture()->getName() : 0; - auto submesh = submeshstate->getSubMesh(); - meshCommand.init(_globalZOrder, textureID, programstate, _blend, submesh->getMesh()->getVertexBuffer(), submesh->getIndexBuffer(), (GLenum)submesh->getPrimitiveType(), (GLenum)submesh->getIndexFormat(), submesh->getIndexCount(), transform); + GLuint textureID = mesh->getTexture() ? mesh->getTexture()->getName() : 0; - auto skin = submeshstate->getSkin(); + meshCommand.init(_globalZOrder, textureID, programstate, _blend, mesh->getVertexBuffer(), mesh->getIndexBuffer(), mesh->getPrimitiveType(), mesh->getIndexFormat(), mesh->getIndexCount(), transform); + + auto skin = mesh->getSkin(); if (skin) { meshCommand.setMatrixPaletteSize((int)skin->getMatrixPaletteSize()); @@ -518,7 +520,7 @@ void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) void Sprite3D::setGLProgramState(GLProgramState *glProgramState) { Node::setGLProgramState(glProgramState); - for (auto& state : _subMeshStates) { + for (auto& state : _meshes) { state->setGLProgramState(glProgramState); } } @@ -533,7 +535,7 @@ void Sprite3D::setBlendFunc(const BlendFunc &blendFunc) if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) { _blend = blendFunc; - for(auto& state : _subMeshStates) + for(auto& state : _meshes) { state->setBlendFunc(blendFunc); } @@ -558,7 +560,7 @@ const AABB& Sprite3D::getAABB() const { _aabb.reset(); Mat4 transform(nodeToWorldTransform); - for (const auto& it : _subMeshStates) { + for (const auto& it : _meshes) { if (it->isVisible()) _aabb.merge(it->getAABB()); } @@ -579,28 +581,28 @@ Rect Sprite3D::getBoundingBox() const void Sprite3D::setCullFace(GLenum cullFace) { - for (auto& it : _subMeshStates) { + for (auto& it : _meshes) { it->getMeshCommand().setCullFace(cullFace); } } void Sprite3D::setCullFaceEnabled(bool enable) { - for (auto& it : _subMeshStates) { + for (auto& it : _meshes) { it->getMeshCommand().setCullFaceEnabled(enable); } } -SubMeshState* Sprite3D::getSubMeshState(int index) const +Mesh* Sprite3D::getMeshByIndex(int index) const { - CCASSERT(index < _subMeshStates.size(), "invald index"); - return _subMeshStates.at(index); + CCASSERT(index < _meshes.size(), "invald index"); + return _meshes.at(index); } /**get SubMeshState by Name */ -SubMeshState* Sprite3D::getSubMeshStateByName(const std::string& name) const +Mesh* Sprite3D::getMeshByName(const std::string& name) const { - for (const auto& it : _subMeshStates) { + for (const auto& it : _meshes) { if (it->getName() == name) return it; } @@ -609,7 +611,7 @@ SubMeshState* Sprite3D::getSubMeshStateByName(const std::string& name) const MeshSkin* Sprite3D::getSkin() const { - for (const auto& it : _subMeshStates) { + for (const auto& it : _meshes) { if (it->getSkin()) return it->getSkin(); } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index b035aa9f0e..a617e40696 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -36,6 +36,8 @@ #include "3d/CCAABB.h" #include "3d/CCBundle3DData.h" #include "3d/CCMesh.h" +#include "3d/CCSubMeshState.h" +#include "3d/CCSubMesh.h" #include "3d/3dExport.h" @@ -65,10 +67,10 @@ public: void setTexture(Texture2D* texture); /**get SubMeshState by index*/ - SubMeshState* getSubMeshState(int index) const; + Mesh* getMeshByIndex(int index) const; /**get SubMeshState by Name */ - SubMeshState* getSubMeshStateByName(const std::string& name) const; + Mesh* getMeshByName(const std::string& name) const; /**get mesh*/ Mesh* getMesh() const { return _meshes.at(0); } @@ -142,9 +144,11 @@ CC_CONSTRUCTOR_ACCESS: void createNode(NodeData* nodedata, Node* root, const MaterialDatas& matrialdatas, bool singleSprite); void createAttachSprite3DNode(NodeData* nodedata,const MaterialDatas& matrialdatas); Sprite3D* createSprite3DNode(NodeData* nodedata,ModelData* modeldata,const MaterialDatas& matrialdatas); - /**get SubMesh by Id*/ - SubMesh* getSubMesh(const std::string& subMeshId) const; - void addSubMeshState(SubMeshState* subMeshState); + + /**get MeshIndexData by Id*/ + MeshIndexData* getMeshIndexData(const std::string& indexId) const; + + void addMesh(Mesh* mesh); void onAABBDirty() { _aabbDirty = true; } @@ -152,7 +156,7 @@ protected: Skeleton3D* _skeleton; //skeleton - Vector _subMeshStates; // SubMeshStates + Vector _meshVertexDatas; std::unordered_map _attachments; @@ -173,7 +177,7 @@ class Sprite3DCache public: struct Sprite3DData { - Vector meshes; + Vector meshVertexDatas; NodeDatas* nodedatas; MaterialDatas* materialdatas; ~Sprite3DData() @@ -182,7 +186,7 @@ public: delete nodedatas; if (materialdatas) delete materialdatas; - meshes.clear(); + meshVertexDatas.clear(); } }; diff --git a/cocos/3d/CCSubMesh.cpp b/cocos/3d/CCSubMesh.cpp index 693d8d37d3..0794e2d561 100644 --- a/cocos/3d/CCSubMesh.cpp +++ b/cocos/3d/CCSubMesh.cpp @@ -46,66 +46,124 @@ using namespace std; NS_CC_BEGIN -SubMesh::SubMesh() -: _indexBuffer(0) -, _primitiveType(PrimitiveType::TRIANGLES) -, _indexFormat(IndexFormat::INDEX16) -, _indexCount(0) -, _mesh(nullptr) -{ -} -SubMesh::~SubMesh() +///////////////////////////////////////////////////////////////////////////////////////////////////////////// +MeshIndexData* MeshIndexData::create(const std::string& id, MeshVertexData* vertexData, IndexBuffer* indexbuffer, const AABB& aabb) { - cleanAndFreeBuffers(); -} - -SubMesh* SubMesh::create(PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) -{ - auto submesh = new SubMesh(); - submesh->_primitiveType = primitivetype; - submesh->_indexFormat = indexformat; - submesh->autorelease(); + auto meshindex = new MeshIndexData(); - return submesh; -} - -SubMesh* SubMesh::create(const std::string& submeshId, Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices) -{ - auto submesh = new SubMesh(); - submesh->_primitiveType = primitivetype; - submesh->_indexFormat = indexformat; - submesh->_mesh = mesh; - submesh->_id = submeshId; - submesh->autorelease(); + meshindex->_id = id; + meshindex->_indexBuffer = indexbuffer; + meshindex->_vertexData = vertexData; + indexbuffer->retain(); + vertexData->retain(); + meshindex->_aabb = aabb; - return submesh; + meshindex->autorelease(); + return meshindex; } -void SubMesh::cleanAndFreeBuffers() +const VertexBuffer* MeshIndexData::getVertexBuffer() const { - if(glIsBuffer(_indexBuffer)) + return _vertexData->getVertexBuffer(); +} + +MeshIndexData::MeshIndexData() +: _indexBuffer(nullptr) +, _vertexData(nullptr) +, _primitiveType(GL_TRIANGLES) +{ + +} +MeshIndexData::~MeshIndexData() +{ + CC_SAFE_RELEASE(_indexBuffer); + CC_SAFE_RELEASE(_vertexData); +} + +MeshVertexData* MeshVertexData::create(const MeshData& meshdata) +{ + auto vertexdata = new MeshVertexData(); + int pervertexsize = meshdata.getPerVertexSize(); + vertexdata->_vertexBuffer = VertexBuffer::create(pervertexsize, (int)(meshdata.vertex.size() / (pervertexsize / 4))); + vertexdata->_vertexData = VertexData::create(); + CC_SAFE_RETAIN(vertexdata->_vertexData); + CC_SAFE_RETAIN(vertexdata->_vertexBuffer); + + int offset = 0; + for (const auto& it : meshdata.attribs) { + vertexdata->_vertexData->setStream(vertexdata->_vertexBuffer, VertexStreamAttribute(offset, it.vertexAttrib, it.type, it.size)); + offset += it.attribSizeBytes; + } + vertexdata->_vertexData->setStream(vertexdata->_vertexBuffer, VertexStreamAttribute(0, GLProgram::VERTEX_ATTRIB_POSITION, GL_FLOAT, 3)); + vertexdata->_vertexData->setStream(vertexdata->_vertexBuffer, VertexStreamAttribute(offsetof(V3F_C4B_T2F, colors), GLProgram::VERTEX_ATTRIB_COLOR, GL_UNSIGNED_BYTE, 4, true)); + vertexdata->_vertexData->setStream(vertexdata->_vertexBuffer, VertexStreamAttribute(offsetof(V3F_C4B_T2F, texCoords), GLProgram::VERTEX_ATTRIB_TEX_COORD, GL_FLOAT, 2)); + + vertexdata->_attribs = meshdata.attribs; + + if(vertexdata->_vertexBuffer) { - glDeleteBuffers(1, &_indexBuffer); - _indexBuffer = 0; + vertexdata->_vertexBuffer->updateVertices((void*)&meshdata.vertex[0], (int)meshdata.vertex.size() * 4, 0); } - _indexCount = 0; + AABB aabb; + for (size_t i = 0; i < meshdata.subMeshIndices.size(); i++) { + + auto& index = meshdata.subMeshIndices[i]; + auto indexBuffer = IndexBuffer::create(IndexBuffer::IndexType::INDEX_TYPE_SHORT_16, (int)(index.size())); + indexBuffer->updateIndices(&index[0], (int)index.size(), 0); + aabb = MeshVertexData::calculateAABB(meshdata.vertex, meshdata.getPerVertexSize(), index); + std::string id = (i < meshdata.subMeshIds.size() ? meshdata.subMeshIds[i] : ""); + MeshIndexData* indexdata = MeshIndexData::create(id, vertexdata, indexBuffer, aabb); + vertexdata->_indexs.pushBack(indexdata); + } + + vertexdata->autorelease(); + return vertexdata; } -void SubMesh::buildBuffer(const std::vector& indices) +const AABB& MeshVertexData::calculateAABB(const std::vector& vertex, int stride, const std::vector& index) +{ + static AABB aabb; + stride /= 4; + for(const auto& it : index) + { + Vec3 point = Vec3(vertex[it * stride ], vertex[ it * stride + 1], vertex[it * stride + 2 ]); + aabb.updateMinMax(&point, 1); + } + return aabb; +} + +MeshIndexData* MeshVertexData::getMeshIndexDataById(const std::string& id) const +{ + for (auto it : _indexs) { + if (it->getId() == id) + return it; + } + return nullptr; +} + +bool MeshVertexData::hasVertexAttrib(int attrib) const +{ + for (const auto& it : _attribs) { + if (it.vertexAttrib == attrib) + return true; + } + return false; +} + +MeshVertexData::MeshVertexData() +: _vertexData(nullptr) +, _vertexBuffer(nullptr) +, _vertexCount(0) { - glGenBuffers(1, &_indexBuffer); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); - - unsigned int indexSize = 2; - - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * indices.size(), &indices[0], GL_STATIC_DRAW); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - - _indexCount = indices.size(); +} +MeshVertexData::~MeshVertexData() +{ + CC_SAFE_RELEASE(_vertexData); + CC_SAFE_RELEASE(_vertexBuffer); + _indexs.clear(); } NS_CC_END diff --git a/cocos/3d/CCSubMesh.h b/cocos/3d/CCSubMesh.h index 546320b9bd..b3e70f107d 100644 --- a/cocos/3d/CCSubMesh.h +++ b/cocos/3d/CCSubMesh.h @@ -35,79 +35,93 @@ #include "base/ccTypes.h" #include "math/CCMath.h" #include "renderer/CCGLProgram.h" +#include "renderer/CCVertexIndexData.h" +#include "renderer/CCVertexIndexBuffer.h" #include "3d/3dExport.h" NS_CC_BEGIN -/** Defines supported index formats. */ -enum class IndexFormat -{ - INDEX8 = GL_UNSIGNED_BYTE, - INDEX16 = GL_UNSIGNED_SHORT, -}; +class MeshVertexData; -/** Defines supported primitive types. */ -enum class PrimitiveType +class MeshIndexData : public Ref { - TRIANGLES = GL_TRIANGLES, - TRIANGLE_STRIP = GL_TRIANGLE_STRIP, - LINES = GL_LINES, - LINE_STRIP = GL_LINE_STRIP, - POINTS = GL_POINTS -}; - -class Mesh; - -/** - * SubMesh: Defines the way the mesh's vertices how to be connected together. - */ -class CC_3D_DLL SubMesh : public Ref -{ - friend class Mesh; - friend class SubMeshState; public: - - /**create submesh from primitivetype indexformat and indices*/ - static SubMesh* create(PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); + /** create */ + static MeshIndexData* create(const std::string& id, MeshVertexData* vertexData, IndexBuffer* indexbuffer, const AABB& aabb); - static SubMesh* create(const std::string& submeshId, Mesh* mesh, PrimitiveType primitivetype, IndexFormat indexformat, const std::vector& indices); - - /** get primitive type*/ - PrimitiveType getPrimitiveType() const { return _primitiveType; } - /**get index count*/ - ssize_t getIndexCount() const { return _indexCount; } - /**get index format*/ - IndexFormat getIndexFormat() const { return _indexFormat; } /**get index buffer*/ - GLuint getIndexBuffer() const {return _indexBuffer; } + const IndexBuffer* getIndexBuffer() const { return _indexBuffer; } + /**get vertex buffer*/ + const VertexBuffer* getVertexBuffer() const; - /** get mesh */ - Mesh* getMesh() const { return _mesh; } + /**get vertex data*/ + const MeshVertexData* getMeshVertexData() const { return _vertexData; } - /** get submesh id */ - const std::string& getSubMeshId() const { return _id; } - -CC_CONSTRUCTOR_ACCESS: - - SubMesh(); - virtual ~SubMesh(); - - /**build buffer*/ - void buildBuffer(const std::vector& indices); - /**free buffer*/ - void cleanAndFreeBuffers(); - + /** aabb getter and setter */ + void setAABB(const AABB& aabb) { _aabb = aabb; } const AABB& getAABB() const { return _aabb; } -protected: - PrimitiveType _primitiveType; - IndexFormat _indexFormat; - - GLuint _indexBuffer; - ssize_t _indexCount; - Mesh* _mesh; //parent mesh, weak ref - std::string _id; //submeshid - AABB _aabb; //original aabb of the submesh + /** id setter and getter */ + void setId(const std::string& id) { _id = id; } + const std::string& getId() const { return _id; } + + GLenum getPrimitiveType() const { return _primitiveType; } + void setPrimitiveType(GLenum primitive) { _primitiveType = primitive; } + +CC_CONSTRUCTOR_ACCESS: + MeshIndexData(); + virtual ~MeshIndexData(); + +protected: + IndexBuffer* _indexBuffer; //index buffer + MeshVertexData* _vertexData; //vertex buffer + AABB _aabb; // original aabb of the submesh + std::string _id; //id + GLenum _primitiveType; + + friend class MeshVertexData; + friend class Sprite3D; +}; + +class MeshVertexData : public Ref +{ + friend class Sprite3D; + friend class Mesh; +public: + /**create*/ + static MeshVertexData* create(const MeshData& meshdata); + + /** get vertexbuffer */ + const VertexBuffer* getVertexBuffer() const { return _vertexBuffer; } + + /** get attributes count */ + ssize_t getMeshVertexAttribCount() const { return _attribs.size(); } + + /** get attribute by index */ + const MeshVertexAttrib& getMeshVertexAttrib(ssize_t index) const { return _attribs[index]; } + + /** get index data count */ + ssize_t getMeshIndexDataCount() const { return _indexs.size(); } + /** get index data by index */ + MeshIndexData* getMeshIndexDataByIndex(int index) const { return _indexs.at(index); } + /** get index data by id */ + MeshIndexData* getMeshIndexDataById(const std::string& id) const; + + /**has vertex attribute?*/ + bool hasVertexAttrib(int attrib) const; + +CC_CONSTRUCTOR_ACCESS: + MeshVertexData(); + virtual ~MeshVertexData(); + + static const AABB& calculateAABB(const std::vector& vertex, int stride, const std::vector& index); +protected: + VertexData* _vertexData; //mesh vertex data + VertexBuffer* _vertexBuffer; // vertex buffer + Vector _indexs; //index data + std::vector _attribs; + + int _vertexCount; //vertex count }; NS_CC_END diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp index 99819279d5..da495a8a61 100644 --- a/cocos/3d/CCSubMeshState.cpp +++ b/cocos/3d/CCSubMeshState.cpp @@ -48,45 +48,136 @@ using namespace std; NS_CC_BEGIN -SubMeshState::SubMeshState() +Mesh::Mesh() : _visible(true) , _texture(nullptr) , _skin(nullptr) -, _subMesh(nullptr) +, _meshIndexData(nullptr) , _visibleChanged(nullptr) , _glProgramState(nullptr) , _blend(BlendFunc::ALPHA_NON_PREMULTIPLIED) { } -SubMeshState::~SubMeshState() +Mesh::~Mesh() { CC_SAFE_RELEASE(_texture); CC_SAFE_RELEASE(_skin); - CC_SAFE_RELEASE(_subMesh); + CC_SAFE_RELEASE(_meshIndexData); CC_SAFE_RELEASE(_glProgramState); } -SubMeshState* SubMeshState::create() +GLuint Mesh::getVertexBuffer() const { - auto state = new SubMeshState(); - state->autorelease(); - state->bindMeshCommand(); - - return state; + return _meshIndexData->getVertexBuffer()->getVBO(); } -SubMeshState* SubMeshState::create(const std::string& name) +bool Mesh::hasVertexAttrib(int attrib) const { - auto state = new SubMeshState(); + return _meshIndexData->getMeshVertexData()->hasVertexAttrib(attrib); +} + +ssize_t Mesh::getMeshVertexAttribCount() const +{ + return _meshIndexData->getMeshVertexData()->getMeshVertexAttribCount(); +} + +const MeshVertexAttrib& Mesh::getMeshVertexAttribute(int idx) +{ + return _meshIndexData->getMeshVertexData()->getMeshVertexAttrib(idx); +} + +int Mesh::getVertexSizeInBytes() const +{ + return _meshIndexData->getVertexBuffer()->getSizePerVertex(); +} + +Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices) +{ + int perVertexSizeInFloat = 0; + std::vector vertices; + std::vector attribs; + MeshVertexAttrib att; + att.size = 3; + att.type = GL_FLOAT; + att.attribSizeBytes = att.size * sizeof(float); + + if (positions.size()) + { + perVertexSizeInFloat += 3; + att.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; + attribs.push_back(att); + } + if (normals.size()) + { + perVertexSizeInFloat += 3; + att.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; + attribs.push_back(att); + } + if (texs.size()) + { + perVertexSizeInFloat += 2; + att.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; + att.size = 2; + att.attribSizeBytes = att.size * sizeof(float); + attribs.push_back(att); + } + + bool hasNormal = (normals.size() != 0); + bool hasTexCoord = (texs.size() != 0); + //position, normal, texCoordinate into _vertexs + size_t vertexNum = positions.size() / 3; + for(size_t i = 0; i < vertexNum; i++) + { + vertices.push_back(positions[i * 3]); + vertices.push_back(positions[i * 3 + 1]); + vertices.push_back(positions[i * 3 + 2]); + + if (hasNormal) + { + vertices.push_back(normals[i * 3]); + vertices.push_back(normals[i * 3 + 1]); + vertices.push_back(normals[i * 3 + 2]); + } + + if (hasTexCoord) + { + vertices.push_back(texs[i * 2]); + vertices.push_back(texs[i * 2 + 1]); + } + } + return create(vertices, perVertexSizeInFloat, indices, attribs); +} + +Mesh* Mesh::create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, const std::vector& attribs) +{ + MeshData meshdata; + meshdata.attribs = attribs; + meshdata.vertex = vertices; + meshdata.subMeshIndices.push_back(indices); + meshdata.subMeshIds.push_back(""); + auto meshvertexdata = MeshVertexData::create(meshdata); + auto indexbuffer = IndexBuffer::create(IndexBuffer::IndexType::INDEX_TYPE_SHORT_16, (int)indices.size()); + + AABB aabb = MeshVertexData::calculateAABB(meshdata.vertex, meshdata.getPerVertexSize(), indices); + auto indexData = MeshIndexData::create("", meshvertexdata, indexbuffer, aabb); + + return create("", indexData); +} + +Mesh* Mesh::create(const std::string& name, MeshIndexData* indexData, MeshSkin* skin) +{ + auto state = new Mesh(); state->autorelease(); state->bindMeshCommand(); state->_name = name; + state->setMeshIndexData(indexData); + state->setSkin(skin); return state; } -void SubMeshState::setVisible(bool visible) +void Mesh::setVisible(bool visible) { if (_visible != visible) { @@ -96,13 +187,13 @@ void SubMeshState::setVisible(bool visible) } } -void SubMeshState::setTexture(const std::string& texPath) +void Mesh::setTexture(const std::string& texPath) { auto tex = Director::getInstance()->getTextureCache()->addImage(texPath); setTexture(tex); } -void SubMeshState::setTexture(Texture2D* tex) +void Mesh::setTexture(Texture2D* tex) { if (tex != _texture) { @@ -113,7 +204,7 @@ void SubMeshState::setTexture(Texture2D* tex) } } -void SubMeshState::setSkin(MeshSkin* skin) +void Mesh::setSkin(MeshSkin* skin) { if (_skin != skin) { @@ -124,19 +215,19 @@ void SubMeshState::setSkin(MeshSkin* skin) } } -void SubMeshState::setSubMesh(SubMesh* subMesh) +void Mesh::setMeshIndexData(MeshIndexData* subMesh) { - if (_subMesh != subMesh) + if (_meshIndexData != subMesh) { CC_SAFE_RETAIN(subMesh); - CC_SAFE_RELEASE(_subMesh); - _subMesh = subMesh; + CC_SAFE_RELEASE(_meshIndexData); + _meshIndexData = subMesh; calcuateAABB(); bindMeshCommand(); } } -void SubMeshState::setGLProgramState(GLProgramState* glProgramState) +void Mesh::setGLProgramState(GLProgramState* glProgramState) { if (_glProgramState != glProgramState) { @@ -147,11 +238,11 @@ void SubMeshState::setGLProgramState(GLProgramState* glProgramState) } } -void SubMeshState::calcuateAABB() +void Mesh::calcuateAABB() { - if (_subMesh) + if (_meshIndexData) { - _aabb = _subMesh->getAABB(); + _aabb = _meshIndexData->getAABB(); if (_skin) { Bone3D* root = _skin->getRootBone(); @@ -163,18 +254,18 @@ void SubMeshState::calcuateAABB() } } -void SubMeshState::bindMeshCommand() +void Mesh::bindMeshCommand() { - if (_glProgramState && _subMesh && _texture) + if (_glProgramState && _meshIndexData && _texture) { GLuint texID = _texture ? _texture->getName() : 0; - _meshCommand.genMaterialID(texID, _glProgramState, _subMesh->getMesh()->getVertexBuffer(), _subMesh->getIndexBuffer(), _blend); + _meshCommand.genMaterialID(texID, _glProgramState, _meshIndexData->getVertexBuffer()->getVBO(), _meshIndexData->getIndexBuffer()->getVBO(), _blend); _meshCommand.setCullFaceEnabled(true); _meshCommand.setDepthTestEnabled(true); } } -void SubMeshState::setBlendFunc(const BlendFunc &blendFunc) +void Mesh::setBlendFunc(const BlendFunc &blendFunc) { if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) { @@ -182,9 +273,29 @@ void SubMeshState::setBlendFunc(const BlendFunc &blendFunc) bindMeshCommand(); } } -const BlendFunc &SubMeshState::getBlendFunc() const +const BlendFunc &Mesh::getBlendFunc() const { return _blend; } +GLenum Mesh::getPrimitiveType() const +{ + return _meshIndexData->getPrimitiveType(); +} + +ssize_t Mesh::getIndexCount() const +{ + return _meshIndexData->getIndexBuffer()->getIndexNumber(); +} + +GLenum Mesh::getIndexFormat() const +{ + return GL_UNSIGNED_SHORT; +} + +GLuint Mesh::getIndexBuffer() const +{ + return _meshIndexData->getIndexBuffer()->getVBO(); +} + NS_CC_END diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h index f453220ec5..7962e9339c 100644 --- a/cocos/3d/CCSubMeshState.h +++ b/cocos/3d/CCSubMeshState.h @@ -43,19 +43,35 @@ NS_CC_BEGIN class Texture2D; class MeshSkin; -class SubMesh; +class MeshIndexData; /** * SubMeshState: visibility and apperence of submesh */ -class CC_3D_DLL SubMeshState : public Ref +class CC_3D_DLL Mesh : public Ref { friend class Sprite3D; public: - - /**create submesh from primitivetype indexformat and indices*/ - static SubMeshState* create(); + typedef std::vector IndexArray; + /**create mesh from positions, normals, and so on, sigle SubMesh*/ + static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices); + /**create mesh with vertex attributes*/ + CC_DEPRECATED_ATTRIBUTE static Mesh* create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, int numIndex, const std::vector& attribs, int attribCount){ return create(vertices, perVertexSizeInFloat, indices, attribs); } - static SubMeshState* create(const std::string& name); + static Mesh* create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, const std::vector& attribs); + + /** create mesh */ + static Mesh* create(const std::string& name, MeshIndexData* indexData, MeshSkin* skin = nullptr); + + /**get vertex buffer*/ + GLuint getVertexBuffer() const; + /**has vertex attribute?*/ + bool hasVertexAttrib(int attrib) const; + /**get mesh vertex attribute count*/ + ssize_t getMeshVertexAttribCount() const; + /**get MeshVertexAttribute by index*/ + const MeshVertexAttrib& getMeshVertexAttribute(int idx); + /**get per vertex size in bytes*/ + int getVertexSizeInBytes() const; /**texture getter and setter*/ void setTexture(const std::string& texPath); @@ -69,8 +85,8 @@ public: /**skin getter */ MeshSkin* getSkin() const { return _skin; } - /**sub mesh getter */ - SubMesh* getSubMesh() const { return _subMesh; } + /**mesh index data getter */ + MeshIndexData* getMeshIndexData() const { return _meshIndexData; } /**get GLProgramState*/ GLProgramState* getGLProgramState() const { return _glProgramState; } @@ -80,11 +96,20 @@ public: void setBlendFunc(const BlendFunc &blendFunc); const BlendFunc &getBlendFunc() const; + + /** get primitive type*/ + GLenum getPrimitiveType() const; + /**get index count*/ + ssize_t getIndexCount() const; + /**get index format*/ + GLenum getIndexFormat() const; + /**get index buffer*/ + GLuint getIndexBuffer() const; CC_CONSTRUCTOR_ACCESS: - SubMeshState(); - virtual ~SubMeshState(); + Mesh(); + virtual ~Mesh(); GLProgram* getDefaultGLProgram(bool textured); @@ -94,8 +119,8 @@ CC_CONSTRUCTOR_ACCESS: /**skin setter*/ void setSkin(MeshSkin* skin); - /**submesh setter*/ - void setSubMesh(SubMesh* subMesh); + /**Mesh index data setter*/ + void setMeshIndexData(MeshIndexData* indexdata); /**name setter*/ void setName(const std::string& name) { _name = name; } @@ -111,7 +136,7 @@ protected: //since 3.3 std::string _name; - SubMesh* _subMesh; + MeshIndexData* _meshIndexData; GLProgramState* _glProgramState; MeshCommand _meshCommand; BlendFunc _blend; diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 0047a49e98..f1812c5a6c 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -30,6 +30,7 @@ #include "3d/CCAttachNode.h" #include "3d/CCRay.h" #include "3d/CCSprite3D.h" +#include "renderer/CCVertexIndexBuffer.h" #include "DrawNode3D.h" #include @@ -489,7 +490,7 @@ void Effect3DOutline::setTarget(EffectSprite3D *sprite) if(sprite != _sprite) { GLProgram* glprogram; - if(!sprite->getSkin()) + if(!sprite->getMesh()->getSkin()) glprogram = GLProgram::createWithFilenames(_vertShaderFile, _fragShaderFile); else glprogram = GLProgram::createWithFilenames(_vertSkinnedShaderFile, _fragSkinnedShaderFile); @@ -545,22 +546,21 @@ void Effect3DOutline::draw(const Mat4 &transform) auto mesh = _sprite->getMesh(); glBindBuffer(GL_ARRAY_BUFFER, mesh->getVertexBuffer()); - if(_sprite && _sprite->getSkin()) + auto skin = _sprite->getMesh()->getSkin(); + if(_sprite && skin) { auto function = std::bind(MatrixPalleteCallBack, std::placeholders::_1, std::placeholders::_2, - _sprite->getSkin()->getMatrixPaletteSize(), (float*)_sprite->getSkin()->getMatrixPalette()); + skin->getMatrixPaletteSize(), (float*)skin->getMatrixPalette()); _glProgramState->setUniformCallback("u_matrixPalette", function); } if(_sprite) _glProgramState->apply(transform); - for (ssize_t i = 0; i < mesh->getSubMeshCount(); i++) { - auto submesh = mesh->getSubMesh((int)i); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, submesh->getIndexBuffer()); - glDrawElements((GLenum)submesh->getPrimitiveType(), (GLsizei)submesh->getIndexCount(), (GLenum)submesh->getIndexFormat(), 0); - CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, submesh->getIndexCount()); - } + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->getIndexBuffer()); + glDrawElements(mesh->getPrimitiveType(), mesh->getIndexCount(), mesh->getIndexFormat(), 0); + CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, mesh->getIndexCount()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glDisable(GL_DEPTH_TEST); @@ -1040,7 +1040,7 @@ void Sprite3DReskinTest::menuCallback_switchHair(Ref* sender) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlHair[i]); + auto subMesh = _sprite->getMeshByName(_girlHair[i]); if(subMesh) { if(i == _useHairId ) @@ -1057,7 +1057,7 @@ void Sprite3DReskinTest::menuCallback_switchHair(Ref* sender) } void Sprite3DReskinTest::menuCallback_switchGlasses(Ref* sender) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName("Girl_Yanjing_01"); + auto subMesh = _sprite->getMeshByName("Girl_Yanjing_01"); if(subMesh) { if(subMesh->isVisible()) @@ -1081,7 +1081,7 @@ void Sprite3DReskinTest::menuCallback_switchCoat(Ref* sender) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlUpperBody[i]); + auto subMesh = _sprite->getMeshByName(_girlUpperBody[i]); if(subMesh) { if(i == _useUpBodyId ) @@ -1107,7 +1107,7 @@ void Sprite3DReskinTest::menuCallback_switchPants(Ref* sender) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlPants[i]); + auto subMesh = _sprite->getMeshByName(_girlPants[i]); if(subMesh) { if(i == _usePantsId ) @@ -1133,7 +1133,7 @@ void Sprite3DReskinTest::menuCallback_switchShoes(Ref* sender) { for(int i = 0; i < 2; i++ ) { - SubMeshState* subMesh = _sprite->getSubMeshStateByName(_girlShoes[i]); + auto subMesh = _sprite->getMeshByName(_girlShoes[i]); if(subMesh) { if(i == _useShoesId ) @@ -1177,22 +1177,22 @@ void Sprite3DReskinTest::addNewSpriteWithCoords(Vec2 p) auto sprite = Sprite3D::create(fileName); sprite->setScale(4); sprite->setRotation3D(Vec3(0,0,0)); - auto girlPants = sprite->getSubMeshStateByName(_girlPants[1]); + auto girlPants = sprite->getMeshByName(_girlPants[1]); if(girlPants) { girlPants->setVisible(false); } - auto girlShoes = sprite->getSubMeshStateByName(_girlShoes[1]); + auto girlShoes = sprite->getMeshByName(_girlShoes[1]); if(girlShoes) { girlShoes->setVisible(false); } - auto girlHair = sprite->getSubMeshStateByName(_girlHair[1]); + auto girlHair = sprite->getMeshByName(_girlHair[1]); if(girlHair) { girlHair->setVisible(false); } - auto girlUpBody = sprite->getSubMeshStateByName( _girlUpperBody[1]); + auto girlUpBody = sprite->getMeshByName( _girlUpperBody[1]); if(girlUpBody) { girlUpBody->setVisible(false); diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Lian.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Lian.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc0b7634d590f12cfeeb16f397b3b475c25ea10 GIT binary patch literal 17362 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 Vp7O(>mm2^8002ovPDHLkV1n$23Dp1q literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Shangshen_01.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Shangshen_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3b8233a4b7320ca7fb3c30d33442295c15d9154c GIT binary patch literal 37686 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 literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Shou_01.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Shou_01.png new file mode 100644 index 0000000000000000000000000000000000000000..f95fecae54f545a844d55f8f81e1f87ac37f30ad GIT binary patch literal 14654 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 literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Toufa_01.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Toufa_01.png new file mode 100644 index 0000000000000000000000000000000000000000..05d3f1b060dfdbb83fdff9d235089efd86f2e22a GIT binary patch literal 22124 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 BQ6T^T literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xiashen_01.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xiashen_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3b8ee9c27d9406e2cb0095737fc1d75d2a52129c GIT binary patch literal 27584 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 literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xiashen_02.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xiashen_02.png new file mode 100644 index 0000000000000000000000000000000000000000..88150778673cc8bf608fa49b05aed86f9c128b5d GIT binary patch literal 29193 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 literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xie_01.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xie_01.png new file mode 100644 index 0000000000000000000000000000000000000000..42d35215c248a59f21ef6bc672023286701a2b7f GIT binary patch literal 23289 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 IM6N<$g6zX$LI3~& literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xie_02.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Xie_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9f9d2899adb20d85b447d2edec31dc23c5608a GIT binary patch literal 15599 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 literal 0 HcmV?d00001 diff --git a/tests/cpp-tests/Resources/Sprite3DTest/Girl_Yanjing_01.png b/tests/cpp-tests/Resources/Sprite3DTest/Girl_Yanjing_01.png new file mode 100644 index 0000000000000000000000000000000000000000..0754928550e7aca4dba5541640986bf3a2464777 GIT binary patch literal 23067 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 z mzbB(J>pd#;8=xH&z_o?_b+P8iu`OQ*w`@+x9q-AH&zKyrg z?Dd_Y&L#^e`qM&k`&W0LPYu$2%rv6y>6s*dgya)R{$;Tv)PC$Qx&6Y=-!iiOX8F}% zL3}fK)zKTwQJiG^9m)0^E?EWdUfR+#$o4;ft`En5(jc$b76wFVO6G;1-)3b0Z{O$y zo8L8p_u+Cl?aAG@qI&$&$^K{ToT=lMHuN2`|Mf09gW0e~aD_Z~@~!Q3$-MCM|C=1Y zy5t^)hU7j9|M0fpf0(;(Satg~$>)cj)St@sv!Vx)&(HbY0bnr13qDkfg@VBAl6mg) z8xWTQ57NBo?X8#iw(PVU9gB>H(`%0)txpv_KSzB0ae0d?snB=67d`LnG{2^{r_tMe zQQ&;}1X|R2u;lrV%ikZl2Ylvv(Mxy8@j?q%h$Gave`WVS{_!Q^mgjy^AnE1tN~th)y+K)M*XY~solB(JrSdx zbENa!`MbcF0s97CCFjrVAalq&8Ui(}$Y-hMP__Dh-zf$ieD6)ql==Iv4zZH$$(aIQ z_s65aTAkI(XZcRSCoR3{>=V1wMqE0|I6901H@BMTTB4s?`6jmu@RPQl^w^l)X;Hy; zINYlZc!p)k8tt=GE1$B#fP9JyO>02jUj%#CAXwfc3HrC~{TE{Q{{pA+O`gObB z7Ps)Xg~{XR%W5w@E14I5e{x6miRWbP&hGl~(!ULKx~;2L|F@=&rF<7z(oTLS)6z(O zILRk8iGftPbp5jE#XfxI@BB;DPa}Mu%)czE#QaOVdjRI=Kd#!RFx>pdtV+y(ynSYyZ^W`5&{$Elfxy=YM{$dW!k^7w@@EurZl`NvXvAOW#p3*yZp1 z%d#ao%=1dlzf5=efj|D8fBCty6|PC46)K#sq8f9GE^Pa0tzGXL_c z67w&SWdHN?FJne;VN%Kbi&G`$U)qp7KmVdJd_7Z(%)dOV#QaMtIez*1m#*aat?c}Z zd)y7Y=kNSSn5hT;M&>`}RAT<44HJg>`Hu`&%-pKv{Krb~>MTG15i+PZR*?CR+m)FA z@Ofjw^79|TR3siv=0CD3G5@iYw14#P{73hc-Z+cQf9$Ko{D(0azZ!q%KlJ;0;A>?5 zqiH4PKP<@j@$(<)OEI&O%zy0ss{Z^(+xBlTKY!66yAggu<}ZF#V*aA$**MJ4U#wv+ zGh@m8MXO58U&I`?W%>DwC-xCohsBk!3!({&AUM1!)3eUu0e*U7TV-_=m%wIIF#Qepx zjz4h7-}#69%Z+h8GXK!H67vsp!)IWA{$WptE6igu|Inop^AE;JPHe-!^AD58N8&Ux z|Io4$^AEeieObZ$16Gjv2bW6BKNyhq`T2)f(*9jC|8VP=`tuLjWc>K~ha56~_GJFS zsuJ@L5oG-M`G@&r{AQ8)hjx{ie-MuUcT*eYRVC~1pYGQ&U;lUeW6qdVvi=tyKYczf zV2mqSzwfkc&f1pM@64D=*6+gOXL9eOj8`S=_hu;&voCWoIuH~;y(RNwe*MP9U+?1gUF_*^aZMJ_i&)up@Z<8!%vx03%>{b?Ck|(wm3=VpP6Z}gPb1V(9aI^ zN#8Cw%-aYXZnVv~uH^w;zci4{7j>%6E+voq9673c2Aou2!gDGbfmA?=P7@pz#|oHo1T&nK;we*Y?6O%dRko zChkJWp$;Hj>GAuq@)mAkrp1PsIMDYTy>aB6rugA89mQ%RAHeI#dH{*}N56Sjuy;c} zcKl>VvVOr0FL(@?IXYby->e>78XY8=9}%s<+uG@~dulk*X&K&lRf~q?9*QPNk>mh} z4}fI8_0N0wVw0En?h0GMtLlaeJ@z5r*jmuirLknbU;GpN`}iH~TgR3zj`GA` z(i-8{iH#WAxg}g{BR&6>zV!mmZG8_9*lSJWn9Df*}|y zk_+$>)|zfP)eN&SZE%oFIFscP0)~uq{|zH=;kQN4@Nj=y+F`#Be)!oJ?@j>b>x34N zRilw)`&FNi@zXBGtv}YGt?M_&7cG5om5FB+1>O9?Jx03!v4Q{LQ2h@$xu+dHEs@5y z(;e|$Y{d9A3IZQ9>Ericja-aH@%;7K!Ynw@>3k3xU`3y5AB8QiGt4@4 zTDBp}68afPuOB%izYkN_)jMesYeT1M48glx9GFE9uA|B0&0zV_{*wLomoqr};zvAg zoeO;~(Fxyt>WWj(Uqa>wYC>wyK*{{OZ7KLfooej12`=>K+17YRK>)T~bQm=cHig{0 zW|H~N)pe*@nwelQ#({1(ur0h?Y702;Q^t-SNhq0-{{10;j5d`uDHG-&bD|ZWTS2yo zErbQ>ll2!XQQptjlJlQ!ei#wQ8 zOD-(~MPCPc>aZx--|I9Qv#74(bd9Mf_ZauwY}LP?%->xLp9S<}%W z(fH32b9C&@Y9_5wXXrFcdj9*wwpuKk)}I;I%8t%FJ08moVo|>yDT*~|jbZOL>HO-! zw(OUUZa6)qHa%}_9B!gGr|=)_#JtXs!Tn9r`)`@KHB0%A!3VxO&`tJCz(F1Cm@j)9 zqrk`R@H$<3{7`I7mI?O6>$^MBmWSf-miO(E<5FCQ z?(PzcH@S{M5yRY2RYz~AJKaR``02m6HfuYjExtUr4*lR~9R3Ln8GYXt88as|gc%05 zlKE~4Z?Tgpqez)zNw0V~8mF|#mWA})#$?s#1$iB%$3OGQ6WlvwBlE6@1?{$LIF1T5 zL2g|!)45eYc;aR**?w;~P0C|ab@uj;+VpR7%|8B|G45CQpu(h}7c%u~FPV2g{|0u= zwPBAOu%|OuQE+^XD_-$_xh!<$40PbK^!ihq(8rK|%8vDlvZMQskb(B;`uI*}bA@+t zBs!}t{rg#B`!8S>ZpI$CRGU84iPTJ4)|lGSRMFXe0NQh@qh$Y6idw-$8O_R<+ta`L zv_{d#C*f~DpS&8nSkpBML z61xZX8#Q8=KdeKC9lebL6@&52yT27n_AN&59)?Qx|NXJKVA4y*I+E`Xs>&wxX~P)2 zZ*?!3Z`LL>sjGDU#GPwsbxI5Nwu>VjzUQFKNjm}C&O0Kr+m?>LJ&<0%;?q7!7P_h> z`*@cwxikiId$oyc77SHmrumc77j#;d0A-LaOv$|a{VH6I=nfXYv4#9 z8BwS(S{sM2-LpX5C*4GEd-Rd)e?u=Lim%@{FAIm=q<+^+R=<945OxRn`uS3m)?h>G z=jxTHpKt1=0bjqf^V>n8ele3#iTb@)`YUKj<_|uT`2&~quJE4BAM~ii{J}eRJMi^; zQBpAMC-r;vO4RSO8_fc~eqTPI4cL+T-K7%s`_UOz6korOnmqsxlKNf067~DmUvEHA zzr*jH)$r9y)bG<%t*LH*>-QfW!{L<2b7s+vJhkih{k?tySHJfq_4@(MwvheQ0w4b4 zqjvq?$;6W4>hGHU9B4do5KKsT%4Al5u6F%B`mGkl)&IJE?CFIa+rxwzRu~^Uu6F%z zciNER>hI9ib?M?W5dg#*52;}e@OkDREhfed+T$+)$dD5{r+Z(8JLYF^}DnB^}FlrYrxMR zbh~K+i^%-JrF-hnAH<$70Iq)bAlHu@eg%NMw-3J2FjMXNy`c7E;Oh4+q<%j&nTDLz zj#z7eq?bh4$QH1ul7w@y-2* z)UIDoS(#Js0!r&Q*ZX5&u*dhHUzMoeT<>a7eEs&zc?87l*`qj9iTdr>yEDMoU!&J{ zg=wVz`c;YgtImcT;OoEV;pBP;uVeaDqW;TiY)0|*+f2V`m`dumtV+~xVfS>XhJWj~ zQ6bTgOX|1lm8jp|S=6E8|JHA*XU9WfjaXFNP5t^U`&J!_uixg6je{Meelw{={dRe# zEydMue!7lyvGGJWP^Attx{J5k_1j7<2a2novPk`O{aYN^PHf23_Y79MemWjohvMtE z4sNfJ`Ge)PKV3b^{~J*mH3cMXRT zr2g`)ME!N9{}8XgUBl)V0(5jh5b+qnUE{$fIZ z8y<>#E?dm}>hzsiJT(?pw~?NIKexahYp=YB_bo7{Z{-K$28!!U@BCawZ&N%>)RF%E zV)%%SIQ7*dyttnw?PzU`UtMjB6+NOE`Osc)aGLb|_hct)sz#HoIB29T-J?kqRH?t4 zsh`z~IbOvC#U#olxBrR074>e%B|Pz|9o?~L7_7^^!ZeyYR?(+6g;w-NlKI!SYfwdh z-r}cS?PvqP{t$8N6Z7)XEQL;LTNJyng=GGfg*KH?N1t^Kcc3FT2E(qErg;4CPqJv+ zsi?{XS~9QaX-w@{brV;~sYO50`hT3A_g~J@`}j+PCK`8p?=wdcSfR;l`SEpWR>iEU!U*e{e3+A@_iid&mZu7T-Vvxxz2U2 zYY|k;I7N0o`y;&JZ-{OMv;Y5DNUI8NMlPY!?=|pk-a>dae;Qddypa4VxXGWL>BE$t zY@{Hl$oN1dUl`!Fr$Jz0B1tcqildzG35dsIkKd-fJzz0dT%>7if;+qHA?lkkojfiZ zjsLw5nN*Bn%Dz%pC+rS7v zaMyt+>kz%~zZu;w%|X10Z2yOT=2gf)HA1B6sgHHPYCze>iF9$#iov`A9Z!@1f4-PB9V>> zu2K4o9QXKAIl*bQ>pLgG!z-I=CN+OJ~j?7GC)4q(Zof3?8 zo7SL^EcW;n2HZzU?PEpwvN1kc`;l+AJD#q&xfLmUTtPXp?EV)VQ-gdX2a$QX2{uoS zM{*Nl>7_Ay(fiDcNXnnRe%n)l_M069)AMS0-$y&xG}4ZC$eSaFPXU15vHdT+0weCt z`6S#D@bIOz-Y{53o7U~C6As+>gRj8$f62zE(aZ&vaA>v~zAhsNskf%n?co)C??-+x z*8jhg@2UJon57y?4;j2g|0=&MmGkvio`6}L{vI5k`5!*n$QS-(u=Tg>*+HV7Q|Ldg zhQ0ohuWsrCCBtSi*YDr__x06i)Pi|*yWc$Yul!mw1Dc|G5tg6Sz<-iu;N(X)YWz`% zA};%LG5GBN3-!MP>B;VL5WlN|UrTAj`i7Bo$=s`GLs zeKJh+mZJmFvykfRFwiY#`~LwlRSBuA^hW&gPZ8M+Q|HHR*p*3cIz(JsmkD3fdhm2!saeg&={KOR$3fbeg-yj=S z-@67T8rpcB#b@%&(4F?c3sgLL1V}$(uOHF&V7L?U7V^3Iqo#P9L`Zqj(bK-75hV`X zA9VKodmv>5j?1otS&s%jw@;Er=ZvGHjH{7)r6VjaVUOS6?N5omPqw!DP^p}@e{TQZ z{eOFr8nsq(qrpFS|8xHzKCK4}8_q#vts35wKZd3|TGRLGJhU&x5q`-0cjNCr@QKLY z_n%BCit3~!SPms)j#u#tDe-7 zGj)KEsbb@0%TadXN;<7&m&<7_Pgt45e!rTvc{vLAsDrqxs+iX`T)3$@iGG%LKu+xd zM$v)H_4hX)T7HVyZjGbmZ`TR`mESvA4t7dafle6@yNGWhu9hq462mOlv8B$?w|E9q z{@;Am%x?1Gz;v1-Jc$04cYZJqB2tgQlsF#t`D{d|3>VPjR_3T8!yX2b*!GXF$v9YA za0JHxQo|Qx9B9WdbGprUBf5NG6xh9HpZ`1GB!TpW(;)Um0~gQvL$3TDOLv^=Mxna4 z&^MaB{xyyKNxN(fm~BwSU-!L2la@zO%kqiBgNm6J?~QGTK&)dt#FVQ3U;gHQ_*0Y3LGCX5{aiqg z!f0g=2yRxzPdWLwIbOiYPtGud@pkO@)4zE?yJ-4-&IY2i@I3if{!-sQAQusMUFPAK zQE{|Bxsap@hmo2?rr^V8ufMo55)`Tx59(hlc>%h-e9 zj=|UEy=Z9<55M^yO{Y)1MTVU=CKvM!;MY?2`rCb|7#59Ghu&|h z7)Sci7lR*=$({}5Ri-gK|Hxi{%^jz}-TMK$JA#LwzL-dL4nHP3iT6l^p8?$OXY-$v zF2RMAbI6+8|CFsf=&plLNP=`9;h)imWjXBqN6PO4Z1DVz<}6jkO?~dvJK!-1fAEEr zn;L=YA2$C;PXt4&FQT_oHSqM7@$~Jje&T-fDjM`r3&aB0_J{whGB}cP0wpG^;g%gh z;~NZUQ?W1d_^k^L2ifaC;CwTfM?3IuRr2r%g>h8*hd$krnsh-{s0rR1+5N|(7oh*k zY&7Ts52y1daPiOD^p*Gm;ou$}cz%<;|C#Q%0^5&u@b8>d#i8Fh|FxScHO|&_&A+At zZLiq=8&7W$42*U_&hJ(6!v&!<{joR|^3;S{YjnZGkA42!jA)1IJ-tHxO*~xTA)t;W z=5(dZNTHaXI*8}7`Rs~25Tv3DpQW_0be97S2zWqbrH8?*aBW!A&t89Lvbta{{|QQ( zriFzw+~`UEJ@VT?98BZXVdOCO{;^X2A@J@SkeNIU{OH$0`fT%QvWH5eh5MD^^fb2p zGq(6Cq>Nulc+ToryETex*FPj0O2bJ{t1|4F#$LY({QFS);iT~NV>R4X9Z9Pf-6VR7 z(d34h8r;@m^R+|Xz?!kUN!uJXY%n2$x@~MBvz8^3@x>}I?Gk(bsmXW1#X}xspP3pi z9UDP)c}+xP*G8hUmj~CDv-vHiZ7{wl89q+X#vdP!plye$h^e?S^e)$j*~x7G#o(Ub z;5xz%es0yq;KU&ORuet#VzC@;uH4q7^RZp%1ohRR6tZfUM| zvl9F%XY*!h;)1|sYf=9tE$lyg3|*7jO~N)yz{$BPQ2LTRf4=VB3^`MFg4JDBTo&R$ zyVT`qeC}&PYeqoBEw=x=|5g?}TDl+nx>RscfD>J!eU(UusZd`UO&g49fs4f z+rjj`3eKr=q=B)GWN^7MRZO*koESE*T66$9^47!dMXGpl=tz2g-w-Nr`bkd5T7#>Q zJ^qVvG%Q-U6O>=`u<0BgE!A|Vi4(RFjbdAv+{}(&{M&vxtT2f3d4aTgGX7`#3+kWW@Ffg|a z-pokAtOZNP~v^x+jZ)<=}+f}f0izI1<AC+ttPxJZct{= zo_~KfnV>eu7O>#{?*;ob2v_||pnb&~$?HMxa4L>%Kb-$?6GdiUgGfsieBJYz&_pJl zUiI8X_)!SHinG_x`OG%-Q1I!^0VZKzl{6f5~L_rFgMH&Z)aFuV#-#m{wZK>Vd0y>fdI`Z_igeBIdc zKl-hpyXa~tA5g{pGz?^m2T1o1cmDU<8L+pGeSd8=*+y4aPJox^Rk2rVD3}a!5G)%*E%Bp;!|K|VzarXSxOhxqf z<~0Oc=6yiGI;RpGN?Ed@v{cGNCG4gn4 z5*^hfNB;Hw>+ko!45dNDVOJ8}jbzEczQ6sge|o$)Ii#ON=e^^Rf7PFCm!*fxPC++P z#phMT$s@@m`bk}rlvnz~3of3N_5Wx=i54Abs)4*UDi|%3B#n`)=s^oJQZa2ZtoR52 zPeq6`4Ho9ZAthDpeQW_}%)3V7H1_a2Mooo*+wArKxBRm?VbDILn;cv-5&f%tm7B-t z+OC=KTvHR5`+C8$l^4kCKN9fGKMLyO*zZpT)jMftj4oJCQpZ~tE`VQ>$)wsf4`r;3 zhM#=){4*>}r_K-LK)aZSwKNkTi2FNMJYy5N^F0doj$+%-SG4!iJa=bk%i{b$FP6f_ ztybu*)fTezZ3Oq0$>#T_<8%C-eCKy8p;09Hx_x?cu_$dDu4A5jOXX zqIIR0gth#65W>}kWUW7&>O$%w?t$n!Xq=CVZtZ4~{gl_18~Ir{i>QBLB&1m04V&X8uUjg@wI!K%`y+fg5+iHTK z1L;S`L9jo&{Y&lpX!oyfWS6LoWhDJzrtuDPs9hZB-8d+k%GQ5YKn*RrE6#s7nukj^ zgo4E9F5;v(ljyfDgmcr__CtB!=Dz1L0n`b5%%Vg)`}SDN@DZ1LDh8F z+agzG&i|FvIs;a``a^O)Dw53Ov2fCpZU52M3MvpkJhrn!4eyYc5AO^q*?QOseYA^% zRgUcWx3Kvv-K$!{pRhq4OCFmCu~}Qm{Md$buN@I)-PXVvD`$gRdy(+`&^O3qKooh`fn$MZxqsJfWk4OYWnE+oMi z?(c=?Athm#WIW`gvd6z|8KJuKQb@gq8jh4-0bU0-5Owvb!auMS+_l;K!TPhbphkgQ z+@*%otP-K}=scqIN`h}VW(mAK$G*QL)#?eJZX%>jO&dS8T?y``i~0L%ml2zgM*heP z?EEnUHJSo>(HfEwrG;0OFNV;G%IJjdVKR5^3BJ;NHvby51hRh&No}VVHg$=Eg0^)? zbYl(Kms7>Jd27xbKgk4r!N>e%B=oX2J}r?1Y55Y!Oh%pPselcV6Qrip#50#tA zy(nGmGddY|d3+O!ojf62ULue5BiQ*<-aRrBj2o;?BgA#_H@pTK677T!wxkH-YUNO! zCcFK+g!+QDIn$_XiVjXuO@WKwt_V-x%@m%@l|d>Ac1->G7TSW)WN{i2qlMM%BW4{38)1TF!{24Zv4Lb zQl-P1SS}+0o_rGuWAf6-jOcp)&Dreu;Vs50f`f@X`fi2>Zhs#S%QhVwtJtxZ4BxSn z|4D(*ls|dDs^EueH|bK=#2Y8Y!&_++6mfqoaje+K&zZ`OAKhZ4Ezn)8K?7~HaLSWa zur}`)-@e6#*xJ?c?cO>u6Z{O>PQ#vR<5O8HA=`B#Y4nsPL#`{Jj>9fYUfM@T z@UgCpewd|)PYqiIsxN{`%@dKUm7NP0!^W0hn5ZjI+LA_XsUE&EKM5>PAd>N{$F=LN zJzCf@k}3a1gOR|wWHOy2rjHZalEGG0f@nt0c72{T679%g*Z;8HVkkIjFGKqk_3@6? z$xu8+mfTvX%wPZ98rit9|1apqnF->Tt|8S$y7-Y#3LJtGKspx zpG$;nFJk}SI5?Lw+6oGWV(iS z>_6|f;Tm7_k~UNSt~W-4c*S@8&o6YarYI3o1}ULeL#)vI<`4Xx;yO%T9vKRp{XO_g z8g=oxq6F9?nSyxl2cvZ}dQX>xvsKDO{pfz?ZMg{y{^@|D^~ zAeAsSU*x1GcsTMgadI`n`4LI*Sni>)AWR>vHVr{5-)k`C-(Ah^|4u0vwv_4PAI3?r z+`|i5rK;7Q5;-BmSUDzd*gjNXH(C+wdrWaciz!u4Vpw!wYbbB`xqJneL zi(RTre)=e7!TW=T=u3wwR+L!^*>f}bXCv~E{Eaj;zhfwqcN?Z5=qfXT)*K^zlFAUUQqkA>nwjNKN!UvRATbp_f-UuRj%Z0g((iuT?C4qeZpRH3f0wb zLNjvM{nwT;Od#(iPG={Y;v0|Wf~s2rdBCee7Ui4J>k9V#eSWBx%<&mYCKp-b#>OjT zlGP7>q1*!4R@aNfcCh#Fxmu1)*TWSQ4;z6-;sJ zM3#z#@7Lv5qlPRkwfphN#df}*J$egZtJl;Vxq^&0R0Z#cc}SeF&ySwo9MBbarBh#8;Y}lDL7
b5hbQ4O*uppJomqE$7yGX8^J^tFNL1aqlWSSOW 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 u!^}t(=KeEqHd}5U^sknGE5r!8QEp9c|#3N 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%0ATte-a~9dhKz-0iXtFXznTn=C)0G*@Of(CcO8sm! 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

74L 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 IM6N<$g6zX$LI3~& literal 0 HcmV?d00001 From d90572fc10fbeee94583ace9e29ec9ba78c198ab Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 13:52:03 +0800 Subject: [PATCH 59/67] engine refactor hide concept of submesh --- build/cocos2d_libs.xcodeproj/project.pbxproj | 60 +- cocos/3d/CCMesh.cpp | 612 ++++++++---------- cocos/3d/CCMesh.h | 272 +++----- ...CSubMesh.cpp => CCMeshVertexIndexData.cpp} | 3 +- .../{CCSubMesh.h => CCMeshVertexIndexData.h} | 6 +- cocos/3d/CCSprite3D.cpp | 3 - cocos/3d/CCSprite3D.h | 3 +- cocos/3d/CCSubMeshState.cpp | 301 --------- cocos/3d/CCSubMeshState.h | 149 ----- cocos/3d/cocos3d.h | 2 +- .../Classes/Sprite3DTest/Sprite3DTest.cpp | 1 - 11 files changed, 390 insertions(+), 1022 deletions(-) rename cocos/3d/{CCSubMesh.cpp => CCMeshVertexIndexData.cpp} (99%) rename cocos/3d/{CCSubMesh.h => CCMeshVertexIndexData.h} (97%) delete mode 100644 cocos/3d/CCSubMeshState.cpp delete mode 100644 cocos/3d/CCSubMeshState.h diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index 8c43ccab30..1bc96d79ab 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -57,14 +57,13 @@ 1516200E199E75C2006099B8 /* CCRay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6105179199CB1A600DC41CE /* CCRay.cpp */; }; 1516200F199E75C2006099B8 /* CCSkeleton3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2A83E1987A6810077B3D4 /* CCSkeleton3D.cpp */; }; 15162010199E75C2006099B8 /* CCAttachNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E3198639EF00FA95D0 /* CCAttachNode.cpp */; }; - 15162011199E75C2006099B8 /* CCSubMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E5198639EF00FA95D0 /* CCSubMesh.cpp */; }; - 15162012199E75C2006099B8 /* CCSubMeshState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E7198639EF00FA95D0 /* CCSubMeshState.cpp */; }; + 15162011199E75C2006099B8 /* CCMeshVertexIndexData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E5198639EF00FA95D0 /* CCMeshVertexIndexData.cpp */; }; + 15162012199E75C2006099B8 /* CCMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E7198639EF00FA95D0 /* CCMesh.cpp */; }; 15162013199E75C2006099B8 /* CCBundleReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EA4786E195478E00068D9D1 /* CCBundleReader.cpp */; }; 15162014199E75C2006099B8 /* CCBundle3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6AAF83F19404E0D0069DE01 /* CCBundle3D.cpp */; }; 15162015199E75C2006099B8 /* CCAnimate3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6ACD89C193DC0CC005E0B8A /* CCAnimate3D.cpp */; }; 15162016199E75C2006099B8 /* CCMeshSkin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6ACD895193D6693005E0B8A /* CCMeshSkin.cpp */; }; 15162017199E75C2006099B8 /* CCAnimation3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6B26341193884D60088FE25 /* CCAnimation3D.cpp */; }; - 15162018199E75C2006099B8 /* CCMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594B91926D61F003EEF37 /* CCMesh.cpp */; }; 15162019199E75C2006099B8 /* CCObjLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594BB1926D61F003EEF37 /* CCObjLoader.cpp */; }; 1516201A199E75C2006099B8 /* CCSprite3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594BD1926D61F003EEF37 /* CCSprite3D.cpp */; }; 1516201B199E75C2006099B8 /* CCSprite3DMaterial.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594BF1926D61F003EEF37 /* CCSprite3DMaterial.cpp */; }; @@ -73,15 +72,14 @@ 1516201E199E75FE006099B8 /* CCRay.h in Headers */ = {isa = PBXBuildFile; fileRef = B610517A199CB1A600DC41CE /* CCRay.h */; }; 1516201F199E75FE006099B8 /* CCSkeleton3D.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EA2A83F1987A6810077B3D4 /* CCSkeleton3D.h */; }; 15162020199E75FE006099B8 /* CCAttachNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E4198639EF00FA95D0 /* CCAttachNode.h */; }; - 15162021199E75FE006099B8 /* CCSubMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E6198639EF00FA95D0 /* CCSubMesh.h */; }; - 15162022199E75FF006099B8 /* CCSubMeshState.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E8198639EF00FA95D0 /* CCSubMeshState.h */; }; + 15162021199E75FE006099B8 /* CCMeshVertexIndexData.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E6198639EF00FA95D0 /* CCMeshVertexIndexData.h */; }; + 15162022199E75FF006099B8 /* CCMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E8198639EF00FA95D0 /* CCMesh.h */; }; 15162023199E75FF006099B8 /* CCBundleReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EA4786F195478E00068D9D1 /* CCBundleReader.h */; }; 15162024199E75FF006099B8 /* CCBundle3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B6AAF84019404E0D0069DE01 /* CCBundle3D.h */; }; 15162025199E75FF006099B8 /* CCAnimate3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B6ACD89D193DC0CC005E0B8A /* CCAnimate3D.h */; }; 15162026199E75FF006099B8 /* CCMeshSkin.h in Headers */ = {isa = PBXBuildFile; fileRef = B6ACD896193D6693005E0B8A /* CCMeshSkin.h */; }; 15162027199E75FF006099B8 /* CCAnimation3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B6B26342193884D60088FE25 /* CCAnimation3D.h */; }; 15162028199E75FF006099B8 /* CCAnimationCurve.h in Headers */ = {isa = PBXBuildFile; fileRef = B6B2633C19381FBF0088FE25 /* CCAnimationCurve.h */; }; - 15162029199E75FF006099B8 /* CCMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594BA1926D61F003EEF37 /* CCMesh.h */; }; 1516202A199E75FF006099B8 /* CCObjLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594BC1926D61F003EEF37 /* CCObjLoader.h */; }; 1516202B199E75FF006099B8 /* CCSprite3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594BE1926D61F003EEF37 /* CCSprite3D.h */; }; 1516202C199E75FF006099B8 /* CCSprite3DMaterial.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594C01926D61F003EEF37 /* CCSprite3DMaterial.h */; }; @@ -91,14 +89,13 @@ 15162204199E7874006099B8 /* CCRay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6105179199CB1A600DC41CE /* CCRay.cpp */; }; 15162205199E7874006099B8 /* CCSkeleton3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2A83E1987A6810077B3D4 /* CCSkeleton3D.cpp */; }; 15162206199E7874006099B8 /* CCAttachNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E3198639EF00FA95D0 /* CCAttachNode.cpp */; }; - 15162207199E7874006099B8 /* CCSubMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E5198639EF00FA95D0 /* CCSubMesh.cpp */; }; - 15162208199E7874006099B8 /* CCSubMeshState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E7198639EF00FA95D0 /* CCSubMeshState.cpp */; }; + 15162207199E7874006099B8 /* CCMeshVertexIndexData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E5198639EF00FA95D0 /* CCMeshVertexIndexData.cpp */; }; + 15162208199E7874006099B8 /* CCMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E9E80E7198639EF00FA95D0 /* CCMesh.cpp */; }; 15162209199E7874006099B8 /* CCBundleReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EA4786E195478E00068D9D1 /* CCBundleReader.cpp */; }; 1516220A199E7874006099B8 /* CCBundle3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6AAF83F19404E0D0069DE01 /* CCBundle3D.cpp */; }; 1516220B199E7874006099B8 /* CCAnimate3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6ACD89C193DC0CC005E0B8A /* CCAnimate3D.cpp */; }; 1516220C199E7874006099B8 /* CCMeshSkin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6ACD895193D6693005E0B8A /* CCMeshSkin.cpp */; }; 1516220D199E7874006099B8 /* CCAnimation3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6B26341193884D60088FE25 /* CCAnimation3D.cpp */; }; - 1516220E199E7874006099B8 /* CCMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594B91926D61F003EEF37 /* CCMesh.cpp */; }; 1516220F199E7874006099B8 /* CCObjLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594BB1926D61F003EEF37 /* CCObjLoader.cpp */; }; 15162210199E7874006099B8 /* CCSprite3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594BD1926D61F003EEF37 /* CCSprite3D.cpp */; }; 15162211199E7874006099B8 /* CCSprite3DMaterial.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B29594BF1926D61F003EEF37 /* CCSprite3DMaterial.cpp */; }; @@ -107,15 +104,14 @@ 15162214199E7A32006099B8 /* CCRay.h in Headers */ = {isa = PBXBuildFile; fileRef = B610517A199CB1A600DC41CE /* CCRay.h */; }; 15162215199E7A32006099B8 /* CCSkeleton3D.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EA2A83F1987A6810077B3D4 /* CCSkeleton3D.h */; }; 15162216199E7A32006099B8 /* CCAttachNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E4198639EF00FA95D0 /* CCAttachNode.h */; }; - 15162217199E7A32006099B8 /* CCSubMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E6198639EF00FA95D0 /* CCSubMesh.h */; }; - 15162218199E7A32006099B8 /* CCSubMeshState.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E8198639EF00FA95D0 /* CCSubMeshState.h */; }; + 15162217199E7A32006099B8 /* CCMeshVertexIndexData.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E6198639EF00FA95D0 /* CCMeshVertexIndexData.h */; }; + 15162218199E7A32006099B8 /* CCMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E80E8198639EF00FA95D0 /* CCMesh.h */; }; 15162219199E7A32006099B8 /* CCBundleReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EA4786F195478E00068D9D1 /* CCBundleReader.h */; }; 1516221A199E7A32006099B8 /* CCBundle3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B6AAF84019404E0D0069DE01 /* CCBundle3D.h */; }; 1516221B199E7A32006099B8 /* CCAnimate3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B6ACD89D193DC0CC005E0B8A /* CCAnimate3D.h */; }; 1516221C199E7A32006099B8 /* CCMeshSkin.h in Headers */ = {isa = PBXBuildFile; fileRef = B6ACD896193D6693005E0B8A /* CCMeshSkin.h */; }; 1516221D199E7A32006099B8 /* CCAnimation3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B6B26342193884D60088FE25 /* CCAnimation3D.h */; }; 1516221E199E7A32006099B8 /* CCAnimationCurve.h in Headers */ = {isa = PBXBuildFile; fileRef = B6B2633C19381FBF0088FE25 /* CCAnimationCurve.h */; }; - 1516221F199E7A32006099B8 /* CCMesh.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594BA1926D61F003EEF37 /* CCMesh.h */; }; 15162220199E7A32006099B8 /* CCObjLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594BC1926D61F003EEF37 /* CCObjLoader.h */; }; 15162221199E7A32006099B8 /* CCSprite3D.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594BE1926D61F003EEF37 /* CCSprite3D.h */; }; 15162222199E7A32006099B8 /* CCSprite3DMaterial.h in Headers */ = {isa = PBXBuildFile; fileRef = B29594C01926D61F003EEF37 /* CCSprite3DMaterial.h */; }; @@ -2534,10 +2530,10 @@ 3E61781C1966A5A300DE83F5 /* CCController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CCController.cpp; path = ../base/CCController.cpp; sourceTree = ""; }; 3E9E80E3198639EF00FA95D0 /* CCAttachNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCAttachNode.cpp; sourceTree = ""; }; 3E9E80E4198639EF00FA95D0 /* CCAttachNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCAttachNode.h; sourceTree = ""; }; - 3E9E80E5198639EF00FA95D0 /* CCSubMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCSubMesh.cpp; sourceTree = ""; }; - 3E9E80E6198639EF00FA95D0 /* CCSubMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCSubMesh.h; sourceTree = ""; }; - 3E9E80E7198639EF00FA95D0 /* CCSubMeshState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCSubMeshState.cpp; sourceTree = ""; }; - 3E9E80E8198639EF00FA95D0 /* CCSubMeshState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCSubMeshState.h; sourceTree = ""; }; + 3E9E80E5198639EF00FA95D0 /* CCMeshVertexIndexData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCMeshVertexIndexData.cpp; sourceTree = ""; }; + 3E9E80E6198639EF00FA95D0 /* CCMeshVertexIndexData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCMeshVertexIndexData.h; sourceTree = ""; }; + 3E9E80E7198639EF00FA95D0 /* CCMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCMesh.cpp; sourceTree = ""; }; + 3E9E80E8198639EF00FA95D0 /* CCMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCMesh.h; sourceTree = ""; }; 3EA0FB69191C841D00B170C8 /* UIVideoPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIVideoPlayer.h; sourceTree = ""; }; 3EA0FB6A191C841D00B170C8 /* UIVideoPlayerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UIVideoPlayerIOS.mm; sourceTree = ""; }; 3EA2A83E1987A6810077B3D4 /* CCSkeleton3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCSkeleton3D.cpp; sourceTree = ""; }; @@ -3084,8 +3080,6 @@ B29594B11926D5D9003EEF37 /* ccShader_3D_PositionTex.vert */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_3D_PositionTex.vert; sourceTree = ""; }; B29594B21926D5EC003EEF37 /* CCMeshCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCMeshCommand.cpp; sourceTree = ""; }; B29594B31926D5EC003EEF37 /* CCMeshCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCMeshCommand.h; sourceTree = ""; }; - B29594B91926D61F003EEF37 /* CCMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCMesh.cpp; sourceTree = ""; }; - B29594BA1926D61F003EEF37 /* CCMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCMesh.h; sourceTree = ""; }; B29594BB1926D61F003EEF37 /* CCObjLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCObjLoader.cpp; sourceTree = ""; }; B29594BC1926D61F003EEF37 /* CCObjLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCObjLoader.h; sourceTree = ""; }; B29594BD1926D61F003EEF37 /* CCSprite3D.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCSprite3D.cpp; sourceTree = ""; }; @@ -5311,10 +5305,10 @@ 3EA2A83F1987A6810077B3D4 /* CCSkeleton3D.h */, 3E9E80E3198639EF00FA95D0 /* CCAttachNode.cpp */, 3E9E80E4198639EF00FA95D0 /* CCAttachNode.h */, - 3E9E80E5198639EF00FA95D0 /* CCSubMesh.cpp */, - 3E9E80E6198639EF00FA95D0 /* CCSubMesh.h */, - 3E9E80E7198639EF00FA95D0 /* CCSubMeshState.cpp */, - 3E9E80E8198639EF00FA95D0 /* CCSubMeshState.h */, + 3E9E80E5198639EF00FA95D0 /* CCMeshVertexIndexData.cpp */, + 3E9E80E6198639EF00FA95D0 /* CCMeshVertexIndexData.h */, + 3E9E80E7198639EF00FA95D0 /* CCMesh.cpp */, + 3E9E80E8198639EF00FA95D0 /* CCMesh.h */, 3EA4786E195478E00068D9D1 /* CCBundleReader.cpp */, 3EA4786F195478E00068D9D1 /* CCBundleReader.h */, B6AAF83F19404E0D0069DE01 /* CCBundle3D.cpp */, @@ -5327,8 +5321,6 @@ B6B26342193884D60088FE25 /* CCAnimation3D.h */, B6B2633B19381FBF0088FE25 /* CCAnimationCurve.inl */, B6B2633C19381FBF0088FE25 /* CCAnimationCurve.h */, - B29594B91926D61F003EEF37 /* CCMesh.cpp */, - B29594BA1926D61F003EEF37 /* CCMesh.h */, B29594BB1926D61F003EEF37 /* CCObjLoader.cpp */, B29594BC1926D61F003EEF37 /* CCObjLoader.h */, B29594BD1926D61F003EEF37 /* CCSprite3D.cpp */, @@ -5353,8 +5345,8 @@ 1516201E199E75FE006099B8 /* CCRay.h in Headers */, 1516201F199E75FE006099B8 /* CCSkeleton3D.h in Headers */, 15162020199E75FE006099B8 /* CCAttachNode.h in Headers */, - 15162021199E75FE006099B8 /* CCSubMesh.h in Headers */, - 15162022199E75FF006099B8 /* CCSubMeshState.h in Headers */, + 15162021199E75FE006099B8 /* CCMeshVertexIndexData.h in Headers */, + 15162022199E75FF006099B8 /* CCMesh.h in Headers */, 15162023199E75FF006099B8 /* CCBundleReader.h in Headers */, 15162024199E75FF006099B8 /* CCBundle3D.h in Headers */, 15162025199E75FF006099B8 /* CCAnimate3D.h in Headers */, @@ -5362,7 +5354,6 @@ 15162026199E75FF006099B8 /* CCMeshSkin.h in Headers */, 15162027199E75FF006099B8 /* CCAnimation3D.h in Headers */, 15162028199E75FF006099B8 /* CCAnimationCurve.h in Headers */, - 15162029199E75FF006099B8 /* CCMesh.h in Headers */, 1516202A199E75FF006099B8 /* CCObjLoader.h in Headers */, 1516202B199E75FF006099B8 /* CCSprite3D.h in Headers */, 1516202C199E75FF006099B8 /* CCSprite3DMaterial.h in Headers */, @@ -5379,8 +5370,8 @@ 15162214199E7A32006099B8 /* CCRay.h in Headers */, 15162215199E7A32006099B8 /* CCSkeleton3D.h in Headers */, 15162216199E7A32006099B8 /* CCAttachNode.h in Headers */, - 15162217199E7A32006099B8 /* CCSubMesh.h in Headers */, - 15162218199E7A32006099B8 /* CCSubMeshState.h in Headers */, + 15162217199E7A32006099B8 /* CCMeshVertexIndexData.h in Headers */, + 15162218199E7A32006099B8 /* CCMesh.h in Headers */, 15162219199E7A32006099B8 /* CCBundleReader.h in Headers */, 1516221A199E7A32006099B8 /* CCBundle3D.h in Headers */, 1516221B199E7A32006099B8 /* CCAnimate3D.h in Headers */, @@ -5388,7 +5379,6 @@ 1516221C199E7A32006099B8 /* CCMeshSkin.h in Headers */, 1516221D199E7A32006099B8 /* CCAnimation3D.h in Headers */, 1516221E199E7A32006099B8 /* CCAnimationCurve.h in Headers */, - 1516221F199E7A32006099B8 /* CCMesh.h in Headers */, 15162220199E7A32006099B8 /* CCObjLoader.h in Headers */, 15162221199E7A32006099B8 /* CCSprite3D.h in Headers */, 15162222199E7A32006099B8 /* CCSprite3DMaterial.h in Headers */, @@ -6913,14 +6903,13 @@ 1516200E199E75C2006099B8 /* CCRay.cpp in Sources */, 1516200F199E75C2006099B8 /* CCSkeleton3D.cpp in Sources */, 15162010199E75C2006099B8 /* CCAttachNode.cpp in Sources */, - 15162011199E75C2006099B8 /* CCSubMesh.cpp in Sources */, - 15162012199E75C2006099B8 /* CCSubMeshState.cpp in Sources */, + 15162011199E75C2006099B8 /* CCMeshVertexIndexData.cpp in Sources */, + 15162012199E75C2006099B8 /* CCMesh.cpp in Sources */, 15162013199E75C2006099B8 /* CCBundleReader.cpp in Sources */, 15162014199E75C2006099B8 /* CCBundle3D.cpp in Sources */, 15162015199E75C2006099B8 /* CCAnimate3D.cpp in Sources */, 15162016199E75C2006099B8 /* CCMeshSkin.cpp in Sources */, 15162017199E75C2006099B8 /* CCAnimation3D.cpp in Sources */, - 15162018199E75C2006099B8 /* CCMesh.cpp in Sources */, 15162019199E75C2006099B8 /* CCObjLoader.cpp in Sources */, 1516201A199E75C2006099B8 /* CCSprite3D.cpp in Sources */, 1516201B199E75C2006099B8 /* CCSprite3DMaterial.cpp in Sources */, @@ -6936,14 +6925,13 @@ 15162204199E7874006099B8 /* CCRay.cpp in Sources */, 15162205199E7874006099B8 /* CCSkeleton3D.cpp in Sources */, 15162206199E7874006099B8 /* CCAttachNode.cpp in Sources */, - 15162207199E7874006099B8 /* CCSubMesh.cpp in Sources */, - 15162208199E7874006099B8 /* CCSubMeshState.cpp in Sources */, + 15162207199E7874006099B8 /* CCMeshVertexIndexData.cpp in Sources */, + 15162208199E7874006099B8 /* CCMesh.cpp in Sources */, 15162209199E7874006099B8 /* CCBundleReader.cpp in Sources */, 1516220A199E7874006099B8 /* CCBundle3D.cpp in Sources */, 1516220B199E7874006099B8 /* CCAnimate3D.cpp in Sources */, 1516220C199E7874006099B8 /* CCMeshSkin.cpp in Sources */, 1516220D199E7874006099B8 /* CCAnimation3D.cpp in Sources */, - 1516220E199E7874006099B8 /* CCMesh.cpp in Sources */, 1516220F199E7874006099B8 /* CCObjLoader.cpp in Sources */, 15162210199E7874006099B8 /* CCSprite3D.cpp in Sources */, 15162211199E7874006099B8 /* CCSprite3DMaterial.cpp in Sources */, diff --git a/cocos/3d/CCMesh.cpp b/cocos/3d/CCMesh.cpp index 165a26fab6..8da9f6325a 100644 --- a/cocos/3d/CCMesh.cpp +++ b/cocos/3d/CCMesh.cpp @@ -22,17 +22,14 @@ THE SOFTWARE. ****************************************************************************/ -#include "CCMesh.h" - #include #include #include #include -#include "3d/CCSubMesh.h" -#include "3d/CCObjLoader.h" -#include "3d/CCSprite3DMaterial.h" -#include "3d/CCSubMesh.h" +#include "3d/CCMesh.h" +#include "3d/CCMeshSkin.h" +#include "3d/CCMeshVertexIndexData.h" #include "base/ccMacros.h" #include "base/CCEventCustom.h" @@ -41,362 +38,263 @@ #include "base/CCEventType.h" #include "base/CCDirector.h" #include "renderer/ccGLStateCache.h" +#include "renderer/CCTexture2D.h" +#include "renderer/CCTextureCache.h" +#include "renderer/CCGLProgramCache.h" using namespace std; NS_CC_BEGIN -//bool RenderMeshData::hasVertexAttrib(int attrib) -//{ -// for (auto itr = _vertexAttribs.begin(); itr != _vertexAttribs.end(); itr++) -// { -// if ((*itr).vertexAttrib == attrib) -// return true; //already has -// } -// return false; -//} -// -//bool RenderMeshData::init(const std::vector& positions, -// const std::vector& normals, -// const std::vector& texs, -// const std::vector& indices) -//{ -// CC_ASSERT(positions.size()<65536 * 3 && "index may out of bound"); -// -// _vertexAttribs.clear(); -// -// _vertexNum = positions.size() / 3; //number of vertex -// if (_vertexNum == 0) -// return false; -// -// if ((normals.size() != 0 && _vertexNum * 3 != normals.size()) || (texs.size() != 0 && _vertexNum * 2 != texs.size())) -// return false; -// -// MeshVertexAttrib meshvertexattrib; -// meshvertexattrib.size = 3; -// meshvertexattrib.type = GL_FLOAT; -// meshvertexattrib.attribSizeBytes = meshvertexattrib.size * sizeof(float); -// meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; -// _vertexAttribs.push_back(meshvertexattrib); -// -// //normal -// if (normals.size()) -// { -// //add normal flag -// meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; -// _vertexAttribs.push_back(meshvertexattrib); -// } -// // -// if (texs.size()) -// { -// meshvertexattrib.size = 2; -// meshvertexattrib.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; -// meshvertexattrib.attribSizeBytes = meshvertexattrib.size * sizeof(float); -// _vertexAttribs.push_back(meshvertexattrib); -// } -// -// _vertexs.clear(); -// _vertexsizeBytes = calVertexSizeBytes(); -// _vertexs.reserve(_vertexNum * _vertexsizeBytes / sizeof(float)); -// -// bool hasNormal = hasVertexAttrib(GLProgram::VERTEX_ATTRIB_NORMAL); -// bool hasTexCoord = hasVertexAttrib(GLProgram::VERTEX_ATTRIB_TEX_COORD); -// //position, normal, texCoordinate into _vertexs -// for(int i = 0; i < _vertexNum; i++) -// { -// _vertexs.push_back(positions[i * 3]); -// _vertexs.push_back(positions[i * 3 + 1]); -// _vertexs.push_back(positions[i * 3 + 2]); -// -// if (hasNormal) -// { -// _vertexs.push_back(normals[i * 3]); -// _vertexs.push_back(normals[i * 3 + 1]); -// _vertexs.push_back(normals[i * 3 + 2]); -// } -// -// if (hasTexCoord) -// { -// _vertexs.push_back(texs[i * 2]); -// _vertexs.push_back(texs[i * 2 + 1]); -// } -// } -// _subMeshIndices = indices; -// -// return true; -//} -// -//bool RenderMeshData::init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs) -//{ -// _vertexs = vertices; -// _subMeshIndices = indices; -// _vertexAttribs = attribs; -// -// _vertexsizeBytes = calVertexSizeBytes(); -// -// return true; -//} -// -//int RenderMeshData::calVertexSizeBytes() -//{ -// int sizeBytes = 0; -// for (auto it = _vertexAttribs.begin(); it != _vertexAttribs.end(); it++) { -// sizeBytes += (*it).size; -// CCASSERT((*it).type == GL_FLOAT, "use float"); -// } -// sizeBytes *= sizeof(float); -// -// return sizeBytes; -//} -// -//Mesh::Mesh() -//:_vertexBuffer(0) -//{ -//} -// -//Mesh::~Mesh() -//{ -// _subMeshes.clear(); -// cleanAndFreeBuffers(); -//} -// -//Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices) -//{ -// std::vector submeshIndices; -// submeshIndices.push_back(indices); -// return create(positions, normals, texs, submeshIndices); -//} -// -//Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) -//{ -// auto mesh = new Mesh(); -// if(mesh && mesh->init(positions, normals, texs, indices)) -// { -// mesh->autorelease(); -// return mesh; -// } -// CC_SAFE_DELETE(mesh); -// return nullptr; -//} -// -//Mesh* Mesh::create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, const std::vector& attribs) -//{ -// std::vector submeshIndices; -// submeshIndices.push_back(indices); -// return create(vertices, vertexSizeInFloat, submeshIndices, attribs); -//} -// -//Mesh* Mesh::create(const std::vector &vertices, int vertexSizeInFloat, const std::vector &indices, const std::vector &attribs) -//{ -// auto mesh = new Mesh(); -// if (mesh && mesh->init(vertices, vertexSizeInFloat, indices, attribs)) -// { -// mesh->autorelease(); -// return mesh; -// } -// CC_SAFE_DELETE(mesh); -// return nullptr; -//} -// -//Mesh* Mesh::create(const MeshData& meshdata) -//{ -// auto mesh = new Mesh(); -// if (mesh && mesh->init(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.subMeshIndices, meshdata.attribs)) -// { -// for (int i = 0; i < (int)mesh->getSubMeshCount(); i++) { -// auto submesh = mesh->getSubMesh(i); -// if (meshdata.subMeshIds.size()) -// submesh->_id = meshdata.subMeshIds[i]; -// submesh->_mesh = mesh; -// } -// } -// mesh->autorelease(); -// return mesh; -//} -// -//bool Mesh::init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices) -//{ -// bool bRet = _renderdata.init(positions, normals, texs, indices); -// if (!bRet) -// return false; -// -// buildSubMeshes(); -// -// buildBuffer(); -// -// return true; -//} -// -// -//bool Mesh::init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs) -//{ -// bool bRet = _renderdata.init(vertices, vertexSizeInFloat, indices, attribs); -// if (!bRet) -// return false; -// -// buildSubMeshes(); -// -// buildBuffer(); -// -// return true; -//} -// -//void Mesh::buildSubMeshes() -//{ -// _subMeshes.clear(); -// for (auto& it : _renderdata._subMeshIndices) { -// auto subMesh = SubMesh::create(PrimitiveType::TRIANGLES, IndexFormat::INDEX16, it); -// _subMeshes.pushBack(subMesh); -// -// //calculate aabb for sub mesh -// AABB aabb; -// int stride = _renderdata._vertexsizeBytes / sizeof(float); -// for(const auto& index : it) -// { -// Vec3 point = Vec3(_renderdata._vertexs[index * stride ], _renderdata._vertexs[ index * stride + 1], _renderdata._vertexs[index * stride + 2 ]); -// aabb.updateMinMax(&point, 1); -// } -// subMesh->_aabb = aabb; -// } -//} -// -//void Mesh::cleanAndFreeBuffers() -//{ -// if(glIsBuffer(_vertexBuffer)) -// { -// glDeleteBuffers(1, &_vertexBuffer); -// _vertexBuffer = 0; -// } -// -// for (auto& it : _subMeshes) { -// (*it).cleanAndFreeBuffers(); -// } -//} -// -//void Mesh::buildBuffer() -//{ -// cleanAndFreeBuffers(); -// -// glGenBuffers(1, &_vertexBuffer); -// glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); -// -// glBufferData(GL_ARRAY_BUFFER, -// _renderdata._vertexs.size() * sizeof(_renderdata._vertexs[0]), -// &_renderdata._vertexs[0], -// GL_STATIC_DRAW); -// glBindBuffer(GL_ARRAY_BUFFER, 0); -// -// for (size_t i = 0; i < _subMeshes.size(); i++) { -// _subMeshes.at(i)->buildBuffer(_renderdata._subMeshIndices[i]); -// } -//} -// -//void Mesh::restore() -//{ -// _vertexBuffer = 0; -// for (auto& it : _subMeshes) { -// it->_indexBuffer = 0; -// } -// -// buildBuffer(); -//} -// -//SubMesh* Mesh::getSubMeshById(const std::string& subMeshId) const -//{ -// for (auto it : _subMeshes) { -// if (it->getSubMeshId() == subMeshId) -// return it; -// } -// return nullptr; -//} -// -///** -// * MeshCache -// */ -//MeshCache* MeshCache::_cacheInstance = nullptr; -// -//MeshCache* MeshCache::getInstance() -//{ -// if (_cacheInstance == nullptr) -// _cacheInstance = new MeshCache(); -// -// return _cacheInstance; -//} -//void MeshCache::destroyInstance() -//{ -// if (_cacheInstance) -// CC_SAFE_DELETE(_cacheInstance); -//} -// -//Mesh* MeshCache::getMesh(const std::string& key) const -//{ -// auto it = _meshes.find(key); -// if (it != _meshes.end()) -// return it->second; -// -// return nullptr; -//} -// -//bool MeshCache::addMesh(const std::string& key, Mesh* mesh) -//{ -// auto it = _meshes.find(key); -// if (it == _meshes.end()) -// { -// mesh->retain(); -// _meshes[key] = mesh; -// -// return true; -// } -// return false; -//} -// -//void MeshCache::removeAllMeshes() -//{ -// for (auto it : _meshes) { -// CC_SAFE_RELEASE(it.second); -// } -// _meshes.clear(); -//} -// -//void MeshCache::removeUnusedMesh() -//{ -// for( auto it=_meshes.cbegin(); it!=_meshes.cend(); /* nothing */) { -// if(it->second->getReferenceCount() == 1) -// { -// it->second->release(); -// _meshes.erase(it++); -// } -// else -// ++it; -// } -//} -// -//MeshCache::MeshCache() -//{ -//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) -// // listen the event that renderer was recreated on Android/WP8 -// _rendererRecreatedListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, CC_CALLBACK_1(MeshCache::listenRendererRecreated, this)); -// Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_rendererRecreatedListener, -1); -//#endif -//} -//MeshCache::~MeshCache() -//{ -// removeAllMeshes(); -//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) -// Director::getInstance()->getEventDispatcher()->removeEventListener(_rendererRecreatedListener); -//#endif -//} -// -//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) -//void MeshCache::listenRendererRecreated(EventCustom* event) -//{ -// for (auto iter = _meshes.begin(); iter != _meshes.end(); ++iter) -// { -// auto mesh = iter->second; -// mesh->restore(); -// } -//} -//#endif +Mesh::Mesh() +: _visible(true) +, _texture(nullptr) +, _skin(nullptr) +, _meshIndexData(nullptr) +, _visibleChanged(nullptr) +, _glProgramState(nullptr) +, _blend(BlendFunc::ALPHA_NON_PREMULTIPLIED) +{ + +} +Mesh::~Mesh() +{ + CC_SAFE_RELEASE(_texture); + CC_SAFE_RELEASE(_skin); + CC_SAFE_RELEASE(_meshIndexData); + CC_SAFE_RELEASE(_glProgramState); +} + +GLuint Mesh::getVertexBuffer() const +{ + return _meshIndexData->getVertexBuffer()->getVBO(); +} + +bool Mesh::hasVertexAttrib(int attrib) const +{ + return _meshIndexData->getMeshVertexData()->hasVertexAttrib(attrib); +} + +ssize_t Mesh::getMeshVertexAttribCount() const +{ + return _meshIndexData->getMeshVertexData()->getMeshVertexAttribCount(); +} + +const MeshVertexAttrib& Mesh::getMeshVertexAttribute(int idx) +{ + return _meshIndexData->getMeshVertexData()->getMeshVertexAttrib(idx); +} + +int Mesh::getVertexSizeInBytes() const +{ + return _meshIndexData->getVertexBuffer()->getSizePerVertex(); +} + +Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices) +{ + int perVertexSizeInFloat = 0; + std::vector vertices; + std::vector attribs; + MeshVertexAttrib att; + att.size = 3; + att.type = GL_FLOAT; + att.attribSizeBytes = att.size * sizeof(float); + + if (positions.size()) + { + perVertexSizeInFloat += 3; + att.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; + attribs.push_back(att); + } + if (normals.size()) + { + perVertexSizeInFloat += 3; + att.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; + attribs.push_back(att); + } + if (texs.size()) + { + perVertexSizeInFloat += 2; + att.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; + att.size = 2; + att.attribSizeBytes = att.size * sizeof(float); + attribs.push_back(att); + } + + bool hasNormal = (normals.size() != 0); + bool hasTexCoord = (texs.size() != 0); + //position, normal, texCoordinate into _vertexs + size_t vertexNum = positions.size() / 3; + for(size_t i = 0; i < vertexNum; i++) + { + vertices.push_back(positions[i * 3]); + vertices.push_back(positions[i * 3 + 1]); + vertices.push_back(positions[i * 3 + 2]); + + if (hasNormal) + { + vertices.push_back(normals[i * 3]); + vertices.push_back(normals[i * 3 + 1]); + vertices.push_back(normals[i * 3 + 2]); + } + + if (hasTexCoord) + { + vertices.push_back(texs[i * 2]); + vertices.push_back(texs[i * 2 + 1]); + } + } + return create(vertices, perVertexSizeInFloat, indices, attribs); +} + +Mesh* Mesh::create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, const std::vector& attribs) +{ + MeshData meshdata; + meshdata.attribs = attribs; + meshdata.vertex = vertices; + meshdata.subMeshIndices.push_back(indices); + meshdata.subMeshIds.push_back(""); + auto meshvertexdata = MeshVertexData::create(meshdata); + auto indexbuffer = IndexBuffer::create(IndexBuffer::IndexType::INDEX_TYPE_SHORT_16, (int)indices.size()); + + AABB aabb = MeshVertexData::calculateAABB(meshdata.vertex, meshdata.getPerVertexSize(), indices); + auto indexData = MeshIndexData::create("", meshvertexdata, indexbuffer, aabb); + + return create("", indexData); +} + +Mesh* Mesh::create(const std::string& name, MeshIndexData* indexData, MeshSkin* skin) +{ + auto state = new Mesh(); + state->autorelease(); + state->bindMeshCommand(); + state->_name = name; + state->setMeshIndexData(indexData); + state->setSkin(skin); + + return state; +} + +void Mesh::setVisible(bool visible) +{ + if (_visible != visible) + { + _visible = visible; + if (_visibleChanged) + _visibleChanged(); + } +} + +void Mesh::setTexture(const std::string& texPath) +{ + auto tex = Director::getInstance()->getTextureCache()->addImage(texPath); + setTexture(tex); +} + +void Mesh::setTexture(Texture2D* tex) +{ + if (tex != _texture) + { + CC_SAFE_RETAIN(tex); + CC_SAFE_RELEASE(_texture); + _texture = tex; + bindMeshCommand(); + } +} + +void Mesh::setSkin(MeshSkin* skin) +{ + if (_skin != skin) + { + CC_SAFE_RETAIN(skin); + CC_SAFE_RELEASE(_skin); + _skin = skin; + calcuateAABB(); + } +} + +void Mesh::setMeshIndexData(MeshIndexData* subMesh) +{ + if (_meshIndexData != subMesh) + { + CC_SAFE_RETAIN(subMesh); + CC_SAFE_RELEASE(_meshIndexData); + _meshIndexData = subMesh; + calcuateAABB(); + bindMeshCommand(); + } +} + +void Mesh::setGLProgramState(GLProgramState* glProgramState) +{ + if (_glProgramState != glProgramState) + { + CC_SAFE_RETAIN(glProgramState); + CC_SAFE_RELEASE(_glProgramState); + _glProgramState = glProgramState; + bindMeshCommand(); + } +} + +void Mesh::calcuateAABB() +{ + if (_meshIndexData) + { + _aabb = _meshIndexData->getAABB(); + if (_skin) + { + Bone3D* root = _skin->getRootBone(); + if (root) + { + _aabb.transform(root->getWorldMat()); + } + } + } +} + +void Mesh::bindMeshCommand() +{ + if (_glProgramState && _meshIndexData && _texture) + { + GLuint texID = _texture ? _texture->getName() : 0; + _meshCommand.genMaterialID(texID, _glProgramState, _meshIndexData->getVertexBuffer()->getVBO(), _meshIndexData->getIndexBuffer()->getVBO(), _blend); + _meshCommand.setCullFaceEnabled(true); + _meshCommand.setDepthTestEnabled(true); + } +} + +void Mesh::setBlendFunc(const BlendFunc &blendFunc) +{ + if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) + { + _blend = blendFunc; + bindMeshCommand(); + } +} +const BlendFunc &Mesh::getBlendFunc() const +{ + return _blend; +} + +GLenum Mesh::getPrimitiveType() const +{ + return _meshIndexData->getPrimitiveType(); +} + +ssize_t Mesh::getIndexCount() const +{ + return _meshIndexData->getIndexBuffer()->getIndexNumber(); +} + +GLenum Mesh::getIndexFormat() const +{ + return GL_UNSIGNED_SHORT; +} + +GLuint Mesh::getIndexBuffer() const +{ + return _meshIndexData->getIndexBuffer()->getVBO(); +} NS_CC_END diff --git a/cocos/3d/CCMesh.h b/cocos/3d/CCMesh.h index 0a20a1a7be..d46c0c790a 100644 --- a/cocos/3d/CCMesh.h +++ b/cocos/3d/CCMesh.h @@ -29,183 +29,121 @@ #include #include "3d/CCBundle3DData.h" -#include "3d/CCSubMesh.h" +#include "3d/CCAABB.h" #include "base/CCRef.h" #include "base/ccTypes.h" -#include "base/CCVector.h" #include "math/CCMath.h" #include "renderer/CCGLProgram.h" - -#include "CCAABB.h" +#include "renderer/CCGLProgramState.h" +#include "renderer/CCMeshCommand.h" #include "3d/3dExport.h" - NS_CC_BEGIN -class EventListenerCustom; -class EventCustom; +class Texture2D; +class MeshSkin; +class MeshIndexData; +/** + * SubMeshState: visibility and apperence of submesh + */ +class CC_3D_DLL Mesh : public Ref +{ + friend class Sprite3D; +public: + typedef std::vector IndexArray; + /**create mesh from positions, normals, and so on, sigle SubMesh*/ + static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices); + /**create mesh with vertex attributes*/ + CC_DEPRECATED_ATTRIBUTE static Mesh* create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, int numIndex, const std::vector& attribs, int attribCount){ return create(vertices, perVertexSizeInFloat, indices, attribs); } + + static Mesh* create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, const std::vector& attribs); + + /** create mesh */ + static Mesh* create(const std::string& name, MeshIndexData* indexData, MeshSkin* skin = nullptr); + + /**get vertex buffer*/ + GLuint getVertexBuffer() const; + /**has vertex attribute?*/ + bool hasVertexAttrib(int attrib) const; + /**get mesh vertex attribute count*/ + ssize_t getMeshVertexAttribCount() const; + /**get MeshVertexAttribute by index*/ + const MeshVertexAttrib& getMeshVertexAttribute(int idx); + /**get per vertex size in bytes*/ + int getVertexSizeInBytes() const; -//class CC_3D_DLL RenderMeshData -//{ -// typedef std::vector IndexArray; -// friend class Mesh; -//public: -// RenderMeshData(): _vertexsizeBytes(0) -// { -// } -// bool hasVertexAttrib(int attrib); -// bool init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& subMeshIndices); -// bool init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); -// -//protected: -// -// int calVertexSizeBytes(); -// -// int _vertexsizeBytes; -// ssize_t _vertexNum; -// std::vector _vertexs; -// std::vector _subMeshIndices; -// std::vector _vertexAttribs; -//}; -// -///** -// * Mesh: Geometry with a collection of vertex. -// * Supporting various vertex formats. -// */ -//class CC_3D_DLL Mesh : public Ref -//{ -// typedef std::vector IndexArray; -//public: -// /**create mesh from positions, normals, and so on, sigle SubMesh*/ -// static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices); -// -// /**create mesh from positions, normals, and so on, multi-SubMesh*/ -// static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& subMeshIndices); -// -// /**create mesh with vertex attributes*/ -// CC_DEPRECATED_ATTRIBUTE static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, int numIndex, const std::vector& attribs, int attribCount) { return create(vertices, vertexSizeInFloat, indices, attribs); } -// -// /** -// * create Mesh -// * @param vertices vertices buffer data -// * @param vertexSizeInFloat size of each vertex -// * @param indices index buffer data that denotes how to connect the vertex, sigle SubMesh -// * @param attribs vertex attributes -// */ -// static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const IndexArray& indices, const std::vector& attribs); -// -// /** -// * create Mesh -// * @param vertices vertices buffer data -// * @param vertexSizeInFloat size of each vertex -// * @param subMeshIndices index buffer data that denotes how to connect the vertex, multi-SubMesh -// * @param attribs vertex attributes -// */ -// static Mesh* create(const std::vector& vertices, int vertexSizeInFloat, const std::vector& subMeshIndices, const std::vector& attribs); -// -// static Mesh* create(const MeshData& meshdata); -// -// /**get vertex buffer*/ -// inline GLuint getVertexBuffer() const { return _vertexBuffer; } -// -// /**get mesh vertex attribute count*/ -// ssize_t getMeshVertexAttribCount() const { return _renderdata._vertexAttribs.size(); } -// /**get MeshVertexAttribute by index*/ -// const MeshVertexAttrib& getMeshVertexAttribute(int idx) const { return _renderdata._vertexAttribs[idx]; } -// /**has vertex attribute?*/ -// bool hasVertexAttrib(int attrib) { return _renderdata.hasVertexAttrib(attrib); } -// /**get per vertex size in bytes*/ -// int getVertexSizeInBytes() const { return _renderdata._vertexsizeBytes; } -// -// /**get sub mesh count*/ -// ssize_t getSubMeshCount() const { return _subMeshes.size(); } -// -// /**get sub mesh by index*/ -// SubMesh* getSubMesh(int index) const { return _subMeshes.at(index); } -// -// /**build vertex buffer from renderdata*/ -// void restore(); -// -// /** get submesh by id */ -// SubMesh* getSubMeshById(const std::string& subMeshId) const; -// -// /**to be deprecated, those functions have been moved to SubMesh*/ -// /** get primitive type*/ -// CC_DEPRECATED_ATTRIBUTE PrimitiveType getPrimitiveType() const { return _subMeshes.at(0)->getPrimitiveType(); } -// /**get index count*/ -// CC_DEPRECATED_ATTRIBUTE ssize_t getIndexCount() const { return _subMeshes.at(0)->getIndexCount(); } -// /**get index format*/ -// CC_DEPRECATED_ATTRIBUTE IndexFormat getIndexFormat() const { return _subMeshes.at(0)->getIndexFormat(); } -// /**get index buffer*/ -// CC_DEPRECATED_ATTRIBUTE GLuint getIndexBuffer() const {return _subMeshes.at(0)->getIndexBuffer(); } -// -//CC_CONSTRUCTOR_ACCESS: -// -// Mesh(); -// virtual ~Mesh(); -// /**init mesh*/ -// bool init(const std::vector& positions, const std::vector& normals, const std::vector& texs, const std::vector& indices); -// -// /**init mesh*/ -// bool init(const std::vector& vertices, int vertexSizeInFloat, const std::vector& indices, const std::vector& attribs); -// -// /**build sub meshes*/ -// void buildSubMeshes(); -// /**build buffer*/ -// void buildBuffer(); -// /**free buffer*/ -// void cleanAndFreeBuffers(); -// -//protected: -// GLuint _vertexBuffer; -// Vector _subMeshes; -// -// RenderMeshData _renderdata; -//}; -// -///** -// * Mesh Cache -// */ -//class MeshCache -//{ -//public: -// /**get & destroy*/ -// static MeshCache* getInstance(); -// static void destroyInstance(); -// -// /**get mesh from cache*/ -// Mesh* getMesh(const std::string& key) const; -// -// /**add mesh to cache*/ -// bool addMesh(const std::string& key, Mesh* mesh); -// -// /**remove all meshes*/ -// void removeAllMeshes(); -// -// /**remove unused meshes*/ -// void removeUnusedMesh(); -// -//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) -// void listenRendererRecreated(EventCustom* event); -//#endif -// -//CC_CONSTRUCTOR_ACCESS: -// -// MeshCache(); -// ~MeshCache(); -// -//protected: -// -// static MeshCache* _cacheInstance;//instance -// -// std::unordered_map _meshes; //cached meshes -// -//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8) -// EventListenerCustom* _rendererRecreatedListener; -//#endif -//}; + /**texture getter and setter*/ + void setTexture(const std::string& texPath); + void setTexture(Texture2D* tex); + Texture2D* getTexture() const { return _texture; } + + /**visible getter and setter*/ + void setVisible(bool visible); + bool isVisible() const { return _visible; } + + /**skin getter */ + MeshSkin* getSkin() const { return _skin; } + + /**mesh index data getter */ + MeshIndexData* getMeshIndexData() const { return _meshIndexData; } + + /**get GLProgramState*/ + GLProgramState* getGLProgramState() const { return _glProgramState; } + + /**name getter */ + const std::string& getName() const { return _name; } + + void setBlendFunc(const BlendFunc &blendFunc); + const BlendFunc &getBlendFunc() const; + + /** get primitive type*/ + GLenum getPrimitiveType() const; + /**get index count*/ + ssize_t getIndexCount() const; + /**get index format*/ + GLenum getIndexFormat() const; + /**get index buffer*/ + GLuint getIndexBuffer() const; + +CC_CONSTRUCTOR_ACCESS: + + Mesh(); + virtual ~Mesh(); + + GLProgram* getDefaultGLProgram(bool textured); + + void setGLProgramState(GLProgramState* glProgramState); + + MeshCommand& getMeshCommand() { return _meshCommand; } + + /**skin setter*/ + void setSkin(MeshSkin* skin); + /**Mesh index data setter*/ + void setMeshIndexData(MeshIndexData* indexdata); + /**name setter*/ + void setName(const std::string& name) { _name = name; } + + const AABB& getAABB() const { return _aabb; } + + void calcuateAABB(); + + void bindMeshCommand(); +protected: + Texture2D* _texture; //texture that submesh is using + MeshSkin* _skin; //skin + bool _visible; // is the submesh visible + + //since 3.3 + std::string _name; + MeshIndexData* _meshIndexData; + GLProgramState* _glProgramState; + MeshCommand _meshCommand; + BlendFunc _blend; + AABB _aabb; + std::function _visibleChanged; +}; NS_CC_END -#endif // __CCMESH_H_ +#endif // __CCMESH_H__ diff --git a/cocos/3d/CCSubMesh.cpp b/cocos/3d/CCMeshVertexIndexData.cpp similarity index 99% rename from cocos/3d/CCSubMesh.cpp rename to cocos/3d/CCMeshVertexIndexData.cpp index 0794e2d561..5d5621a10d 100644 --- a/cocos/3d/CCSubMesh.cpp +++ b/cocos/3d/CCMeshVertexIndexData.cpp @@ -22,13 +22,12 @@ THE SOFTWARE. ****************************************************************************/ -#include "CCSubMesh.h" - #include #include #include #include +#include "3d/CCMeshVertexIndexData.h" #include "3d/CCObjLoader.h" #include "3d/CCSprite3DMaterial.h" #include "3d/CCMesh.h" diff --git a/cocos/3d/CCSubMesh.h b/cocos/3d/CCMeshVertexIndexData.h similarity index 97% rename from cocos/3d/CCSubMesh.h rename to cocos/3d/CCMeshVertexIndexData.h index b3e70f107d..d60a246c4f 100644 --- a/cocos/3d/CCSubMesh.h +++ b/cocos/3d/CCMeshVertexIndexData.h @@ -22,8 +22,8 @@ THE SOFTWARE. ****************************************************************************/ -#ifndef __CCSUBMESH_H__ -#define __CCSUBMESH_H__ +#ifndef __CCMESHVERTEXINDEXDATA_H__ +#define __CCMESHVERTEXINDEXDATA_H__ #include #include @@ -126,4 +126,4 @@ protected: NS_CC_END -#endif // __CCSUBMESH_H_ +#endif // __CCMESHVERTEXINDEXDATA_H__ diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index e6b552ba3f..9e299aad30 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -23,14 +23,11 @@ ****************************************************************************/ #include "3d/CCSprite3D.h" -#include "3d/CCMesh.h" #include "3d/CCObjLoader.h" #include "3d/CCMeshSkin.h" #include "3d/CCBundle3D.h" #include "3d/CCSprite3DMaterial.h" -#include "3d/CCSubMesh.h" #include "3d/CCAttachNode.h" -#include "3d/CCSubMeshState.h" #include "3d/CCSkeleton3D.h" #include "base/CCDirector.h" diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index a617e40696..1c2b77e90b 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -36,8 +36,7 @@ #include "3d/CCAABB.h" #include "3d/CCBundle3DData.h" #include "3d/CCMesh.h" -#include "3d/CCSubMeshState.h" -#include "3d/CCSubMesh.h" +#include "3d/CCMeshVertexIndexData.h" #include "3d/3dExport.h" diff --git a/cocos/3d/CCSubMeshState.cpp b/cocos/3d/CCSubMeshState.cpp deleted file mode 100644 index da495a8a61..0000000000 --- a/cocos/3d/CCSubMeshState.cpp +++ /dev/null @@ -1,301 +0,0 @@ -/**************************************************************************** - Copyright (c) 2014 Chukong Technologies Inc. - - http://www.cocos2d-x.org - - 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. - ****************************************************************************/ - -#include -#include -#include -#include - -#include "3d/CCSubMeshState.h" -#include "3d/CCMeshSkin.h" -#include "3d/CCSubMesh.h" -#include "3d/CCSprite3D.h" - -#include "base/ccMacros.h" -#include "base/CCEventCustom.h" -#include "base/CCEventListenerCustom.h" -#include "base/CCEventDispatcher.h" -#include "base/CCEventType.h" -#include "base/CCDirector.h" -#include "renderer/ccGLStateCache.h" -#include "renderer/CCTexture2D.h" -#include "renderer/CCTextureCache.h" -#include "renderer/CCGLProgramCache.h" - - -using namespace std; - -NS_CC_BEGIN - -Mesh::Mesh() -: _visible(true) -, _texture(nullptr) -, _skin(nullptr) -, _meshIndexData(nullptr) -, _visibleChanged(nullptr) -, _glProgramState(nullptr) -, _blend(BlendFunc::ALPHA_NON_PREMULTIPLIED) -{ - -} -Mesh::~Mesh() -{ - CC_SAFE_RELEASE(_texture); - CC_SAFE_RELEASE(_skin); - CC_SAFE_RELEASE(_meshIndexData); - CC_SAFE_RELEASE(_glProgramState); -} - -GLuint Mesh::getVertexBuffer() const -{ - return _meshIndexData->getVertexBuffer()->getVBO(); -} - -bool Mesh::hasVertexAttrib(int attrib) const -{ - return _meshIndexData->getMeshVertexData()->hasVertexAttrib(attrib); -} - -ssize_t Mesh::getMeshVertexAttribCount() const -{ - return _meshIndexData->getMeshVertexData()->getMeshVertexAttribCount(); -} - -const MeshVertexAttrib& Mesh::getMeshVertexAttribute(int idx) -{ - return _meshIndexData->getMeshVertexData()->getMeshVertexAttrib(idx); -} - -int Mesh::getVertexSizeInBytes() const -{ - return _meshIndexData->getVertexBuffer()->getSizePerVertex(); -} - -Mesh* Mesh::create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices) -{ - int perVertexSizeInFloat = 0; - std::vector vertices; - std::vector attribs; - MeshVertexAttrib att; - att.size = 3; - att.type = GL_FLOAT; - att.attribSizeBytes = att.size * sizeof(float); - - if (positions.size()) - { - perVertexSizeInFloat += 3; - att.vertexAttrib = GLProgram::VERTEX_ATTRIB_POSITION; - attribs.push_back(att); - } - if (normals.size()) - { - perVertexSizeInFloat += 3; - att.vertexAttrib = GLProgram::VERTEX_ATTRIB_NORMAL; - attribs.push_back(att); - } - if (texs.size()) - { - perVertexSizeInFloat += 2; - att.vertexAttrib = GLProgram::VERTEX_ATTRIB_TEX_COORD; - att.size = 2; - att.attribSizeBytes = att.size * sizeof(float); - attribs.push_back(att); - } - - bool hasNormal = (normals.size() != 0); - bool hasTexCoord = (texs.size() != 0); - //position, normal, texCoordinate into _vertexs - size_t vertexNum = positions.size() / 3; - for(size_t i = 0; i < vertexNum; i++) - { - vertices.push_back(positions[i * 3]); - vertices.push_back(positions[i * 3 + 1]); - vertices.push_back(positions[i * 3 + 2]); - - if (hasNormal) - { - vertices.push_back(normals[i * 3]); - vertices.push_back(normals[i * 3 + 1]); - vertices.push_back(normals[i * 3 + 2]); - } - - if (hasTexCoord) - { - vertices.push_back(texs[i * 2]); - vertices.push_back(texs[i * 2 + 1]); - } - } - return create(vertices, perVertexSizeInFloat, indices, attribs); -} - -Mesh* Mesh::create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, const std::vector& attribs) -{ - MeshData meshdata; - meshdata.attribs = attribs; - meshdata.vertex = vertices; - meshdata.subMeshIndices.push_back(indices); - meshdata.subMeshIds.push_back(""); - auto meshvertexdata = MeshVertexData::create(meshdata); - auto indexbuffer = IndexBuffer::create(IndexBuffer::IndexType::INDEX_TYPE_SHORT_16, (int)indices.size()); - - AABB aabb = MeshVertexData::calculateAABB(meshdata.vertex, meshdata.getPerVertexSize(), indices); - auto indexData = MeshIndexData::create("", meshvertexdata, indexbuffer, aabb); - - return create("", indexData); -} - -Mesh* Mesh::create(const std::string& name, MeshIndexData* indexData, MeshSkin* skin) -{ - auto state = new Mesh(); - state->autorelease(); - state->bindMeshCommand(); - state->_name = name; - state->setMeshIndexData(indexData); - state->setSkin(skin); - - return state; -} - -void Mesh::setVisible(bool visible) -{ - if (_visible != visible) - { - _visible = visible; - if (_visibleChanged) - _visibleChanged(); - } -} - -void Mesh::setTexture(const std::string& texPath) -{ - auto tex = Director::getInstance()->getTextureCache()->addImage(texPath); - setTexture(tex); -} - -void Mesh::setTexture(Texture2D* tex) -{ - if (tex != _texture) - { - CC_SAFE_RETAIN(tex); - CC_SAFE_RELEASE(_texture); - _texture = tex; - bindMeshCommand(); - } -} - -void Mesh::setSkin(MeshSkin* skin) -{ - if (_skin != skin) - { - CC_SAFE_RETAIN(skin); - CC_SAFE_RELEASE(_skin); - _skin = skin; - calcuateAABB(); - } -} - -void Mesh::setMeshIndexData(MeshIndexData* subMesh) -{ - if (_meshIndexData != subMesh) - { - CC_SAFE_RETAIN(subMesh); - CC_SAFE_RELEASE(_meshIndexData); - _meshIndexData = subMesh; - calcuateAABB(); - bindMeshCommand(); - } -} - -void Mesh::setGLProgramState(GLProgramState* glProgramState) -{ - if (_glProgramState != glProgramState) - { - CC_SAFE_RETAIN(glProgramState); - CC_SAFE_RELEASE(_glProgramState); - _glProgramState = glProgramState; - bindMeshCommand(); - } -} - -void Mesh::calcuateAABB() -{ - if (_meshIndexData) - { - _aabb = _meshIndexData->getAABB(); - if (_skin) - { - Bone3D* root = _skin->getRootBone(); - if (root) - { - _aabb.transform(root->getWorldMat()); - } - } - } -} - -void Mesh::bindMeshCommand() -{ - if (_glProgramState && _meshIndexData && _texture) - { - GLuint texID = _texture ? _texture->getName() : 0; - _meshCommand.genMaterialID(texID, _glProgramState, _meshIndexData->getVertexBuffer()->getVBO(), _meshIndexData->getIndexBuffer()->getVBO(), _blend); - _meshCommand.setCullFaceEnabled(true); - _meshCommand.setDepthTestEnabled(true); - } -} - -void Mesh::setBlendFunc(const BlendFunc &blendFunc) -{ - if(_blend.src != blendFunc.src || _blend.dst != blendFunc.dst) - { - _blend = blendFunc; - bindMeshCommand(); - } -} -const BlendFunc &Mesh::getBlendFunc() const -{ - return _blend; -} - -GLenum Mesh::getPrimitiveType() const -{ - return _meshIndexData->getPrimitiveType(); -} - -ssize_t Mesh::getIndexCount() const -{ - return _meshIndexData->getIndexBuffer()->getIndexNumber(); -} - -GLenum Mesh::getIndexFormat() const -{ - return GL_UNSIGNED_SHORT; -} - -GLuint Mesh::getIndexBuffer() const -{ - return _meshIndexData->getIndexBuffer()->getVBO(); -} - -NS_CC_END diff --git a/cocos/3d/CCSubMeshState.h b/cocos/3d/CCSubMeshState.h deleted file mode 100644 index 7962e9339c..0000000000 --- a/cocos/3d/CCSubMeshState.h +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************************** - Copyright (c) 2014 Chukong Technologies Inc. - - http://www.cocos2d-x.org - - 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 __CCSUBMESHSTATE_H__ -#define __CCSUBMESHSTATE_H__ - -#include -#include - -#include "3d/CCBundle3DData.h" -#include "3d/CCAABB.h" - -#include "base/CCRef.h" -#include "base/ccTypes.h" -#include "math/CCMath.h" -#include "renderer/CCGLProgram.h" -#include "renderer/CCGLProgramState.h" -#include "renderer/CCMeshCommand.h" -#include "3d/3dExport.h" - -NS_CC_BEGIN - -class Texture2D; -class MeshSkin; -class MeshIndexData; -/** - * SubMeshState: visibility and apperence of submesh - */ -class CC_3D_DLL Mesh : public Ref -{ - friend class Sprite3D; -public: - typedef std::vector IndexArray; - /**create mesh from positions, normals, and so on, sigle SubMesh*/ - static Mesh* create(const std::vector& positions, const std::vector& normals, const std::vector& texs, const IndexArray& indices); - /**create mesh with vertex attributes*/ - CC_DEPRECATED_ATTRIBUTE static Mesh* create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, int numIndex, const std::vector& attribs, int attribCount){ return create(vertices, perVertexSizeInFloat, indices, attribs); } - - static Mesh* create(const std::vector& vertices, int perVertexSizeInFloat, const IndexArray& indices, const std::vector& attribs); - - /** create mesh */ - static Mesh* create(const std::string& name, MeshIndexData* indexData, MeshSkin* skin = nullptr); - - /**get vertex buffer*/ - GLuint getVertexBuffer() const; - /**has vertex attribute?*/ - bool hasVertexAttrib(int attrib) const; - /**get mesh vertex attribute count*/ - ssize_t getMeshVertexAttribCount() const; - /**get MeshVertexAttribute by index*/ - const MeshVertexAttrib& getMeshVertexAttribute(int idx); - /**get per vertex size in bytes*/ - int getVertexSizeInBytes() const; - - /**texture getter and setter*/ - void setTexture(const std::string& texPath); - void setTexture(Texture2D* tex); - Texture2D* getTexture() const { return _texture; } - - /**visible getter and setter*/ - void setVisible(bool visible); - bool isVisible() const { return _visible; } - - /**skin getter */ - MeshSkin* getSkin() const { return _skin; } - - /**mesh index data getter */ - MeshIndexData* getMeshIndexData() const { return _meshIndexData; } - - /**get GLProgramState*/ - GLProgramState* getGLProgramState() const { return _glProgramState; } - - /**name getter */ - const std::string& getName() const { return _name; } - - void setBlendFunc(const BlendFunc &blendFunc); - const BlendFunc &getBlendFunc() const; - - /** get primitive type*/ - GLenum getPrimitiveType() const; - /**get index count*/ - ssize_t getIndexCount() const; - /**get index format*/ - GLenum getIndexFormat() const; - /**get index buffer*/ - GLuint getIndexBuffer() const; - -CC_CONSTRUCTOR_ACCESS: - - Mesh(); - virtual ~Mesh(); - - GLProgram* getDefaultGLProgram(bool textured); - - void setGLProgramState(GLProgramState* glProgramState); - - MeshCommand& getMeshCommand() { return _meshCommand; } - - /**skin setter*/ - void setSkin(MeshSkin* skin); - /**Mesh index data setter*/ - void setMeshIndexData(MeshIndexData* indexdata); - /**name setter*/ - void setName(const std::string& name) { _name = name; } - - const AABB& getAABB() const { return _aabb; } - - void calcuateAABB(); - - void bindMeshCommand(); -protected: - Texture2D* _texture; //texture that submesh is using - MeshSkin* _skin; //skin - bool _visible; // is the submesh visible - - //since 3.3 - std::string _name; - MeshIndexData* _meshIndexData; - GLProgramState* _glProgramState; - MeshCommand _meshCommand; - BlendFunc _blend; - AABB _aabb; - std::function _visibleChanged; -}; - -NS_CC_END - -#endif // __CCSUBMESHSTATE_H__ diff --git a/cocos/3d/cocos3d.h b/cocos/3d/cocos3d.h index 58e88e969d..fdbfef8fca 100755 --- a/cocos/3d/cocos3d.h +++ b/cocos/3d/cocos3d.h @@ -35,7 +35,7 @@ #include "3d/CCAnimate3D.h" #include "3d/CCAnimation3D.h" #include "3d/CCSprite3DMaterial.h" -#include "3d/CCSubMeshState.h" #include "3d/CCAttachNode.h" +#include "3d/CCMeshVertexIndexData.h" #endif diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index f1812c5a6c..d817e0e348 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -26,7 +26,6 @@ #include "Sprite3DTest.h" #include "3d/CCAnimation3D.h" #include "3d/CCAnimate3D.h" -#include "3d/CCSubMesh.h" #include "3d/CCAttachNode.h" #include "3d/CCRay.h" #include "3d/CCSprite3D.h" From 81dbb0bca44b486aaef47893454e1754286ce400 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 14:02:51 +0800 Subject: [PATCH 60/67] add comment --- cocos/3d/CCMesh.h | 11 ++++++----- cocos/3d/CCMeshVertexIndexData.h | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cocos/3d/CCMesh.h b/cocos/3d/CCMesh.h index d46c0c790a..5080d74f48 100644 --- a/cocos/3d/CCMesh.h +++ b/cocos/3d/CCMesh.h @@ -30,6 +30,7 @@ #include "3d/CCBundle3DData.h" #include "3d/CCAABB.h" +#include "3d/3dExport.h" #include "base/CCRef.h" #include "base/ccTypes.h" @@ -37,7 +38,6 @@ #include "renderer/CCGLProgram.h" #include "renderer/CCGLProgramState.h" #include "renderer/CCMeshCommand.h" -#include "3d/3dExport.h" NS_CC_BEGIN @@ -45,7 +45,7 @@ class Texture2D; class MeshSkin; class MeshIndexData; /** - * SubMeshState: visibility and apperence of submesh + * Mesh: contains ref to index buffer, GLProgramState, texture, skin, blend function, aabb and so on */ class CC_3D_DLL Mesh : public Ref { @@ -105,6 +105,9 @@ public: GLenum getIndexFormat() const; /**get index buffer*/ GLuint getIndexBuffer() const; + + /**get AABB*/ + const AABB& getAABB() const { return _aabb; } CC_CONSTRUCTOR_ACCESS: @@ -123,9 +126,7 @@ CC_CONSTRUCTOR_ACCESS: void setMeshIndexData(MeshIndexData* indexdata); /**name setter*/ void setName(const std::string& name) { _name = name; } - - const AABB& getAABB() const { return _aabb; } - + void calcuateAABB(); void bindMeshCommand(); diff --git a/cocos/3d/CCMeshVertexIndexData.h b/cocos/3d/CCMeshVertexIndexData.h index d60a246c4f..677ec709cb 100644 --- a/cocos/3d/CCMeshVertexIndexData.h +++ b/cocos/3d/CCMeshVertexIndexData.h @@ -65,6 +65,7 @@ public: void setId(const std::string& id) { _id = id; } const std::string& getId() const { return _id; } + /**primitive type setter & getter*/ GLenum getPrimitiveType() const { return _primitiveType; } void setPrimitiveType(GLenum primitive) { _primitiveType = primitive; } @@ -119,7 +120,7 @@ protected: VertexData* _vertexData; //mesh vertex data VertexBuffer* _vertexBuffer; // vertex buffer Vector _indexs; //index data - std::vector _attribs; + std::vector _attribs; //vertex attributes int _vertexCount; //vertex count }; From 1938817187852c2fec9ebcebb803d717f9191028 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 14:24:40 +0800 Subject: [PATCH 61/67] reset girl name --- tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 7b4f069aaa..714758c1bc 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -263,7 +263,7 @@ void Camera3DTestDemo::onEnter() addChild(layer3D,0); _layer3D=layer3D; _curState=State_None; - addNewSpriteWithCoords( Vec3(0,0,0),"Sprite3DTest/Girl(1).c3t",true,0.2,true); + addNewSpriteWithCoords( Vec3(0,0,0),"Sprite3DTest/girl.c3b",true,0.2,true); TTFConfig ttfConfig("fonts/arial.ttf", 20); auto label1 = Label::createWithTTF(ttfConfig,"zoom out"); auto menuItem1 = MenuItemLabel::create(label1, CC_CALLBACK_1(Camera3DTestDemo::scaleCameraCallback,this,1)); From 70661b0ff45ac1b1888e736cc4fd9749e93d7f00 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 14:25:00 +0800 Subject: [PATCH 62/67] lua bind --- tools/tolua/cocos2dx_3d.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/tolua/cocos2dx_3d.ini b/tools/tolua/cocos2dx_3d.ini index db2a91cf3f..a043f994f9 100644 --- a/tools/tolua/cocos2dx_3d.ini +++ b/tools/tolua/cocos2dx_3d.ini @@ -26,7 +26,7 @@ headers = %(cocosdir)s/cocos/3d/cocos3d.h # what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in "^$", like this: "^Menu*$". -classes = .*3D$ Mesh SubMeshState AttachNode +classes = .*3D$ Mesh AttachNode # what should we skip? in the format ClassName::[function function] # ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also @@ -35,9 +35,9 @@ classes = .*3D$ Mesh SubMeshState AttachNode # will apply to all class names. This is a convenience wildcard to be able to skip similar named # functions from all classes. -skip = Mesh::[create getOriginAABB], - SubMeshState::[getSkin setSkin create], - Sprite3D::[getSkin getSubMeshState getAABB], +skip = Mesh::[create getAABB], + Sprite3D::[getSkin getAABB], + Skeleton3D::[create], Animation3D::[getBoneCurveByName], Animation3DCache::[*], Sprite3DMaterialCache::[*], From c7c091e4b667e18e50a9dc3b1982056616239c75 Mon Sep 17 00:00:00 2001 From: liuliang Date: Fri, 22 Aug 2014 14:32:27 +0800 Subject: [PATCH 63/67] Modify project file --- cocos/3d/proj.win32/libcocos3d.vcxproj | 6 ++---- cocos/3d/proj.win32/libcocos3d.vcxproj.filters | 14 ++++---------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/cocos/3d/proj.win32/libcocos3d.vcxproj b/cocos/3d/proj.win32/libcocos3d.vcxproj index 25fe3874e2..b4597e95f9 100644 --- a/cocos/3d/proj.win32/libcocos3d.vcxproj +++ b/cocos/3d/proj.win32/libcocos3d.vcxproj @@ -24,14 +24,13 @@ + - - @@ -45,14 +44,13 @@ + - - diff --git a/cocos/3d/proj.win32/libcocos3d.vcxproj.filters b/cocos/3d/proj.win32/libcocos3d.vcxproj.filters index 21f2af6ec5..efcac73276 100644 --- a/cocos/3d/proj.win32/libcocos3d.vcxproj.filters +++ b/cocos/3d/proj.win32/libcocos3d.vcxproj.filters @@ -48,10 +48,7 @@ 3d - - 3d - - + 3d @@ -104,17 +101,14 @@ 3d - - 3d - - - 3d - 3d 3d + + 3d + \ No newline at end of file From 39cc03173b14b186b63f53523afbcfe979ac49d8 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 14:43:48 +0800 Subject: [PATCH 64/67] remove unused variable --- cocos/3d/CCSprite3D.cpp | 3 --- cocos/3d/CCSprite3D.h | 2 -- 2 files changed, 5 deletions(-) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 9e299aad30..5de394fac0 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -161,7 +161,6 @@ Sprite3D::Sprite3D() Sprite3D::~Sprite3D() { - _glProgramStates.clear(); _meshes.clear(); _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); @@ -171,7 +170,6 @@ Sprite3D::~Sprite3D() bool Sprite3D::initWithFile(const std::string &path) { _meshes.clear(); - _glProgramStates.clear(); _meshVertexDatas.clear(); CC_SAFE_RELEASE_NULL(_skeleton); removeAllAttachNode(); @@ -323,7 +321,6 @@ void Sprite3D::genGLProgramState() offset += meshattribute.attribSizeBytes; } - _glProgramStates.pushBack(programstate); glProgramestates[mesh] = programstate; } diff --git a/cocos/3d/CCSprite3D.h b/cocos/3d/CCSprite3D.h index 1c2b77e90b..ad3679d975 100644 --- a/cocos/3d/CCSprite3D.h +++ b/cocos/3d/CCSprite3D.h @@ -161,9 +161,7 @@ protected: BlendFunc _blend; - //since 3.3 Vector _meshes; - Vector _glProgramStates; mutable AABB _aabb; // cache current aabb mutable Mat4 _nodeToWorldTransform; // cache the matrix From a102946d359f9c3421ffebb5b4810d4f1be27027 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 14:54:26 +0800 Subject: [PATCH 65/67] android and linux --- cocos/3d/Android.mk | 3 +-- cocos/3d/CMakeLists.txt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cocos/3d/Android.mk b/cocos/3d/Android.mk index cf05d12d7b..ff4ffa8101 100644 --- a/cocos/3d/Android.mk +++ b/cocos/3d/Android.mk @@ -16,12 +16,11 @@ CCBundle3D.cpp \ CCBundleReader.cpp \ CCMesh.cpp \ CCMeshSkin.cpp \ +CCMeshVertexIndexData.cpp \ CCSprite3DMaterial.cpp \ CCObjLoader.cpp \ CCSkeleton3D.cpp \ CCSprite3D.cpp \ -CCSubMesh.cpp \ -CCSubMeshState.cpp \ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.. diff --git a/cocos/3d/CMakeLists.txt b/cocos/3d/CMakeLists.txt index 28e0ac6970..70e3560efd 100644 --- a/cocos/3d/CMakeLists.txt +++ b/cocos/3d/CMakeLists.txt @@ -9,12 +9,11 @@ CCBundle3D.cpp CCBundleReader.cpp CCMesh.cpp CCMeshSkin.cpp +CCMeshVertexIndexData.cpp CCSprite3DMaterial.cpp CCObjLoader.cpp CCSkeleton3D.cpp CCSprite3D.cpp -CCSubMesh.cpp -CCSubMeshState.cpp ) From 6ff2aa2755e360aae7a12f8d0cb028de79dbd7b0 Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 15:00:34 +0800 Subject: [PATCH 66/67] change skin joint count to 40 --- cocos/renderer/ccShader_3D_PositionTex.vert | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cocos/renderer/ccShader_3D_PositionTex.vert b/cocos/renderer/ccShader_3D_PositionTex.vert index 92a359922b..0d996faaef 100644 --- a/cocos/renderer/ccShader_3D_PositionTex.vert +++ b/cocos/renderer/ccShader_3D_PositionTex.vert @@ -22,7 +22,7 @@ attribute vec4 a_blendIndex; attribute vec2 a_texCoord; -const int SKINNING_JOINT_COUNT = 60; +const int SKINNING_JOINT_COUNT = 40; // Uniforms uniform vec4 u_matrixPalette[SKINNING_JOINT_COUNT * 3]; From 1db3d14896af50d063a9b87570c068705954cabe Mon Sep 17 00:00:00 2001 From: yangxiao Date: Fri, 22 Aug 2014 16:06:36 +0800 Subject: [PATCH 67/67] reset bone number to 60, put test in alphabetical order --- cocos/renderer/ccShader_3D_PositionTex.vert | 2 +- tests/cpp-tests/Classes/controller.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos/renderer/ccShader_3D_PositionTex.vert b/cocos/renderer/ccShader_3D_PositionTex.vert index 0d996faaef..92a359922b 100644 --- a/cocos/renderer/ccShader_3D_PositionTex.vert +++ b/cocos/renderer/ccShader_3D_PositionTex.vert @@ -22,7 +22,7 @@ attribute vec4 a_blendIndex; attribute vec2 a_texCoord; -const int SKINNING_JOINT_COUNT = 40; +const int SKINNING_JOINT_COUNT = 60; // Uniforms uniform vec4 u_matrixPalette[SKINNING_JOINT_COUNT * 3]; diff --git a/tests/cpp-tests/Classes/controller.cpp b/tests/cpp-tests/Classes/controller.cpp index 5d7c834f06..528dedaa6f 100644 --- a/tests/cpp-tests/Classes/controller.cpp +++ b/tests/cpp-tests/Classes/controller.cpp @@ -60,6 +60,7 @@ Controller g_aTestNames[] = { { "FileUtils", []() { return new FileUtilsTestScene(); } }, { "Fonts", []() { return new FontTestScene(); } }, { "Interval", [](){return new IntervalTestScene(); } }, + { "Node: Camera 3D Test", [](){ return new Camera3DTestScene(); }}, { "Node: Clipping", []() { return new ClippingNodeTestScene(); } }, { "Node: Draw", [](){return new DrawPrimitivesTestScene();} }, { "Node: Label - New API", [](){return new AtlasTestSceneNew(); } }, @@ -76,7 +77,6 @@ Controller g_aTestNames[] = { { "Node: Spine", []() { return new SpineTestScene(); } }, { "Node: Sprite", [](){return new SpriteTestScene(); } }, { "Node: Sprite3D", [](){ return new Sprite3DTestScene(); }}, - { "Node: Camera 3D Test", [](){ return new Camera3DTestScene(); }}, { "Node: TileMap", [](){return new TileMapTestScene(); } }, #if CC_TARGET_PLATFORM != CC_PLATFORM_WP8 { "Node: FastTileMap", [](){return new TileMapTestSceneNew(); } },

b#GZoR9RLTL*kgS-duEIN5BkI?G|#h} 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 z zxQCzceq9`J{p;&lc>hc5Eh1Dvv{oqublv7d&%i1NzCLWjF0Dz?+z4N0wU}wm)Mq8- zm}jh)8Vk-x{2%!K-fu)exq>lrVG4??3dp|#^%MN*mp(=bE!I~#)ZEj2vv)(6;izk! zT)~E}{(DoGtdk(s$&O`eIJYNkz7hU=qX~mBN_i-MJ5*|3bm z?|{QUy&YH-tn5SB9y+@`Y%vEzn1cg8PCtOKy$E}d+IEZD1}ujN9BLAWo5UB=qJf0% zro%FhIj|ofE$UC$A9Wmn;UkpnzIO73v|>RK6AQTzu!u4HmpOnp zI6Uj(h#TZW@PnQMeBff&88;No1mCVY|FT`2!B>}OU+~rY3>7 z_QUI+9kGD4=xcEU9=zd)OlRCsG!uN0I|s7m8SH{XJtqgqkYKl;u5IiG_yTs_+B^FN z$&k=5`s@4)3=aGb{IJu>0Wu_T7^uT?+nDcrY8(17WJrixZygpq84tcSoP1F<6Fx)! za*WwukoSOZ4&sYG1Q}BHxB-jn!#3=4oPdF>F=h_ni@tfSo&Vljghe6Duh|7&2wwjZ{j@*G{3HO#xI=gxf@WTP8 z&mdXKZZ~_}YC3&}qL~~wZX2+SM^2(`H;FGKOK6+^9>D&>8Ga~Eb`fJpma^MrzQCew zUC6({Lb8+{i@b61uM@ih9~jQYA-mmw$q$GH3T*zbKF@slJ`Z^l#uAfL;<1`zjBB&sRJ-Kgn}oeQI7I4AcJ(>Qe1S)vU2x_Zig9L-8|Mzrz#`8q zWEaIa`ToWn^jK~iI6#h-{XWEe(Kooi!4HsQ!DoGSeTcEl_Y&QQzyWeBeT?-!!|$ke ziElLc{yzAt{)J6okq;RAV0T6OFf|_r>-r}5AI6>~4(RicdHt_g0IQB?&OC$63;rFT zv&-WH&fr^u<|Xh0628AN7JLymjFaF1 zITmsU_cx9)Fw6mVFVdXrCSf1_HC40ASiN2FJxh58|DxC_IOy-2jD>Ar-wtxb?bzyB zTK;C|i{F8NA35!!FlzSkfw|%gzGIyEi^8bfFW4@(4YA;SK-(ZSgI&xY_+AJs-v__} z`4CN56h^fjAETTv-B)?k!qa^FN4)CGn$yC+?#_IGEUjXxamu!Kp^DqPs^)8(9M40* z;{b<8WH*)U&NeQQev>9DGk5e*I(<{sykvMIH4nfQZ3`ysC+E0>!l=dDL@3uQbXE>e zt77&^Y^=@Wu)za%n>ab3Fsi$6l(N2O8>K|A%4T_DQ}x=oKKzSV@H`5IQCF>;qU1c+ zMCos@U=CT+T(t|E!0U4zGP)_RrYPqmvvO-{S+luJE0rhsa@*3JZG(*NWL%WuKf0cB zHldWc+^04w2JOND4v29m`Ju(BHPX}M$;#e@I?C0t#msXGbWmRh^E@1F^P(8TXOP^j z`EP_WZ&y9VH?^SoL5EIin_!dsTO;y=g|Lv^T^{+P^3A>mO6{<`=AoCmXnp`+y&r0< zSucIRC0NN=++Hc2=w`l?(L=Qhe}M-$z-KqeE()Xm@wSB0=-)xg#7!@x9{KvHZGuhq z1F)EvK+4ytVM@y0GgFk+<*rE+CuJ2F(#PT^*+pU0MQw_t9FAD5cuYAWrHmb_+Qap6 zfG_4H(S(KU&!bg*{T0vFD+@2gNy34jwS0hG@NFIJzc+)hkp2DY{#(!i{{*F4z2Br2 zb!p?6lPmMR*v`QhvcHBuJqs!sxK}Z!&5&-a9;3Alztf5ARwWLI1!RBWmJ+7$h6fc} zk8x7ILgO?n>;fBY_TL*xSjhgKc~&#s?VP5x+B!&j`Cy#3>6PuCi*#^+?5}xk(X>9t zpUQ^~J*8da9UoYPP4+`~;&6cMLiYFUzq%&3*kj7snw_O*=f|sl;P%01vnVHlh3v0K zBgy1H`na-kZF?!X-~`pbz~TTlgE$~}P#E>Q>1I>Una7pzgwD+k!cI|bwp z3Zr(3t7H13>7U9`?~YQgoUT~#O`x`cFAAd$sb(~73I0QA6V*xT`0sdaECYwugnjC4 z+tE`glAK30#fKbK^34d5_Mdh541FHhj!q7+i^8aJK7OX}4x}m97IcxK{}`{u7(N3Q z9B|)+OfgpUGbL_JQ%aTTB88oDa6sH(7kt41SjZHoih{}iSejDjVP|Ri^(?!jb>@3~Bmz8InJCCVth%sb} zzYG*imCvLpSGISSHr~q0UtkgA;td>jAyf4D>}M)^FimOU6(Wti`lTN(njLl_Q;b{V zXXkq%L=bK7tR-*@B(aDYs4d?!Cs-`F%|(X$XK@^qG6=CHwO7ll#Ze(z^` zN^zT9tc$dt;)Zy^CdUnZ6Lud{v8{&PeNC37X-X4{u`g}Z)N_D;(KmsGr19hF+NN%U z(vZto&Bx%_3@N|GO<2#dm~ z`7(-|9&A6XY+$let`V( z_Y8xnN0&p&$?;vKl-mvtz`=LmTa4Ofeuo)+{`zEI8g(s!qAi?E)6L^Vt~- z6h^IG@_bO#p#w^n%H5<|&Rl0au(4zpu|Q$e(T$X#?T=HH>EpXeM;|-*0t>rnTVe7U z#z{yeD?Qv8v@B1ma{hcb>BZA5KL8Kx1&SN|0IB4qBeR1Zd+b;K6uL{}pJ(|O_hVo& zH$vMWl^ndUZ_s$tKE-Q(cd5^dET6$H_|7A{Q^+o)lD+%;1dVT}C`TT5mtu5S_zn5M zV>P6b(Y4>zZ$2bNDbuWn)Pk_wE^ZsfYK%LON?KzV*IzniuOhD}td1|Ruxqe5dU^&K+N`^Iy-c$bKZsktXp3(`Ye_@m7CB4bNhy|pQ zgVHQ}r{v$Q*q8Q{`cvGPFV64-&(9#0+_x@$@BJT=mEKo+O6j_>kMoS@8jwl`ZYq$n zV#h9Je3@QS<-6mxagY4~EMg3)WW*8gl#|7GDSveAB@Ot;5o6%Mp{c^lDM!7Nl##K$q(A=7$}?b*5AB`)g{-oA?1+?I z*X_#QBfX@;)Zc&s2YuV%Gsr4eeV&+dH_omMy4Xwlc*Qk$)VNXGkdr8kT4YN^%G=-V z%GSSoNh=A9aRhN-zVHL`0fkW?O`Dif$ZA(sUg#y|rSX@qpPfSycY`^%GCXC~eY^7W z!Cq1W9bdhF!57lbV-I_zY?qQ0pAEgFs&s$D_1QN3fM;HeJCJrZO>dCWa95HNGNzZb zhQ<>1gT~kSjH60BS64~t&}^47+1yL&N@EFZ;$Un^Cl=DqIg>u^eeracGR4qKs^`3C z0ShjO@kH_i_$X@>|P&hvQlVQPpQ_!tQZ5Y=47y=A43M(cYOK1iz9a{L&JJX zXC67Q%o%OF@5~3tK;KG5>#gXyM_E$5r&Pf?mM~w~{l2~b-Uc*2Kn6Pdj01 z(q_V<{fIBO?E=kz5evvb+fV8fwCDSM%BY3irT&BkjVnpXf~t8OQ0n%j zah=8z&K>-Yetdwu^n2m&p!o$3Dnahur0Ntm*yDq-;ETejad%z^?fv(l^6i$c(l#0& zm@Dwyhaw3JDQc;Ia+~rVIHb&N-Bn6<&SBUOY!_`qVblY2ikiw=4lC6@b&+;cpNCy= z#ew^qyEAtnMeSd;oatz-Bg#k{%{AzL%v_m6EcFYFQIMiu-|u0XbL5Ef@|P~s4Vv%p z^?}uMfE2Y-VolTf25HLQL0zQjXI!z|Ht>ZMbzcQPQ`rq^%CO>Hq+>MS;duu5G8R5l zrKpwwllSv9<>ZSHDg0zsuA_~Ng~uXOAk83qqtH)3VwIKY(wBGZv7z{@Jsk zX~(^z%KPad((WT!b9->m_X|i|SLbSE8u0R{aw{rC>P%SJ15UF`ZG(RyaedRSk!kwd zqsr#U5UGX}%lQNUcBTH7Nmvv{&DW@rY1^BlN*+syBsj5p|DtcgzbK44;Xy-F@8?IA z!&5?}frQQOvnyr?7Sh?gEgPEp-aV?!rstuV3V<&50K=J?igh1HtDFc${r&5Q=Tyg#^!MP z43b>=Y(3L~(4$J_10m8k$6S4e{`Qvq01lAke%q+7=}F_GO6`*&(gVU`ZUmb+xL+W~ zkmOc6@V%*I&7;bnmqMfz>KB|3%mH!391)V-vn>NnC5jwXa^0ambi$P{?8?0z93aU( zc0It9_9jhv@iatgMSYX64_~M`NwGjaK$2@(?Qd#K&yd^Rg-CCm{TO&)Vb_bW-~dVP zi*V62^hBB>x^pBunEq#aUbHi@x2=o zVsN;k^Q@=11U&xKOl3n<0hmHeq8V8!gAkQE-ZkbryG$-w_ z5;r|m>fh0|zkvhRrQu%`QEhguis|}_{mQ9M6Q#a?k98T(FgJppAegX_CU>e*+?40X zUCPy`3#G*7qt%>bAFKJ`v*k|lt$e5!IYlC*oTdEXZdQIwHcc9vSj-5UqAY(q$C?u$zG*dZr z=0B->%}|Yl-Y)zA8FSqy_v^QBIZ?^^DyR9mf7S;F;9tD2F79j_il~+-a;V$5G8}|9S>@@(6GRR!-oO>dlQH+ zq}0p%^MKclRSdYIZz2}oI5jyaqB>-LJ0)MvUdpyT9_Ex=ji5wX@s)BV;^O7X-~6xVMEnd{Ei8B zkqRP@BzEf`XC>UuW4ZZ|E)E{54?sAnK;%K^=r56 zTYW5|$u4B#yspRVZ+v~U53wjo&p3#2P>#lCtj9u=!`SS06X+QSd<&#E{wiPi7WUOX zPh(UvVXv-fqWUbmU2tW-wSpa3NY%5i`!fz_*q!R+fMT*kviTRe037ETG%kM-2Na0q zwK{GaxUy};;+y^sKO_%ssoI6MgRzWb4#*w&Y-V69^N+*<8iDNVg|H91m}|ffU30Y7 ze5S{OE9?TxbFS*?4lHs;|^OWm|1tj~(GyS?L=NW#7a|d|_$v)zy z&mCZJFbAy9BiB*<7X5;C70`A7!+7{%2k}MRP^9*28Uf%rf3YqN4k%KKwt+8e>o{hx zt@@1e3|MR%;I?t@FqZkUT@U2q0UR>PF8qrkwcLl8?-y}%#sWoZ5sR>|^da~R9H8I1Np?}B7Fhkd zKd#SyLq1%mxWT_C1AD8nKt3=B*n=N%R&&SVz+#&NujO+rfZ=BhV85k41iL6Ei&*G2 z7~lXr#uWGg@7mypiRt}Sz9G7{u^(`T-RjP`Ve0~N2X>i5_O|79`V3nah7603 zSo8~h+n5J9K>q+NwnSv-!13k&hMYv(P#~6bl4Fc(bFQoXjphWfi!Bkj2SBH*$HF%I z3>swk0b3$qH+$QFgKhAA?-u4a!LW7!WMomdoH&92`87T3oaaeL(Ci>($IOY~az>~@(iwpwJz zX7|Gtr``x#Ex`2LOS^-i2-{W90ck3#`lm_Lv9kqU;y2*t<~w^|FN%)JO7o!PFB|wZ+DBl;QPTltgi4AIRamfdc9k6T4TkKS<*$?{$ z?8{#Yx0aXF{HymF+E%(|L2-m%IX{#yt(Le!SpM%K&A)6DXS8kD;?MRN`^Nz68+exU zk~ROfB$3+&4CB$ZoEJCBg-3dd*f;Ra!GDFpFROoH7k*16ES-^)cI+Ft|H1s z@;NT0g2{*dpvOk5SW65_O=CX-az~-u;Xa?;zhoaii@|<`znZoaH@7J1&vtQb_?G?K zk+zUxT*ZEbt-jO6UG;BjxdSX8;7jdNKTePR2=m2cVMEd-tzUoxYy$7#i$doH1NI{% zSO*JjTjV6K>KjZV6xXLP=Cz=;ri#Xnq6F5 z&jBCKgt`C)N=+CUq6~UI?2wkUyy^2Yk%K zU?`K`TDsS1ob|oOj0Al?Fc0vhu>tqk7?fr$^2dC!^YTEAFLPy|1=BWj)h_KDIJRS@ z@aKQ7V;?xr4fwS3t-CENNhQ=gO=+Y3)l@+{eV2P7@_ZP*{zA-R%MRX=ecb-M-w(PD4fcK z#ZuY65tx&KE5<){e#ThXRXM2nYcWFKKd6LzTtgcWf{8P}mg9WhF1 zqs0yO^geq>AF@X&0qFZzHu_fRQ|;?>#PwvCup-L)K;PeK_$?t%_vKpdz%C!~1GbrC z8#HwIZQaHTjfO3D=@*Pe+nn>L80hee8W&n$cNpVhmwk-3seEZWHgxzcj*k}Z=KtBn zuD)%!K7tG#{*&O%*30caYj)vZ_A%^Y3pC1?LWe&p@=(H&#ku@>EMcxVgD*Z>i;~;W z;csi&P`o^_xjcOQLg}eynAHr{{rnh?w(&L)tWO#ySKq^ zDq+ztseG&*I{csVHxVCn?JUndut;hhHbxt#(ci!q{W6)xYv}O*eB&#(t@&8|Cv&lM zs*b}h#%u7nNmzW0fl9L4p~L@n&Nt%Rp{vE0y_QNPb2^>_m@nFfvS0Xw0Cf0+?-dXq zdan~#%~~c+yWm)}VPAkR-7}5IVd(J7%scB7(lobiT>IrxvE&XW0dhP{QIPsh{R$1VD!$-lL-2Y{*J^Y2q^J^(j{@_)m*cgbx39zKynwUn&V7N7Rs(jGwIXMB9K@+eT$GdcNH*K!?A{yjC8( zX1f@b_N`Q;mbGTgfW5Ay4)9ldU`cMiK8W7ze2c3UVw z<>;Wp|E;V=e9^dw;Ir5u^?vWjN%(>JZmLfAZYs?R9e#YrIN4Tkh1`FcL25!+jv3Cd zTk-lNluoJ+9e&jMF{0Tcmr!_zL7GP#aDCulH3*$5qe zWbSx*>yf2$u?lX|+y7ks0K27{P7J7Q4L3rEKcjS|~2^VsU-8jq%~YPD^5Nk*Rj*@I&te%kgLP*w%f81Nc_j zAsOWk6-4Op0?|Wp^<%d1^NgeY3r+9 zS}49<(Ou)qKHz*vc^zyV)YvTv+WOXiU6bv%i`c%_HgH&duDwVfh*QfDZ*^}VZhY$Q zuWy^4L(R`06W3lZ;16y6$Wm=>S8Aq)h$wv zh|O)~oMaqh@4Rud0uV$HZ*{%jZV();&%g&4KeG_>_OTdk8ljz1CgKI4Aj z;DF~sOANI2ixliA?#pg8D;)XUc9zG)<&|KLP18x1%tHrG5g5yPft}`BXsdTB4%EpV()<6E$=wE7a zf~b$No-dUG6)-n}wmy;K5Zl;IpyR9K194E_K|?P;CU-6?l|^;2%l^f@gvyi~ac_YJ zKB9AOTl(XA8kVomexMI7tM?1&+UIQOCI4Jyfs4-=?}&xtSsJ?b zsYoNV>RV6pEN%J!+6-GpA*3W+V4WC*TqNjU75#8?ib9VMuVtC ze0Uk!@8LDR6JLgmko9e2JnUK`A_HQ7$)snSLkfpq4kz`?tF|yH2=` zbBAqm+lD?h*z*kiON93O`+cVqety%~#`&wa3qSNWWdvM1Z%%^to5nND9ju&Z><6~% z^g|4^-_h45ii4KE_Tw0HKC&O?jfk_a z3r>QTdf}!8;+k3mG!DS>0S+Ii6!N(niWOSwSs(X{tya%)nV;#g#ZNyFx{flarI7P| zo+sB?*3!mv0`O!k_|o;s4;CY|)ZeaKDEC|*^3{7lDq$xlObl4oGB^h&4IShY5$M0?|_Tq`odknF7{r74O9@=fdvcPK~0Rk*Ju(fQS7}d zEZD(VJG#ENyAtI&GU=-TZ9VdN(At> zIbz|nrgbvNzZwlR&)t_#*6QOa+VF!FZiuXq*`Ue`CSv( zY@@SY9(Lz9pMjE$UeG*`{(YaYWA+Lu?o2$(T|8NR76jj6ZA4|h6`w)#{O8QmQf={q zbl~D%7N0y`;lO>oO5vcC)b)bq`I2^okn_^4z0|{3}%#V$0@6)tZO zG7>LHi*8?Hcis$F$0zPHD&H^AHa-$G&nq8p7hEq)N^QUW9=q>4%!z}|599^CQs%ks z$br(;nqESwV-IOdnV+1n;R;`k2G6#kdET+^fx)%waG_t9Om^=pdmRh3&xYNDXWP&` zw@;6kI!70iq9X3F^08J9d`yFX5eNK%=Gkk{0jWo~B*WT+zp<%ZhbtU-pSNQ5yTex{ zq(JlBJS|4rvMDclN8~v+@c9TQzBa5Uy_X1t<~et~*05~vij?7T$64;$QR+AXzK$HA zd0rKKLOt8mHO?XWUDZeNXCd z256q+J?aWB#kLu0Hrv5g?3|!t!6C!J570bcY&SGzY3v-K@UQDxY2QieT!EZOAZ(## zF1p_I%p98Mr2MyrH&bgGu2o&h%IoaUQ-MX>Xq{?=P5_$c{|_w+MMA#^I%aKT1w)~q zU7eoWgDVbj7*#~CY>o^aGkuIDbar?*gIwhKYi*mdwl_j=oYkhhbhJh-^*t}J@E32J zk_?)RH0X`L8@5^K8a~kJ{hMPx&>G5kV!6fu4e`x@L?Lr`;m_W;fG_-DwW~KmL%g@w zW#RPhIElZ93FH19r z|DwJh!nL^{U{|B>;H}-$oNw}MG=QIDpw!)X*>&+^fmkPac=HRP_ zo4wjP`2o)c!54ED-h1sF*-9x9UfN@r|FoRfYAj&SkuO~z<76Q8#&a$=(O$i=Rn-FytlZ9-I6wp%2V}Gum|6Ay9n`5 z!7fHD-8cL0J{cajE`lPYMxXi9%-;WcNHxd*ti}yIxsPF&-dSqH>bx=C951b4!=?C(j4Tk z*Xy8p{%F&e@cec3Lx#;~c%y<|Wgq2-fgHFx;+!8?=eLIW4?mzxHCw9w}-Y1wzts?QubL=zV8SJUZv@jka9 z;^~%Wr88xRIlUX_If=HBeIp&ap{1T0bHMQEQEgTGwBntdD}R)Cuw0?w9GU@AMK{;CwQmFsCkC=1BWAw zI6w%A1a7lCPo_fR@tnBmimwMBty&xdn~vgaE9G!Yi0zl zaC6Z?OTA@4V=3U~e$_5~g?8ZxC+vXW>=cjUZaQeGM?PzkGNR}_r&#c~;hvYa^$h%F zFf&3+9Tw4AYHRGO+T}KJP9Q8j&(+?Hm>vi%wbr~&JNngC)ek%lIAac|IckKk$&wd{ zvh}$o7fanPey{r1(GTD|bfs*py3GmQp#OZNTFIhw!=i20Wug+4?2r z-bxYEN=e+mxHccp^n}fWcuKTqs zC$&#|qxy{FaLypRl(f1lYc$3SmuHD9C$-Vu316&Y!2z~$24BMI64vUCDDCbyKX^8fIUu+=o; z&?f8FqWX?4@rbKR9#EbN?17S*6q(vdw5jWz4%SVN&;qc-IgGH4=t&^q_duOYc8b!0 z4VTqTZn$l$UHxug$!-YU2^p~A8$F5ttN=gk(vv`C6JsculeR}|EB+NNJUwaOcnNlu zEC63B)=wLV>Y!x4+i$kPt6hxGU$%|pz!QhUgRpcxEoL56cc=eGisCSAkO9tWrU7p3-}v zvO2INFsIEiG`KrevPAujl>?sW>!4(&4R(FcuFcc7?Aut$2Ibl|`>;!!L}~Xw%1?um zIjQ$-gU8;6enskUP_VGceSx;o8-=uCSvi5I!cPC4Htbe7D16a2)wY!b;)V^dL(3iB zd!QLzKPw#XPg7<-hD6XNC~P%74}=l->0mP#l~nk6hB)Y*!%#yF2`eFHw{YW z3=bEr?$i$7>JFP&aR0*Yn~(Z5D7v9!e!k#+3cW!$czj_KZrBYQ{V8zCVK*bx$pbIM z@9)uUH}l{&l`~;I<2?-Ylw5-1cvZVx|8^9& z%wC(-4atB5XKt6C&}gd${~H>g*R_d${snK^z=iVIIe)>IHl0hN&1;gNIHuV9Q(Q5Y zDESLK;>$T8Z}10-<7a=1hH>lk!oBe`Kl1}P&Cl0U; zY>79;4L6Rz4}{`4k2V?8XfD%{q4whf9B36nZ@WlEyeNH+KW)sOOq+Ckk;B}^Ep@c< zs00-;{Ra7ke01WV#F;qIf2R#?G`jMes$s+V6c+`oi_+Cc|p@cs{q zAEdIqYdOUNzk`4GeUJnFX^et0xYoq^DWN&DgzFSP{C~Aw^mh$m*LBhaQaqBO45n)k z&sQ||;%twbokIq3uquPcj*iuI`e_*or)@pr_S zs4C+QRJj`CQXgy#Pn*s=wGCMKj8tCWkOWmOJykb&eDx-|)w_VtIMg95sl4bZXDtb; zT&u6JNuDwfIB|e~$v(Y_(d(efbzh<}l&zWOJF38(1^n%-k+?snX;5O{?L@udxe6)aS_x%mgzR0p-U5Bp~|Ie5hjf0!mu^Ub;&M2+x(z#fGYQB=qB%0 zZ@2hv8)w~A71!rj4e^c0m`vO>8Ypdx)vxYL{n#&lmz@K!-~qezbxIn()`8NNzJf8( zAq93Q?x)(bwJ(gY^mU3c?9O99RL6F+6iEtw7vM*mD5|mGJYbhL(*xf-)%H+d&}g9GeO+m` zVd>mFsV2>xoG)-Vz_*CJ5q{VM1#jO%?GMm(utB=Qf#Y#Tt{+Lr4TN1Nc)RY4G}I`w z!B-5a`Ptl}A?)CidSJbv;3XBf;rgL`=~)H)hP+C<$S(Y#-;xLH9w>Nk9GsUF+@W~N zt@_ptop|0TTnLM~5FDViZM@&2o!oaxecIeeZ5!tdyW+k%ft_jNBPeaV_IA-ur~FNK z*bJ9r!S|ajk$Cf|sAsRdy<>=tXyV&E#y*xf#*O0ZOY^aSD%Mxly)$5=KEJ{_%9zS+ zD(xe?;7V$p15nQnO4dtNXcMe%r#>iH?gN~`7tnGvmOwpQDE}}2+O&C?bpP{>pTU=| zv-?QGY#o%VOV>2<{j&pY7<+EHvPl!?fHUk;u1hr68=zeMWU1lTa+!;em1f^)(y?v( zPv+~O>V|T))o(MUL4HrQX_KpIVT<#{-|LcHQmzJ2Ur>~*2`+l+{;zq4Zw@U{a+0s( zfUQbcC{*tEn{9-0l{S->)+|d++GVzHsK@P>B`g#wEn{MgP@{HzyCrF9QltPM1LJt0 zZMS~gq0R75_k$Xhz8n%fT1E>c$j6R22QH z{HFMh>{5um7XGW(L5&);b!gJ`lCz{~!>#=S9Qa|4vBv9gi(DgAqeK75H{8Da*k@Np zj>>_@1AZt!pOm%{O$<9&=+*A%654-i_6QE*~pxDGZd3L4n z4&3^kLC6B#({bo9B!tLmXvE@FbEqgRe2NmYmTOx)2 z8IzO8g<8j7o{x%cvb$>G&xVA6?FOhYJJTGLc#<|{@BTp<*9*oicue`iQ6HsK}ePs^dToGf$4SCiiCC>;ICfS#k z9Q!0S9&ESk=m)xgOd}OgI;tTH9Tp{5=^7(-Km1h5GZkmc$tk6dNYgG_RhYf2M@yNf zT~bebPgiq?_aShg%`5%si$*_GIR2eBVN4nFQ3(0Ry16&U;fz>dlRmoE9;h(0zwz{Y z8y_Q-bNi_DW1b7(0=xLC65}=0l3N3|`x>h4NxHV<^R{6;qxF`e5`_P!ab_Cm@_>6PFZ(x_2Mb8QJUQj^Nrjr5=y61C>1+e~v#ZzR;;dCe< zhfR(VBIrnu?@Vhp>sZZm4R(=Zbf2w5wO&KsOo7%A!m0%On%1#xxCel;66(W2$L9zb zO9~I&_Sv{@ceF;2mM=PmQc&<^EC|OMjKrU^u@CP^bDwACbeq-o=1JQ0V}Zd-|6j@CLQX-+S|K$m!;=&Nn`)^g*~O8+3YKRNa*5A8@}tH zD5U36$>ZPeOG*#2&hxxooUbNylOKISEI?6M?R=C_xqkKJ>}Ru_@|R=rW)5*fCD%uC ziZ5+yEsUz`Lic6PYZ!3&_F;A!+6FaWe!f^wqw%1&+57RA;s!Ne-7ZnWOj?s9U7oJ2 zxp>>a8+KcSM(Loegqm;rc2}VR#clMI48^}Z&oR#e>zVjIt@MNjsZjIf=6_Y0@~7UH z?wvGN{~~vSpyu1YRxjWgNcLZLzTklacE6!@_1w#qC8+ss%%36sJU&YD-sZd!E%#Z- zyHqVz4G4mokJ=2s3a*;)2KfKnZ@g`Eef&vBC0C4(`~A~>zO+6AUnrz^uW2Gdp+~ow z$Qk%R@dLMwGx*Y()RKB56nZV**7j|+B~qdde3d@W1bx! zfuEK~g15q#pJA8Q8QNki@{LgFu~*ZQOHbI9Tzw6`WVK@9FW$C>q|A7JV~!40RO$cQ zxLV`J@yc1@3pePEQ1gA*rxC7&Z1U+n_M3SP3QF^cVSB+NfH{Yhz#A zD>lKM>_Sz8uP~vctDTYJTlh`!riP_qxnF&j%Pui=em`z zG6!g&x+A5uHnwB5;8WQ844T`-8GM^|)THB!52)@)EiL5S*x^^lU|**?`ghgE1(Z{$ zY~n{8+M>T9$DH!a!DkptG*HLUDK&3v%iVeT*7?GbgKb;~RD+73!E_({ZMJOa(|ZJ- zxhXM#Z}E5VrF#HH$qcm_{e)t0ndXeHmGS=_4`3Ce^baV=rZt)^wV<4+SIX{R6;Igk zctsJQfzs+F0UJfkmDK_cv@Grhxp!@wasFnsF-{@!TT*eTeWFPyu-{4<*XBpIW zRYEdUOCjmWNhhxVuBA38{f*ni864_{E?8XCx7?nUejLZouuE$lso0xEDLaFD zD7j8HXub+_nlBVQ?9w`e{vL>mil??tGu(KzRVZ83xoz+T?9x4aP_fu1S}2_8ze%*V zp?FyR%kvj!YuogS(iRG*qa9qN{rQnX={BA!Uyg^*D!0zXxb6wX5LMx?LN@EeJ~#rW za8>OpF4I6UG@hQTU*DOh{e|uYfT7>0xdRS(PC-W+ls)xmbMxP~LS}|YMtI+M@uIsxd@*0%(@^JcCq%wJw4PqG#Asgm9bCp z8OI}c>>M;ksC91Ma}o6IU47E4&Z0Kj*UIo6VnK6|Z|5ny45)mVTw9i&R&Wts`&-x5 z+^%EW=$T0%ls#@5{Z8vUVe34kiMcLD)eU#+0BU1Rf?&Z&(D~H*9R?--m z24&A+V_|7>?ZU#d3f7$D9B_tReECT4=+YKmj=*?^Ho*r<+Z?ghoTNFH#xtmZeo6`x zTF%YWe*b=-a^C_h+J!T)xMz8^(nSXq(BEsqgk_I%47v5HJH-NRd_`kl(|4)DfJw{< zWlzk9j|Pg3;o_W5KK%OdEw@YOJ#oiA1wz?VNqDcF6mj6dADw?z#xo~8aiC}3!m`?P z1EK7x{YFFg(s_o-w4UQQoWX(T`rc}L{Gsf5)qRG+qooVo*E)|SO8dyJkLTBttGrPQ zrObdjXMC&ezSNk$3WDDhp8Ra{8Pwk?P|Dn0xK(P{bo(w^x2pc-aSkK92yr2L*MMq< zk!|!e_U0Q#(fuChsh(}vnIEHcP}Th0yoHcP@5Qxa?av&!UCv=>eOCdhnr1u0gdyYu z*0-_h2Oc+#%`QEM)}oqW_22c{UbOZsUw?y&<#xZaVe#H)+2-lu;_%wS;NH`PAlrKp zK9=BYZJXXx+~;OQg~Es@MGc|FK50+ib8+&SVw>zX?ND5p)bdjrls(h_)N3#M2l<4x zbNwvW(YF1heW)M*&VXu$;_7_E`qSCk;kNhlu*dnLZS;;w7h4O@r1T=KiIOTz*yXo% z@GE6q&0~f$?5;VToks6@{mM{GoRvL+WvHLx&(NE+0b!d6vtijP_Bv#u5_;~+gw8o) z!q#dmVN56b@StPJa2qzI02b~^A#4U=QwU2kj*wx5?M`;30$5OsC+smB7E&Exzr+E} z1~!_o@d}6YAqDvY1HRw@zMKQ3IwQz#8;7=WH*&kYZ74d3wiU#}F0dJ7S8wBsLW1Di z{tImb794onAk_iiuM2R1T|5#%+h7;|g;WQ2zj3e&dmQWNUr2Q#2;0fQE^s)wf5UA) zgZu_|+c{vlUCtMNK-^GB@F&6|7CdgSi766T@U__ZLVg3EIr@QL9~|H_O+q!6L3Sa( z8A903WcN$CJq7z4?4f;V8+-;oAjXjOAQoMTFV7v01s*=*93bl%Z1V%h z0)spQ2R&htJKz9W4{`^7;8@t@Ik}av@B^@r^&rORLj}jPf-y!RLGVRRax84(;6CH| z3keYS1Lwf`0*kg`i~T!&l;99k9N3m&{*pl#rQLV~bc zaE#)dk(2Q6Wy1E_)JXAzV~pVgT289t8P9bT9pw4z7>k1b1qaBGzyUEXhy@S$jQbZd zB-kzJU*O;~@I~7YV-y`k+#JVA;CSxv7=r_f4#Mu2<^b5uu-QdE+`1H^#0@^Ue%X5;q4ZOh@ZHp(qkU|0bB|kXE0&Rm7>c9NUa}suet+u(Jf_2Pw-sj;9 z?q6_#Z0bvG0}j052W}U#sgcCD;CulefCFO8vA2Q-D}4yqf^z`y;E-?Q3yBrRKKQI4 zwxAy%g+i`7&V{%(xboadu-UzFdDj1PEXlB8A)6|gXFP5=gD>nNCn1|cEFAp{e>wUr zld#D34!Su?+rBhk@VLP)u#i|`+;Qwfj&>b$2l6K54*D_o8OQRRjI!~CWC?b^wC;n? zV3+4QBuhgt(^&FDg!zwItJoFMdGmDmfzJUbI{3}m^JdRW1I-71Ue9`tpPgH#hP8y?$zZc|M?Rz(O|FFh0wiley4zoRt=@C3RQq0>^V5cG2G; zn`-qu%lvCXUsK^fDvS5m;!&SHcfbL0gI&m`qWZivM^)}-s=K(R*sgC|)h^E+%q_s8 z=wS7cPtAK;&okACtS$cW#JZ6YZyV1Y0F9=a{f!^eKK6Z^4v)wKVW>wBrK#`U0i0FkDUMA?9uE3JJtt}Kdj>uIP4|t zFE$P+Iym6Px8^@r7P8zqv7eRu!TxbG@&Q;LH%PaB%C2P|ccY?Z`1%#>WvDfO;RE=W zW8sH|m-e%~x~}Gs)?Zm7UPQAYttY8`!3A+cETRYtnV07MBa_dM4J^I)jc0cPt%Wdo z+qhk{4KlC0>(86ms798l)rPW(vUA~1jy*;2x0oiq_O>)z`y=aHWQvjxd_G=B z99+o{;0u}8v3Ungrl2O4C*8hh-&UWZ^5uO~W5Yt`^>%c+so3x)mSL-YV3lolxgQ++ zF=So~6Azn;T=TIM9yW*tUb7Ytla2Uk|hFbzobw)CwN!Dh$W+r~K{7T}Ab zgV%FTo947=Y&o-H408>#`;7M?o@bDcEv<9eG|SS^5?W$1Oa9$j5EL9ZHqvGn^0E9M zZkqND_p;o*HG^$hV#VV6!0xxj4SZ2_u=2~hri05pX%Fg1=GoJ^Am~n8?tm|(W@~rf zGu<8SY1v#)&x(XvKVWy{0KS=oh1AS9^sXs8$7-wJcG|5VGI2Cj;X83(=xfTo}D2q zZ1MwbLoBut7815*i|(4f+2(0^RzuIKhS=iFZtiI*GFi{Q4YYIMSZ)_Z2QN*@G~M0Nz_MjPG@DUlk}`(i`g~myWAhp0 zZr=z0X_~U9zQzCd7~1T8qLPakb6}VI0URKAGmrht^sawB%fcIT*~`Nd)wvM1dG5f! zkh}d^`Crq>U+P#Ev|7NfPqbp;FWxV>e<64Kw@Z$x+izc4YBY&um1{Xa6XSkBEFgE= z80cm$ky6W&{{0fx`lx-L=NvTDwgkdL?l#a;%WYO*vPk%xk7Fw%Ot}(cDT)WHP?~v@B?B24v@y3 zGuJRTs#n2M;>sr0!f0P>@VL3!u#m>pkm{Pfs+6^a_-B0Rymrjo>!_Qh{3wYHA2eF+7mj>k7X=Dk%Y0)FPtaJ- zZ%b!y6Gtgn*eu8a^1Puxb}%;?`pNv~;v?+u?2$^Fc-wfMfdk}u*#o+nxBdFoJiC>J zt?V*Vu?H+-%*PTvVIj}k_f;SBoNlkoU9TKtf9$pwF#(>(4R#^VyUGTbCk^?_ocZAd zyHLuC1z*_Ze#j&&T_B8u8X1MBKM{ELNQJ}Ept0CqZzdbSscRb77 z3R#P;z+d3t*xyi~uojCjCyjexZr=Gk+psx8!GHts+z)6Q3KVX;v;UGdk($C((>(V z+JbF^oN&dk(dIEFZkwOCzr;EhjZpIeSZ+6i>_&~qW4$~_nQ#1j+gx${MRq30isk<0 zZ37n4!+D2>o3FRNYyNoaJd0Ukx69*}VQU+thc3cU^S$Hu&3l)gWtWN$SA6E^2R`ng zNMh{Vf#!|=56zPno@Rx2+hf7kv|(g7oH#(HII+wC^YE}g&Hda?u$%py^8tLpA(OD( zbZ+AHbG^)#f1jJ%Wy@?%-H}Q@zz5uCz+xQ*N#o@8oz0DZ%rXmokFv)u&iw-U01gR+ zg`|;Y{<=NBqtji4Rn9A3aJRg9C{Bgvx za%Ptqr7f>=R zo~caTN|wPb7qaFT?O6DMk0oduWR)p5Uz+?ws#-jMiDBPNvagMR<>LdekX3d#a^KX= zr-r3i<(aH=acjYL-Zt*D48o#NW5aJQni}NQvKT6kXVc^DYfo_I;{)ubN0b%^uFo*V zM0!}pg+#EGF7|@$oCEg*3N?P5oMx(Ww64WtNH{waZr{WhSooLESt!(a{mjp%@Wb^j ze@6FXK`Hk2Iyi7F_(Ki0P8j{gItv8y!Tjpiy z7ub~ztvJmTfE`m8ZMGv-qd7=x8;IYHN{>Twd>|>shUn3!^hk0^0v*f`8UqB zrkHVVm+3_rZ_B|K{n)FYKF4ZoxijEWO>y$@L{sAvjV;3hzh`@z+4C2%<9ri{17xck z0+LPR$27M5xi*|Oqp;frXC8}i!a}xsIW*1mzfz4Y{TmEn;dh)jcEkM}k1=Gc3mP3Z zjZbW3iQX`bxh2~BF^>iBn~<%(E^aYRZQaPyq3}qya=H}@9{|hyTPAUUZ1wJ|Urg?| z8d?@j7{mIuwQ}G&$>&(K4YJkk(Wgxp#x=D3vu!;4Sj~RVi&${J8H6o8yso(V(mB&j z_lA~M+a|FyFYV(Qu#R?7uyX02mrRCzUY3E=rm|7Tt@nE1%j1SvfCJ>PGbUa&jql}U z$!_#a*Lk?ONLJ zv(Pr)FJKqa+0-5POugy;P3x&=`~ENYZzx!K&W823VZoEf7<`dCda?_d?Lor!Dqt5e z2A*Rx2#eyDCkWfU02Vmj-*`?!W_y^hJqgP>z$WG)oOzz1ZIIcbZH`#*<(zpR0td)! z3;Ka$!NJjIklCIjy9IrQ>*F^(7O)GM?J2^-51cQ*KH9h4p}(QHrxP?f{G8mYd4?m|w1{Ww~11TU_McT(ygM=*ez^%@2?pmmd*qzQL+mp3M}* zqm2SoENr7~z`|~DP_USwZ(|<&U3trK;-2#W5@>7g@;Nr1uz2$RPh;n3%}u+?kyV!6u0buWuE!mxwqz) z4ZjjI#(tyrHO}{tjRPdl*-PWivkN~l=U1vM=B(-H!~u5q5_T`~h2%MS_eOJ@q-*Bc z4@!zP?<-PI)i(U_tIaNoTZVMsW6pY%VctG6kCnXBUwvN*z8Qq&en4@{(`zL2+_U@4 zhl3umuw{c4oA3em17ZxHK}!AlXOp?ou{GxQ-A=Nn?M5he`Fav|ITljt`++CSuS4dU z4_)2QZq|2Ruk*NNkX;nF+*JCE`KP<%&9#PYWIenlD1L>1dE8(ZSQNMX|9waG=~9?D zhTi%3(fgr|^ltnuX`Wz{+XV;C7jkaAA98$G$FVpg795L0n0Wu@_zsZ!3;uQN7m$7f zTkyRTY@*L|>>+B~zTs_@w&9%`e;>>3^4#GZAm@e-#E}CqJQlE%ZG%J` ze82RL)sX|n9Yvx|SjTsvXdBwa{Tprb10>qu>-c^izCtb(^e-gZJQmy!;EJ~4H}Dz! zi`;=ko4-eQ#DW9QvoOMoK0gn5O+XWVdC1KZ5I|G~}2W}Sy?04(I(=$q(oNi^>KW7ArqZ9K-9V}XU78`w|> z4zS7XazDUlkaKhG0p|-pa3AY!`3t*{bAKrxIMy*1D82~ofnz@KIDoICA0WGiAD|0z zG# zC}g%*ta{oHU7`U34$7wY#Me=)27B-?j~na)i%st_UpUSI zz!jX2(Jvq=2M5P7743&@?lZh6L)#!JFE|guCXX}tA{M|xQjVN-94BEH2cH9E!h*x7 z5s|7N_j&+P%S<<8zkg99T*|h3S zrzdF}_daT9I^9=n+#8?!S+9k&$LS*YcjdEUl$D(NW~lJpxA|I*<<|l>T*2aVTKasF zbnVqQHb`pt%lxD-VZ#Xf>sl(`M4zxj*Ir`NQDM%?WPxLOn_*v1*szCz^vRt@16_O8 zfiy#-f1@Ri1%~q&NZ57V^V7PA3=>d-GQZPMNgAS2vEa$E;E)kgGZ|$dDqKDv^0LrS z$y7dD^#eEnkMoa&_3Qp24V#ZZ1MjwAmz4X*NhiA;55Dy2AAK6C*Fgi{b7>jLZQb`O z7C6Km=WxO%q~#f~VQcA2?x9_ik4in0lAW-Qd{Ho!O1cRsZ5cG(*U+$c3pExzR~=%3 zPxdtBhI@v_{@O&!-qu{;KEt&g?cy^_#Sf&z&s*y+z1bA{MXX4C@tH2lVL*o;Jl$8@ zsCNt1XSg=^nbi-@5lk0q@o-K%3ykypD)x3_*J#*$k%RH z*+4k7zF&yYd5w?Cm-`kx!icXqHZKqb#G!#d)gVY}oZQ&Szp%}Hc5-U8?nLWD(o)xi z(2x>CCEqQ%P8@jqz+po6Y-8`&Q96{i%nvt7?>;1{c6qxvhqBEzMk-+-Kre6FbU-_> z_Yp%g>Tl#bB@ckZZ(w%?m7YP|pqC#gN!sEMWR*ifpW!nU`V>?^8O$X=x=M|6N~(T< zO~4f@dY`JyzbQn*l&%3!YQv`}hMWQ)qdF%}+# zy?HM>5V-@r{GzH`rGbx%s#r(9;e@4TQNPe=pn-3-RwIoUN~;{W&$u5BPMe0ZW*TVV z3+5TOi?h{km@@7_1D_G+qiwz|Oyz(!@dMaLEApsRnO-SD`D#ama6HCE1f5#`&I_Sh*JzRzBmr8!tHgM1rc6%MY5v72j{ie1F)HWxdp>42lvr8o?^+ssF zH@f^_==N!oY8M#pH?)oNF>qCa-Uux<&1tadWcN#ap{1_Weubf8(Z?#5+k}1aEnZh| z>`tX>u-SY6&c24A@*T81Zai;b8yuRRSe0_jBiaZp^^ea24DT;CQ?aneIiqcZOH#kk zru#ul9el5uP&CEQi34nMpS@Y6H_|7Y%Es`)G+p`TQv4PFrPd_|k*x6-)0PR4aA1s z&|N>9FihB!qxnw`s}g8k(k@2X7=Ff&k~Sy)pvnQ)=0_dk;L)m*1iR2(A3PMK{duRK zipBN8na4P6v8+3FFWLy*wRZJDLxbgZpYgWg4F9%s?<#EAU0;Ik`eR2I?e>5R63-pj z<$i-7=Ke;Tgq)93Hk>zJFD(riF+jzFE9U_JHh-Rc(f(iGjn+Y< z{qatB!Q)9)A?8y#F{opAH4dBuN}!#b@^2b6+VL@0h3~?eOWXe`F1Fp%N9}9ChLK&Y z`R*6e7@^TVzC+_5tNsQ!aKKtQj5eM| zDR^kK-)3I(FL9`s;X#K}ta)K)Jqu#-9hHZ{=lM!`&DTezVw$Vc>)@j-`Wvf81va_Q zP#)&fEKNEz+V2;7rS9B(T$=neg7B@L6WkTOsn!6s5f8|2A|;4K3`MQgi$s z*5id$cf$DsyJ1yi;LbG%l#Stc?ARit?W!-)N11F(Q|mh>jtwI$=K1=zjp0i^*eo50 z@)CaieLb7rc#>28!fq}1)dFpbu51i{qU&<4d+G#f%(&I;`#aWmq};9tVHdoLGM?R; zXM{$(tguO2vGpjaYONJ4`8(@7U5o_(!%oz*5O*AfG>T9PaDHWD(P5q44D69+Wf zN4NJBPHqfN9qSXv1`V+54B!W>mB;ySOu>C2G}`m-U6U67>MpUQSmrav-Zo%82)nL( zlo8t_K%*@+-(;xzd!F!1%~-ZB#u*C^C|7~88XE0YX}Ja|;jAX zfX!aDQ=!pLf4EkNs{OO}@t#F2YlSmbPgtxw1I9)LVPkm1Z*R0ipOw-s*}sUjBP{a9 zF?R^Mr&K_U(2z9R3yxgxPOENQ-- z1CIqbXwO>9jJBNgR2%&LDnV`@%Z5aL?gwC3Eo>w}qupS-){r-;SnAVpvFzLwE0*)+ zZKD!F5;WTLUu`rDj?5RPt&e3@$J@0p;DET1**)l+&}ff)f6%|&xUW-tCC0MD1>zP) zSn3zruUl)5WFv!RONrDm(_)!vvNH#fu*k`)Z*z3eX#a1VNlH9XMyT~<5o58= zZHpo-%H&ch2*Do2FBA+P~p!sJZ3)}B(7j2_{VYt<6vlbfdguEuwA9G5lo;ECC zGj7@Ka{p2(Un=1jWrRk1@{IS|^g|KSHP88MRB30uP&nD8^$XqeHcf>_d&|PYLX(X5 z(tvhz*|E-3)m%WHfdlTN3ysayL8G0zD%+6LwyfdTkQmlumEA7KYH001C8vU*(Ox}j zqmXl!NweQYv6T<(dMw9Stmt|y02=L%+us`w?0zrgzM8@IYo{q=KXAMcAs+(YD6m&)WqqrJHIBJGutON2*##<6d2TkY~Sy9c%H z#umMCQl(4@8to^Un{t*q+7lPuF?D0nAKAV;R=eN;Eb?J6(@WjaJBNixqi?U|WXt#J(LDEzxnL4^{4|aL>40X)~9^im&HQ+aB zw4+9UD@?AqR=7E(6ALgGT$%x%QH&&njv2y+D@y(Yi?~ za2&gIipJQSO3FZ^UF~+fw0K|X)Jr9_tbBu6YTUrV>Ialyw{9YzHh-J;#b0v;=|L0L zyR99Ixap~Fw07{X*Ci?l8tv&{?a&slF*o3C2X7WTWR?~ZJa+#^%=+h`)7U{%4tEP ztsP&?_te%_0l8^jta_Z)E^yqxm$uCc)JNtUq0x3vYN(w#*DXNf*N_z@yTI@RZKK~I zcY>hN{);s0JD9UIq(O`U4Tat?iI+l8L*y_NE?ZigBP6I+gwen05V-u~!}4I{g> zC5o0x3nxRPeV^qR-W^Fw`EbOS{m$(E<#w$c^j^?tM?bEpee#!Ez?hx_TTS=#t$xin;65L@)bId{Mzq}O{b%4kEQJ>tM8?Sg?v{TB>u!A2gi z<__$le*(+<1vJ`orpSixJ+p;9i^JH*F?K9C0887q7{CDxW`M=656kw^`hE;0( zc}{x9CuphEo&=5d`XWcS_qgP?t5c1R?4Ntqz6qP$u9bt{3mWY!cfXMyG+!e<_vy|K zEuNuZ9Q{C>ff-N&7#i&^g%+jUyylh~_)}l@Pp}mWn|z$4Eo6MDe4Y*(?XvY-NvUVo zNhyzhU`Os*$1~tKmVQUi6f{B5XdiwlrcCeemg=JYi4Bgnj%TpT*HPpHdiL5-fJQs+ zrN5AHAS89pn31f1eJhsV^M;ep>K~ab=;vNYhDLky!SRNiCc1(e{c75nlYzN2=K^ngyiV^}E1YIe-DxaV3p*e)m;=^22Cp#nCxz z|3K@!=@<*FC23120UGV+&G%?OXkt)ZXHY~!^D8trZ!y$sJ-(bUC_m$H|Ce~#T7uw9$9QLlqW`|62m z(!Kodsn?^IvW}0OwZ8C!vW6-*%?OQl-je!KM)Pv1-yK`ZD&PM6K8yUIlx~Jb`(5>3 z!sHW8QwKa<%Hpp&W6?IOY@pP zMq8|z>Yu*0aB3~{QkF_>D`=NCBA33~tOAKV$Bf_DI8X^c zy$%}fpRPSN{CRApbgI)*cH_C#zkIy|4vqUZ7T#^q>!8v8;k$a$vR36&j~89a-u&y# z0oZ?DRu;-k*d;)teQ5L+X<9vc9%ai1T-&j~(Z4It9HG(PHffyp@$;?z6@FU629fp~ z*9RU4>{7ol(43)zM%#CLC&S+>7fLruFJZ^3e4dlI&-&Y3M1n?pRv&jmMWKCaY}#UW zpuY9~0=994!N1l&LC|Q2)>&fs=j*XT?Duppt(~I0d&czyHsUrliDLnD&kK8K7kunNSUi8At(%O{Xa`q5 zZI~0?Id$c`Se7%`&ex%D5(B*s8g1RH35LPjuBKeR5X+7Xx7r1c`vK1%>eBWT&}bjY zkCkpzm=<72jb#y|?HqX9sBh}p^q*{mMtkhQ!~U*Uze#OG_iyqS?%&`8`jZZg_Tg5C zh4&pVXdBzGy#H{!G*;^t%-8Fn(QdiDzVvr^+0=&rVVBC}3R{d~I&{|qURMbC-_m%M z1N;TsIKplDKqdSH=&s40)-q;_^d-I=3%<}@2Ogj7@2hiD?ZRLDP-4+m6GU4@=%A%e ztfrOz_i*!PcEO>mm4h-yK}$Vz^&siU(kiL>7niX!2Iqbp1}wdsH$QYqhnD)0#Zy=~ zadE)1i<{Y$Mb6K}^n}G0UOq!2gP^58bY-lNR4-MVQZJPqxnkF%a{nS1=(hPQzFFyLj%5sMFFowPKzTT59*Nx&>s{tRAo>;wfu8V2Fa{{)Hd%C*|ta ztPD$smb(4Y2C2Ezf06d?b`cMn2PiS%eKTC~gTlcGEp`36rBhcenV$NycWH6|! z2&*$m7*n*K1TFPQ!zJnKuG@vFcdCk;`gd}|!oRfrkMi6eTI$L#x(lP1*On#*))5!} z-bT#@aPDj6puC@lmb!P#vH_95)fDPX@)SEowNm;U?-v6IOXb>inZ0Uhp{4%NmIV~= zvqSjb(njKkbE0CGzXJr8){+8ka-Ie)^~T~k+D_Xi2$kD=i)+J}Y8SDvazMAxr$I~I z^Y38kQhXb2?-o8{r=dzIXQh3>!e`h%VEgs_0BET*E=BmfD%Huabgd?0#dRU7A2=54 zm$L~o(x9b|m3m79t1gqY`Ax+6r(394_#w>dhdrd1NQ0Joa`pgWSMYP;^lV@8uWnW> zaIg#i`q28N?uSnS&{E$nohBL5)*CX6zT&}J*7xY}8L+TR9CSkl9r1^jx?X5c>EYl@ zLUEI?c&ADW1p^%LRu0PgK?5!Iu0joyw%@t!yKa}Sc;3hUeja!avU`u7!N6UOK z<}7Hb=QbH3%zy5tV$mj^J9_vbCns%tw`c+S=s(*gX_xmr?DReh{Q`Ew30r%YsKd51 zA#Pubj}~t+oN>LNV!6Ly8-BRK<^|?W&rU-b?P~dt{VP9wo8tK133$$z&bWs(qKx*; z?c)uLwmwy{+%C@GyL?_u+HW0aD`m9*cPA!gtA4Tnf7_*JAY>P1v|kq5GT(`cEobd;|S|HS08|~ z$$tK-*4+hCV-fKGhwre=n=r<-Y;+w>){$?bx#vAK)F7dmm$pJ+)( zq~-5e9kI6g0!{OTPW({%N&oNU`6>roo7)A43x+%@^`GDmo%oTqnc7`jFQ#yf3tv0n zH{gKhVTp3H!st_c-ia89P7vdegFablLnpm<=9pJ?=IH-A_wrrc0Pq}?nr@7 zd|kV)DMtUEs?LVnh3|mH_&_C=117rl6rbH)DP0b~sOCDqFU4=bm$s&nXzNC$ly~D= zPoz;V~ z2EH^07%f%u(x53{QMIAA*Act!3RvK9fJ2Q^Ua2RS>W$Ep&xyQic=w=4D$g@+6Iis3 ze2ewEXSd6JML~03IKAhI|CjOsSn5BA$`|&yZSbY%Y!bag z)}i!xlS`da3{TV4{st_MN0`DvPji6Y2wi*r#9-k-pCan`z;XDE2Vrq9AF)1Cx6EyT zc(q5-)YNS~{JDQ|ea->%n{pq$;;iP19rW^l&xsVW z-2PPC=EwnUL&j7k2*OsUd`Rg% zTL*3Z?8yGo+XwSg3yu%?jg^Cv4?2`ppMR}}uzy0ZQ|^E(cmPY!Uj0e8mj)fa`>7*R z#z?!4iC-VsFv8N-O1isyJ_SNszxJoV)J0!iSI2c=xLx=c{q4K(*=Z<$-najTloJPv zsvNk_@Eau-O8#n$(ANKQdY&-k(Rrs>aJx#|+PV7I^okBd`SU`P4cdnf%wNQEzWZ0q zGD3$xs9ka4+f8+}JQlpaJ8+=n(Ho(|k9tx*pie@yla>m;1rNjxZTqcbZXmSv$OrTb zZWlOyfP=MfYBbQ+Z}HxApxNO%>U;qXxIPZprR|E0)He($l|DZ>RQpe)o51@qw~2Kk z?9$vOQF(5q{JF>262i$#9%|dTzwjHyXY>r5p5bXx{`|qOW3}UlZc_7%W5GdBcIi2R zfbFQE!>{(Tk5qraL?pi!N;dAyi& zWRtK@TjevK;WuG~ee<%iRQ*$=5!(8Rn+=9i_tMlDqfNl!fZY_*cF;JfgSNhBR$oKw zcSTgY$X~v$hFxewBcm4xD8ZgtCrEhvE<4%LzdYYz*I0Fy5tC=TYs$N9O?V8B~Bb1{XiN#WjhCG>!;NCXc)ddN5!ID+&0>lymE$)o|zk+yE$37bLKLkjkMi(LbJLH7*s*vgMVcPjkL(WB#>vpu`!w^Bk0iRYwO+yE?0pI*R*p0c3NL*TgNQc+9ytiw*EyiANj*=cXq#LuqYL``$6&DcZsq;VT(16lcBAj z_tsm^dEw4V3=0LVy02wS)^VX4M_XqdO$YHKN$Tc)W9hA6ZJV zvrU?c{c1bg)r_OKbAO!#|wgSibgqDfUZ;rebEUtJ;TP`{0B``A5R`DyigT zXz1^aO=K4S4@x<@HI~B;m1g;snu+J@x;l*yYv)lP>XF4<-o(oIZs5SXMzZeD(yW`8JdY;mHziLfPJ#LD=_VE2+n^6gG# z*!wNb#F|T8lvwaJOYpKp`Kw;!ho`YJzA@;~vytq%pbX3Tt(myKmlezV#n=^z@@B%m z`Gf4zHwKrhG?KR;FT)JQn~M#ryC`krxxRNb@$H?(ie$#h%ZHx|O})`j&MH)v{q%Kn zanc=)8e_!c=DI}LLRi;(u`+7?hplcXZ*5bSHH&I4uHRtCBG=1qqFD6FVhwJ^%J_Dn zNcV=a7+aQ2INDt7+RuvR9ExqFSP-_~wOF|#eY-HIWJ7t(m9i`*ySeCE$%^H3deiNR zvc7K?n|?V~#=Zdmob-|-tCV9Mnzj%_cIJoT+Pq(AcO}YsguQw`7GqRs?rbl)d3ZTi zWm*fdb@lvE#EaY2>`j!z`(?3)XJTdS3(%~om;7LNIc74p5G$?DQ|!VvIB!U#`GTB7c~M|_Hpo9j+_E?~ z6kIu9j})>?*qSosFMSj7ak!`a-L&$|G9pC0UOHFd0KVWcL!y4%KZ_MN#md+hz^{>~ z9C4&PYqldq9KAXxl&>?v<4qck4}`68m~xW#1;~EZKz{Y9JS%)RL|j%YN9BOucpM}S zgbhoNm9a0t`U4H*{Y@*dsii~3uaiG19C+NSA5N4#24u0M)L0q&0&JMvKz=m70=vUP z#o^z63gtNT%_>KU17W{5#LCzg;I-I5ez>;+t2{bX9P>C^;ed82hnYAKHYbU4lJ*5? zQ?`M8@pc7PW=*JgbFm!@`yFXUO_a3AFtS=ueT#;Qm5-R#KI~I1caGK1_+tjOL~V&e0ecD}%R*s%G8#U28GZm2KU>0Xg7$qp4)rrUi6 zKkTHofo}@64d0P;JX>G>rcOmx{I^hXP^oMu|7O_yn?^pvcO;pG8p!V+S75ichKjk< zvXy=en>dbB+~Ub+r6_LLLtsJs2J(Q-71+nYq2k<+R=e;oj))9vj8hY1W$YoaU{eFx zuU!QeQY%!9UT)2Gvht3XTblYjzI$o6%1eIx zZ8_F+NDJ|ocKK?bhh52#DE~|2P6czUjQs|>7HudSu9jsr@|uh1DrnUC0{+dU@hpt6 zX~$w^d?RyrYD2l*pt5Yy`sQNQXpOplfL$LNCwI^|x#<+~rEg?PJZmT~eqDx{0_k1E z-_F=WG*1>c;By)+&iiaJ9nX(c=iYD{05t7TV?|Jf#!>xE3q>68!*xw zd!<4d_GDx;am5+y9LvYmGBgkMAndm^4`IK7sZAQoWA~S44N5f=uln298o;wPiE;`cB6+tFfH;q7wN&QI7W;jKhS!zc7-^3&F1MWHPA=aA8=;| z?_jaL!~F#~)Ekm0-=($k&RTIYzUfKs?jv80cW2AW1dE=1?Dq`de2eY_deC~^wNadm zy%e6%J=rO`e+zXD7UvbXf7?R$S&!&`Xae15;hUcDi9T}eN$#xN>mc#!7&~A1I6f#* zKK4x(o6$Q?#y36jn|$QL-Q3xUvq9pa1=jmQo)7mw{4AerM(g$MaWcN?8GYSHUgbg9 z)j^^z(QX%QJGJ9yxl^MoHn-$rIWA&8t5&^m&j)~E@J1^dYt9*5b0GZR z?V;M4)!%o%J*Q8*dgt}6SFb`>zgy*<;>8}cEhu)~Zc{^;w!?=t=S2Qogn-viYh}zsnDO_?> z=d>u>+Oe@L^+cMuBzYNwuBh8dZ??#mUmSYKAiddV$MSd>TrQRwZE0e`D$5ykMMd)X zutI(Fi}AA!(y@wpRlDGkdVM=N5pv+s=-iNfQgqTh5>>@|Jwqtx@^J2dxa! zWHFz@f!D>Nzqhma`)Oj)5z85LMIU{ASo+(%r2R8UwXfz==inIU3w_wmBEP1IE2QNN zx}tXVeAvKtdBxAY43Zd?->Ga9%EYp5rD(2Pb~%HtsFlu#6{+tgmgsDdOpgjEe7Vmw zUa>67GhJ-|Wf_C6Xh%06R&`cx@q(v8+IX;#$meJ9Su>wlR!K}3cfMc7peqWT;lm27 z%_UZLHAo(Zil}zshtnlu*^O4TPEdL|!`TlRbA4FN!y0khd%ZLzvX~R!VRyH)C~9v# zJ1=L@6>V(i!x9!|`FA7^FDjK#{Q%CPTeq_Y)IZFOSk9m;I+EheRy_UczahaORqs<$ zU8{hP{eIcblIY#(=$+*Zx}qf?z1Y=jpZs0M8zujgQVL&`3s;va+gVTQ`zmNxFzAY` zE?#VT_RYe zzuHhb^Vp6B4%gb7TiHb7J8jEKhO-}jy;GOj&ZYSuXw^viaJHNi-<}J%Dt)y}_DY7c zAEqC#%Q8p4_AeXMNNSW-R>AU^H0!srz0_AP9am#AcmB)DHj*~KE3Mi^ z*{0o$Vae40eq^f{bVW%A>am?MU;SGwY$*9Nd%eN8;JaW^4Eu-r-{qB7Go1afcC{z7 zRLLdoOKl)!CDQvW*#if}`s0Q%jM4gzIAt}1uISv_`mEAtH?jH|U+F|Kd;G#CY`Z>- zW{=y@n!?%D47#Fzv0iL9^=EZY8KsqT?R^xmu%EUin$>Mh{cqK923^s>L~mB;N>Op+ zQG=A#)Be5*4!Fd=(QH=BbaCy-a0Xq`VY3gb(x{}k{e+(OY5l6sOTgh;g=kii`t|ID za0XqGX110cH7?)-_IWDzn{H_oOCYRwy9fqdQQ~u* z6ckt7R&~9OHHpZw@_GP=lM|y@Bw@D=jbP9fm1-nNb74Au-z}9V}WRZ z;}N#s#YM66WOrHZ2nJnI?FxFSk@2E6yu6lm+fhgL1N_lPj$$_nn_WGEL06PqMK86F zxnO-=Qp=7$uA^|k`!29$DbCI|PNy?rA{cZ<|9I-9J+9}ivMa^$?;dK|;NMtF6f5aY zbwOC@ikb%MrN4Tgu@-pd!=CM{t75@7X@3+;f0L%zg|28>KfUz#i<8zJ$9$N<(^KUO z>_8U9GLva9ezFT)QH@~o+3`QEuA6+A+td1Ly@7A-V^OU1s5DViBZ5I!R5(U2ou@q# z6Mpq!2mkd}d_S)cYKuV{^L3N8Q~_@`Dcw(Po51^(iDomuK3A~N6={wc zB-bu$t@AE;v6aOnr@DAkGn#eoZO1}al>3=Ms*t(Ls@vqn%4q^s4zTNCh-RY_o+);r zD{7YCDCPaU)Y^Qs7b|wCsZ*QxZB86Ao+>_rt|*|UQCb_f$XcqU7yG?ZbCs{+-|o@u zYwM?qUFeDmHZe*ozRa`UsqMwwJzA)I!69HsG;?3_M2Q{fic;GdrRTyN>(>%q%pfO zelkie&zr1`1us_SU^Ay!AGMEscI|;uHt34pb~Q>bmxWoUxAkH%OPV@i15T13%Gt3v z`=L^M+MhLgw)N%^FP7~WsKyyMm$@Fz>IB_a{0m)CpJqmBSb@3LxVc`e)p2_~zz4v_ zKaFOeci&U6&=n1DXq1A^&$Di!vDUA;sMzIgDCko((|o+E@P)3(wZ2hW{PzNDi_>20 z!w5f{<9zalTMVn(;jU5_&=tL@Y?OLbS!|Wwda+V#8avg+Kc!;W{+)Le4$u{yE^L(g zTbEd;RQ6^k);Cn+0enr>V^~0bI~Ka4-!lwS(|OCSWm+@c?oM`7Cd9B|-Ryj!E86=;FJ({NXHB8;xZ@4` z*v;+UCA*#b+z<^kUO-ng`Kn&J7<$N>)l19%NUx;WXKO|<=!$}(^pf|?qt=0uT2{V8dDSlPcger6Z8t;@ z8oQOV9~S7PuT4)_Yout|=$&QNSO@1-RBxj{-4IXIiD1wbJsCq|;nTmYQ*UY6jp}7o zEaLY$#lt1Pn_^%;QP5r46EPv zmUvhj!JsR;R8}udJAKW%yrGWe>Rw#6tJH@!hMnJcOPs5ZV9*uabkj?T18!J@TG7ex zi;5{eL%C2NsWoEQ%=)***1i!8x}wUT1nJ@STh{wsb?oEIqN;ykcV3wob~l#B;YKu9 zCS6g;3qkVObH`e_uZ}GZE~@Z_A7Iy%FNV2$-x15u{0zFH&-VnWP@8+!Q3G{sdvm*8 zg)7;u^Cg_c< zZP){Avwk|}HSHT;;7vE8nd$aj@o4i1dPgrU{dGlU%}iwh6lhPDit` zQ}2m0T17DEiW-pJNhKayx3$+Xmr2ExvH^#(B^``reM;RIE4PiH_xZ9?#x+5T%Xna2 z5vXJP1?Rd5*d5Kz@4qibwvS-Y6Jb#!cG-jWKI`!{@XG#lsoP<-1tg5m53(?dZT)$hKwds!VDSEH0u9j8pE zxkkc6@nY8q23^s$XY|fA<(~Dfn~qKBV4vF~hS7#bj-ayjekAtj9>Jh1lG6og^QgO4 z(|awOy{L@J7k*gTJDOEUcawpZ*SS#8*sP++C;N*@?&vK z&j zYy!W#UNpN!bD~VbLRT~+zg{}jI6=$)a&cG33*b#}qgd;8&&8os7tj^CRn<$&J+4@*57M&c zO{*y!xF2pkiDKvUFT`h^BIsLlbt$2`UV2gJvUNZgExSIxx>7dO8SIw1MRWU;FT~3f zXV4YRsHKG&zhP_ z9fJeP*5gzZ`|$jwxR%-wbVYLsd+E1}*4Ca{Hg2YU9D-foYaWSWy~e#F^=|}&u4q|p zy>zeSMeF+NTDG)>{XL79&2)&~$=C7p%$jPWFb*CxlI0;Bfkn zC{~r`k@tlN23?W6yIyj;M`y#*JK5lV&f{j0q$n0~JxvUz{ujC;PpXTp!bR(1!kTv4 z-`_ajAbNkpyB@}4=!%x-(M!|MU$VCK(y|UsoZs~#Qlr@92>Py9Ac8?x3J@ zrQs}>ucuVFqaaPs_rUtdRmbXiyDN3fefD{3G^_uZa$K5(Gw78TXX>OjPoG)q{H$Yn zQ!1%g_^jCRXtw2gy141lY6iVh$=y08)cV(dVyaHsTCBXX<_H|F6q@(lO-UC!u3F8Y zSL#Xj3f}(cKeUt}4PR4QLdC-F z_1Q6OMi{*xS6NNDGd_~ZMaR5@Ttxrbg4Fj$QIS7i@xz)J<}sMo_zSIO&^DcVr)5*R zxQb&|2~zTz!irtQF8V*){1|4Vb*|G@S2Jjv#**EHlC-YAkoxzGf+BFdUD!Iru!gj5 z^l0E}25r+~Rm+ehn0zdTsYpl!OdT*sEr%PX3{>ZD3@ z@+*AteDKX%JDPbC*0?R4LEGe7P>{Oh&1XAk(y?k;`INfgb{DpYVsj|Y9^^+-IhX8`)hcT^ta&oLEUT0ymcfZY?vHZWJh zUg)%e*0~x=#VqvQVr(AUN9M&$^X%(UoWtgu>sdEi+aA+sBZIc-Och%9t&qp&-o=ac zyi!o*3%{jQUe6Nz)5QbtH!^6OmJXutEDv+r?$A5rsQiUg4zQiLbsg(W*q=vjV$e2q zneHncy^z~>;otgfaYZ|p*TtCW>zF%XSFPE^plv$X&sVzoG`H=2Q7@L9r;t(?92>CL zZuj)yP4rFJPx=~al+LcpV;f0p+%NhSbgH*=O*XLgRJL>fY+%qfdF<9p{}jw?8-K%x zP5AJwj^X3AQ#P|es<*#au4T|RB{kQv;g9l(sVxO5(mkINXW*dlpmBZ$#aU#7a0YEt zi`U*PYij|~bA>?)@8zaoVH0)Hwa0e0i@pcw-YjR(Hf^rv#rl6LD1L0`OJ}J#f6p3R zZznrWYr2!xFJaI&{V0Eub3pziav~qn_cv&ps_DJh;~RNJ*T%lmq!#(rHUu8yUhQCO z$ZoZVOBl3GmU%ubCHuYq+n2Q7RmZ-@&;1)yd>flb>%WbMtYkPR!er1(0e#L|E9BO) zjVAk=n9?SwY(Z}~vjp;4O3}3pI;b@l=v!s#X6r9|>#-8c?dvccyJg_-Y(kTCF>1pW z1|5{E)?eB>u&4FGjT)@w$j(aJ1QtC0*|&^MGSC|7FR=_ds1?ndNkfO-J#=tDMfT{y z&rWr$89a}jub(b)0tc=U6hO#T61hE z<$2pl+P}JlbHI;};zA>>SAsR!tZ0mps65Rz*~vo>J1(=YEB*ytQSr#VQA2 zP341_sbab~ucMVgGj(K7AF1p8`u;`A-msP16XAs2)v_ORt&lEO9&Mu>f!5N1zyXpp zrmg>h4o7UY7Dg(5;C=9r{Qa31VNC`bgJx<}$3c?ib{qd88M|#>X*(6Zc)r46$Uvqg z4z@W~2F;Xwcd!(4ySD$5-fL}!$?*ynK7j2@`3AE?l_>XX%pnHNRPP}}r3Y71{p3lD zY!61+vD|K(E5lfL70UhkaDYKG)w<|N>EY$lhqgz~vh^OZRpo%XGhH0bid9P&Lrd&u zbr>}MN& zufLNYz8sm!%(dxT($FLZebt0_v}e1iux(@8ZZ^#f``nZFXYP-}*lYSG+-sqkL0`3= z_6b;&+r!rOerKCUgJV{di^t^gxARy7FUp+>j$_bQdC-}GQg4GTVdGD>BKsFv;V&MO zrOGa5aazh%YqFa`Up4XIBx!ct2DYyrLv0)LOtx|y?sxkxW9}5c9*MCG`l_4TCQA9n z`r59hO|^YEJ4^W{0UqF7b=)e}x&h@b*51mXuS#n+L0V8$Z;R?O-`1%1N`)`y5jS`Z zTTbiMxfew;oWn6?<~S*-vzP7Hx~pu%gAx=D+z%;1^kwJ@fyZ;!e*o#`W z@e?=OM(@3%eis3L*YQnk7mY)!TCQU_vqO9PSIJVovhBFnZd+K4#;GoryF{_>G;VIX z7r}65N3QhYQpa2+NoKsy)-A*SE&?CGZa_v1OQCW8?@g;1v{-{K4v`jL&Sx85@lRXs zUY<^NcZ6F4$sH?R^RN*_;hK*i`Dz`m|iipv8)B zI#6o4?WOf_=q+1EOQ+NWRN;<=L*|DwnEMPdhM7Oq!^t6xBRxzmn zYusw75@(!4#WQ=@Tk=C#rG*S&GtlhJ*1SM*TsN6EP${#cPwO^ zNQ+hXdJm~yj{&xOf(x7S_c}lH4d8&g?&)s!n(89cZxMqQOJBQ()S>b(wlCo>thn~0 zA8@=~yc)k-$%{XCei4HftI^wTQq3a6ZFO_GvebV|_=79z4O{|TcC#R|JF?$m1}#>% z;a#PSfRVO*4fC+jTcw@y+8%DFym-Q1pqwXYvHX^Hmck4CYMWXjAKNf4zhW1*!Q<<2 z%0DCQ<+79yLuaDg>)%m&xMZZQqp2Y4{pg+__ZRL#G&%0DOCNcr~O$FK|k!Vl1ctsW#w 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�`cOlpZU*dqZVjHvzrLKR} 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