# CCSprite3DFXViewer **Repository Path**: bman/CCSprite3DFXViewer ## Basic Information - **Project Name**: CCSprite3DFXViewer - **Description**: Cocos2d-x Sprite3D 特效展示编辑工具 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2014-11-07 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README CCSprite3DFXViewer ==================== Cocos2d-x Sprite3D 特效展示编辑工具 编辑器操作方式 ---------------------- * `9`切换模型视图摄像机操作模式 * `0`切换基准线显示模式 依赖 ---------------------- * cocos2d-x 3.3final (请将cocos2d-x复制到根目录下的cocos2d-x目录) cocos2d-x patch (c++) ---------------------- * cocos/3d/* 1. 更新到tag cocos2d-x-3.3final * cocos/renderer/* 1. 更新到tag cocos2d-x-3.3final * cocos/cocos2d.h 1. 更新3d部分头文件列表 * cocos/2d/CCCamera.h .cpp 1. 增加setDefault, setPerspective, setOrthographic, getFieldOfView, getAspectRatio, getNearPlane, getFarPlane, getZoomX, getZoomY (使Camera参数可以被更新) 2. 增加project函数 3. 增加CCCamera每帧更新全局绘制摄像机世界坐标 4. 调整3D投影的默认FOV从60到37.5 5. 增加RenderOrder用于控制多摄像机的渲染顺序 * cocos/2d/CCScene.cpp 1. 为增加CCCamera每帧更新全局绘制摄像机世界坐标而做改变 2. 增加对于摄像机PostEffect特效的支持 3. 增加RenderOrder用于控制多摄像机的渲染顺序 * cocos/2d/CCCameraPostEffectProtocol.h 1. 增加CameraPostEffectProtocol接口用于实现摄像机PostEffect特效 * cocos/2d/CCNode.cpp 1. setPositionZ函数注释掉setGlobalZOrder(positionZ); (为什么positionZ要影响到GlobalZOrder) 2. 添加cocos2d-x-3.4的RotationQuat相关函数 (用以修复getNodeToParentTransform中3D旋转和并使用缩放的计算错误) 3. 添加cocos2d-x-3.4中getNodeToParentTransform中对于anchor point计算的修复 (anchor point has not effect to rotation, it always rotate along (0, 0)) * cocos/2d/CCDrawNode.cpp 1. 修正onDrawGLPoint, onDrawGLLine, onDraw中对于VAO, VBO的错误使用顺序 2. 增加drawArc绘制圆弧的方法 3. 增加直线宽度的设置 * cocos/2d/CCLabel.cpp 1. Fixed content size of Label is incorrect after sets empty string. (修正Label::alignText函数) 2. 修正场景中有多个摄像机时Label的空间位置不会更新的问题 * cocos/2d/CCActionInterval.h .cpp 1. RotateTo, RotateBy增加分别设置x, y, z角度共4个参数的create, init函数 (避免lua-binding由于不能正确区分相同数量不同类型参数重载而导致调用错误) * cocos/2d/CCRenderTexture.cpp 1. 更新到commit a204b02 2. glViewport替换为GL::setViewport * cocos/2d/CCGrid.cpp 1. glViewport替换为GL::setViewport * cocos/renderer/CCCustomCommand.h .cpp 1. 移除CustomCommand中的isTranslucent函数重载 (使CustomCommand不是固定加入到Translucent渲染队列) * cocos/renderer/CCRenderCommand.h .cpp 1. RenderCommand增加execute虚函数 (使可以创建RenderCommand族的子类来自定义渲染方法) 2. setTransparent用偏移TRANSPARENCY_GLOBAL_Z_ORDER来处理 (这样可以自由配置绘制顺序) * cocos/renderer/CCRenderer.h .cpp 1. 移除render函数中绘制TransparentRenderQueue前后的GL depth test开关操作 (统一depth test和write的操作规则) 2. 屏蔽TransparentRenderQueue的处理,透明render command是用偏移TRANSPARENCY_GLOBAL_Z_ORDER来处理 (这样可以自由配置绘制顺序) * cocos/renderer/CCMeshCommand.h .cpp 1. 将setDepthWriteEnabled修改为setDepthWriteDisabled (为了兼容cocos2d-x绘制2D时开启depth write关闭depth test的方式) 2. 修改genMaterialID增加cullFaceEnabled, depthTestEnabled, depthWriteDisabled参数 3. 修改preBatchDraw, batchDraw, postBatchDraw声明为虚函数 (用于子类覆盖) 4. 每个Mesh只创建一个VertexBuffer和一个IndexBuffer, 增加indexOffset * cocos/renderer/CCVertexIndexBuffer.h .cpp 1. 修改VertexBuffer为可以配置buffer的使用方式usage 2. 修改IndexBuffer为可以配置buffer的使用方式usage 3. 增加在创建绑定VBO之前对VAO的重置,避免对象在其他使用VAO的显示对象显示之后创建时会导致VAO,VBO绑定混乱而出错 * cocos/renderer/ccGLStateCache.h .cpp 1. 增加bindTextureN (用于SkyBox) 2. 增加GL::setViewport和GL::getViewport * cocos/renderer/CCGLProgramCache.h .cpp 1. 将getShaderMacrosForLight改为public声明 (用于定义其他shader时可以获得通用的光照参数声明) 2. 增加Shader3DParticleColor和Shader3DParticleTexture (用于PU) 3. 增加cc3D_Skybox_vert和cc3D_Skybox_frag (用于SkyBox) 4. 增加ccPositionColor_noMVP_vert修正在mali GPU上的LayerColor onDraw报错 * cocos/renderer/CCGLProgram.h .cpp 1. 增加Shader3DParticleColor和Shader3DParticleTexture (用于PU) 2. 增加cc3D_Skybox_vert和cc3D_Skybox_frag (用于SkyBox) * cocos/renderer/CCGLProgramState.cpp 1. 支持GL_SAMPLER_CUBE (用于SkyBox) * cocos/renderer/ccShaders.h .cpp 1. 增加cc3D_Particle_vert, cc3D_Particle_tex_frag和cc3D_Particle_color_frag (用于PU) 2. 增加cc3D_Skybox_vert和cc3D_Skybox_frag (用于SkyBox) 3. 增加ccPositionColor_noMVP_vert修正在mali GPU上的LayerColor onDraw报错 * cocos/renderer/ccShader_3D_Particle.frag 1. (用于PU) * cocos/renderer/ccShader_3D_Particle.vert 1. (用于PU) * cocos/renderer/ccShader_3D_Skybox.frag 1. (用于SkyBox) * cocos/renderer/ccShader_3D_Skybox.vert 1. (用于SkyBox) * cocos/renderer/ccShader_PositionColor.vert 1. 增加ccPositionColor_noMVP_vert修正在mali GPU上的LayerColor onDraw报错 * cocos/3d/CCBillBoard.cpp 1. 修改BillBoard的draw函数 (移除setTransparent(true), RenderCommand的global z使用_globalZOrder) 2. 修正有时候会上下颠倒的显示 (修正公告板的变换矩阵计算, upAxis总是Y轴正方向) * cocos/3d/CCMesh.h .cpp 1. CCMesh的bindMeshCommand函数 (添加setDepthWriteDisabled) 2. 将calcuateAABB函数移动到public声明下 3. 每个Mesh只创建一个VertexBuffer和一个IndexBuffer * cocos/3d/CCSkeleton3D.h .cpp 1. 移除动画计算中的weight blend的部分 (简化处理,提升速度) 2. 将Bone3D::setWorldMatDirty的实际执行移至setAnimationValue (用于修正AttachNode在场景树中获得正确的附带骨骼变换的矩阵) * cocos/3d/CCMeshSkin.h .cpp 1. 增加replaceSkeleton函数 (用于Sprite3D中的子模型替换) * cocos/3d/CCAnimate3D.h .cpp 1. 移除动画计算中的weight blend的部分 (简化处理,提升速度) 2. 增加getAnimationData函数 (用来获得动画数据) 3. 添加cocos2d-x-3.4中对于在Sequence中使用Animate3D导致速度设置无效的修复 (`setSpeed` has not effect if `Animate3D` is used in Sequence) 4. 增加HighAnimate3DQuality相关功能 * cocos/3d/CCRay.h .cpp 1. 增加bool intersects(const AABB& aabb, Vec3& intersectPoint) const (用以获得相交点) 2. 增加bool intersects(const OBB& obb, Vec3& intersectPoint) const (用以获得相交点) 3. 补上漏掉的Ray::Ray(const Ray& ray)函数实现 * cocos/3d/AABB.h .cpp 1. 增加scale函数 * cocos/3d/CCSprite3D.h .cpp 1. draw函数中屏蔽如果是透明mesh的话就根据Z坐标计算globalZOrder的处理 2. 将draw函数放在public下 (用于PU) 3. 修正可能的内存泄露 (cocos: commit fad4fb8) 4. 修正getAttachNode函数中使用模型没有的骨骼名时crash的问题 5. createNode和createSprite3DNode函数中不使用setAdditionalTransform而是改用setPosition3D, setRotationQuat和setScale 6. 添加insertMesh, eraseMesh函数 (用于Sprite3D中的子模型替换) 7. 每个Mesh只创建一个VertexBuffer和一个IndexBuffer, MeshCommand使用indexOffset和indexCount 8. 增加Sprite3DCache:removeUnusedSprite3DData功能及相应的资源引用计数 * cocos/3d/CCMeshVertexIndexData.h .cpp 1. 每个Mesh只创建一个VertexBuffer和一个IndexBuffer (MeshIndexData增加indexOffset和indexCount; MeshVertexData统一管理VertexBuffer和IndexBuffer) * cocos/3d/CCBundle3D.cpp 1. 修正可能的内存泄露 (cocos: commit fad4fb8) 2. 增加AABB数据的读取 * cocos/3d/CCBundle3DData.h 1. 修正可能的内存泄露 (cocos: commit fad4fb8) * cocos/3d/CCAttachNode.cpp 1. 重载getNodeToParentTransform修正AttachNode在场景树中获得正确的附带骨骼变换的矩阵 * cocos/3d/CCPlane.h .cpp 1. 从cocos 3.4移植 * cocos/3d/CCFrustum.h .cpp 1. 从cocos 3.4移植 * cocos/3d/CCAnimation3D.h 1. 增加getBoneCurves函数 * cocos/3d/CCAnimationCurve.inl 1. modify INT_NEAR to use fabs 2. 在析构函数中替换CC_SAFE_DELETE为CC_SAFE_DELETE_ARRAY避免内存泄露 * cocos/3d/CCTextureCube.h .cpp 1. 从cocos 3.6beta0移植 * cocos/3d/CCSkyBox.h .cpp 1. 从cocos 3.6beta0移植 * cocos/base/CCConfiguration.h .cpp 1. gatherGPUInfo函数中增加获得GPU shader相关的指标参数 2. 增加HighAnimate3DQuality相关功能 * cocos/base/CCDirector.h .cpp 1. 修改drawScene, 添加isFixTimeUpdateEnabled, setFixTimeUpdateEnable, getFixTimeUpdateInterval, setFixTimeUpdateInterval, getTotalFixTime, setFixTimeUpdateScale (增加避免跳帧的功能来实现精确的逻辑回放) 2. 增加setClearColor 3. 调整3D投影的默认FOV从60到40 4. 修正GLToClipTransform,不需要乘以MATRIX_STACK_MODELVIEW矩阵 5. glViewport替换为GL::setViewport * cocos/platform/CCGLView.cpp 1. glViewport替换为GL::setViewport * cocos/platform/desktop/CCGLViewImpl-desktop.cpp 1. glViewport替换为GL::setViewport * cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java 1. android平台Cocos2dxSound.java更新到cocos 3.7版本 (SimpleAudioEngine:Fixed thread safety problem on android.) cocos2d-x path (lua) ---------------------- * 针对cocos c++的改动需要重新生成一边lua自动绑定代码 1. tool/tolua/cocos2dx.ini (Node增加setRotationQuat, getRotationQuat函数的skip; Node和Scene增加Physics相关函数的skip, 转为手动代码绑定, 这样CC_USE_PHYSICS编译配置才能正确编译) 2. tool.tolua/cocos2dx_3d.ini (class增加TextureCube, SkyBox) 3. tool/tolua/cocos2dx_3d.ini (Mesh增加getMeshCommand函数的skip) * script/cocos2d/Cocos2dConstants.lua 1. 增加cc.TRANSPARENCY_GLOBAL_Z_ORDER常量 2. 添加cc.Handler.EVENT_SPRITE3DFX_ANIMATE_EVENT作为Sprite3DFX动画事件脚本回调的handler type 2. 添加cc.Handler.EVENT_PUEX_DISPATCH_EVENT作为PUEX事件脚本回调的handler type * manual/cocos2d/lua_cocos2dx_manual.cpp 1. 增加setRotationQuat, getRotationQuat函数的绑定 2. 增加Node和Scene的Physics相关函数的绑定 (这样CC_USE_PHYSICS编译配置才能正确编译) * manual/3d/lua_cocos2dx_3d_manual.cpp 1. cc.Ray支持intersectsOBB和intersectsAABB两种碰撞检测 (重命名lua_cocos2dx_3d_Ray_intersects为lua_cocos2dx_3d_Ray_intersectsOBB并且增加lua_cocos2dx_3d_Ray_intersectsAABB) 2. cc.AABB增加scale函数 * manual/cocos2d/LuaScriptHandlerMgr.h 1. 添加ScriptHandlerMgr::HandlerType::EVENT_SPRITE3DFX_ANIMATE_EVENT作为Sprite3DFX动画事件脚本回调的handler type 2. 添加ScriptHandlerMgr::HandlerType::EVENT_PUEX_DISPATCH_EVENT作为PUEX事件脚本回调的handler type * manual/LuaBasicConversions.h .cpp 1. 修改luaval_to_physics_material, physics_material_to_luaval, physics_raycastinfo_to_luaval, physics_contactdata_to_luaval函数在CC_USE_PHYSICS宏的控制下 (这样CC_USE_PHYSICS编译配置才能正确编译) * manual/cocos2d/LuaOpengl.cpp 1. glViewport替换为GL::setViewport CCSprite3DFX (模型) ---------------------- * .c3m 模型动画文件格式(JSON) ``` { "mesh" : "xx.c3b", // 模型和骨骼数据文件 "submesh_hide" : ["xx1", "xx2", "xx3"], // 需要隐藏的模型名 [可选] "animation" : "xx.c3b", // 动画数据文件 [可选] "animation_fps" : 30, // 动画FPS [可选] "texture" : "xx.png", // fallback贴图 [可选] "default_material" : "xx.material", // 默认所有子模型的模型材质 [可选] "material" : { // 模型材质 [可选] "xx" : "xx.material", // key为模型名, value为材质文件 ... }, "default_material_prop" : { // 默认所有子模型的材质属性 [可选] "xx" : ["FLOAT", 10.2], // key为属性名, value为一数组,第一个元素为属性类型,后续为属性值,根据类型不同,元素数量不同 ... }, "material_prop" : { // 模型材质属性 [可选] "xx" : { // 模型名 "xx" : ["INT", 10], // key为属性名, value为一数组,第一个元素为属性类型,后续为属性值,根据类型不同,元素数量不同 "xx0" : ["FLOAT", 10.2], "xx1" : ["VEC2", 1.1, 2.2], "xx2" : ["VEC3", 1.1, 2.2, 3.3], "xx3" : ["VEC4", 1.1, 2.2, 3.3, 4.4], "xx4" : ["MAT4", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] "xx5" : ["TEX2D", "xx.png"], "xx6" : ["TEXCUBE", "xx1.png", "xx2.png", "xx3.png", "xx4.png", "xx5.png", "xx6.png"] }, ... }, "animate" : "xx.c3a", // 动作数据文件 [可选] "animate_high_quality" : true, // 动作播放质量 [可选, 默认true] "attach" : [ // 挂接模型 [可选] { "bone" : "Bip001 Prop1", // 挂接骨骼名 [可选, 如果没有bone字段则会以子节点的形式添加] "name" : "weapon_1", // 节点名 [可选] "model" : "xx.c3b", // 模型数据文件 [与particle二选一] "texture" : "xx.tga", // 贴图文件 "particle" : "xx.pu", // 粒子特效数据文件 [与model二选一] "pos_x" : 0, // 位置偏移 "pos_y" : 0, "pos_z" : 0, "rot_x" : 0, // 旋转 "rot_y" : 0, "rot_z" : 0, "scale_x" : 1, // 缩放 "scale_y" : 1, "scale_z" : 1 }, ... ] } ``` * .c3a 动作文件格式(JSON) ``` { "anim_x" : { // 动画名 "start_frame" : 0, // 动画起始帧 "end_frame" : 60, // 动画结束帧 "event_frames" : [ // 动画中的事件 [可选] { "index" : 10, // 触发帧数 "name" : "event_1" // 事件名 }, { "index" : 20, "name" : "event_2" } ] }, ... } ``` * .material 材质文件格式 ``` material NAME 材质名 { technique { pass 表示一次绘制 { render_type opaque | transparent 渲染队列分类 queue 123 队列中的顺序 shader NAME GLProgram名 { vertex PATH 顶点shader代码路径 fragment PATH 片段shader代码路径 } texture_unit NAME 纹理变量名 { tex_address_mode repeat | clamp | mirror 纹理采样模式 } scene_blend off | alpha_blend | add | colour_blend | src_colour | dest_colour | modulate | replace | one | zero depth_write off | on depth_check off | on cull_face front | back | off } } property { 属性名 INT 10 属性名 FLOAT 10.2 属性名 VEC2 1.1 2.2 属性名 VEC3 1.1 2.2 3.3 属性名 VEC4 1.1 2.2 3.3 4.4 属性名 MAT4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 属性名 TEX2D "xx.png" 属性名 TEXCUBE "xx1.png" "xx2.png" "xx3.png" "xx4.png" "xx5.png" "xx6.png" ... } } ``` lua-binding ------------------------- * 将tools/my_tolua目录复制到cocos2d-x/tools * 运行source ./my_console_path.sh * 运行python genbindings.py * 将CCSprite3DFX/lua-binding目录复制到cocos/scripting/lua-bindings并且更新lua-binginds的工程文件