axmol/cocos/renderer/CCRenderer.cpp

1009 lines
29 KiB
C++
Raw Normal View History

2013-12-18 10:12:15 +08:00
/****************************************************************************
Copyright (c) 2013-2014 Chukong Technologies Inc.
2013-12-18 10:12:15 +08:00
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.
****************************************************************************/
2014-04-30 08:37:36 +08:00
#include "renderer/CCRenderer.h"
2014-04-15 07:46:19 +08:00
#include <algorithm>
#include "renderer/CCTrianglesCommand.h"
2014-04-30 08:37:36 +08:00
#include "renderer/CCQuadCommand.h"
#include "renderer/CCBatchCommand.h"
#include "renderer/CCCustomCommand.h"
#include "renderer/CCGroupCommand.h"
2014-08-05 15:08:01 +08:00
#include "renderer/CCPrimitiveCommand.h"
2014-05-10 09:39:25 +08:00
#include "renderer/CCGLProgramCache.h"
#include "renderer/ccGLStateCache.h"
Squashed commit of the following: commit 64722e414c6cacc108fa6015d6af84bd9a4d79ec Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 14:03:53 2014 -0700 More WP8 fixes commit 7934be32741cddee6d04cd4f32c7e9718ba83b4c Merge: c2b1619 fea335f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 12:19:41 2014 -0700 Merge branch 'mesh3d' of github.com:ricardoquesada/cocos2d-x into mesh3d commit c2b1619005b5a62ef77afe727429584d6a57010e Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 12:19:19 2014 -0700 Adds missing resources for Windows Phone 8 commit fea335f573f975d9d2f6eafeb3ad4d3ea8095ee5 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 11:54:15 2014 -0700 Updates CHANGELOG commit b8b93da914de97662c9df55cfc351ad8b74ea779 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 11:48:59 2014 -0700 Adds Sprite3d files and tests commit 059c842938e19068427bb2276d52f3e0ea1cc51f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 11:16:13 2014 -0700 fixes compiler warnings for windows commit d3299f4cf443c9603f9120e431dbcb6ce8b8e26f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun May 18 10:53:34 2014 -0700 fixes for Sprite3D Adds copyright header removes compilation warnings cleans code a bit commit 1377787a4bcebdf349f9de0a05c329066c6eb626 Merge: f89725f 9a3c2d0 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 20:46:26 2014 -0700 Merge pull request #34 from dumganhar/pull/6731 fix compilation error of missing bind Mesh for luabindings. commit f89725f65ca604efb9abbcfe336c9d50135016b2 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 20:45:12 2014 -0700 use const & and changed typo commit 9a3c2d0df9abcd76292cc1f71b6615931aa807d5 Author: James Chen <jianhua.chen@cocos2d-x.org> Date: Sat May 17 11:43:10 2014 +0800 fix compilation error of missing bind Mesh for luabindings. commit 59524b3850b27342f3cb4c390751bdf97362a794 Merge: ee4ec94 5c5a6b9 Author: James Chen <jianhua.chen@cocos2d-x.org> Date: Sat May 17 11:33:01 2014 +0800 Merge commit 'refs/pull/6731/head' of git://github.com/cocos2d/cocos2d-x into pull/6731 commit 5c5a6b9bde410027db948b539bc3111dc243cf0b Merge: d4285e3 5f41732 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 20:23:58 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit d4285e336808699f828b82c6b90a83b1b0c0978c Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 20:22:49 2014 -0700 remove empty lines commit 5f4173271101e2411ffb6cbf600066e204df98d3 Merge: e272583 ac8cf25 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 20:15:44 2014 -0700 Merge pull request #33 from dabingnn/mesh3d_work Mesh3d work commit ac8cf2571d92b03c9632d0415078d08526322289 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 20:14:01 2014 -0700 added mesh3d file to template commit e272583cb8a7f41d8d74dbf7d7db71584187a779 Merge: 6a1b847 5d3a955 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 19:10:45 2014 -0700 Merge pull request #32 from dabingnn/mesh3d_work Mesh3d work commit 5d3a95543f66f7ec90bf06e6e1761722b8a33cca Merge: 4feae11 97cae73 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 18:18:13 2014 -0700 Merge branch 'v3' into mesh3d_work commit 6a1b847065a1b9d369892ab011478c47e80c9195 Merge: 4feae11 4ece4b3 Author: Trace0429 <yangtuo0429@gmail.com> Date: Fri May 16 17:15:39 2014 -0700 Merge pull request #31 from Trace0429/mesh3d_work windows work now commit 4ece4b3255d84f2749298fdbdecc5ad0302c36a3 Author: Trace0429 <yangtuo@chukong-inc.com> Date: Sat May 17 08:12:46 2014 +0800 windows work now commit 4feae11577f64c3aff943af51adc37dcb987bdc1 Merge: 510fc0c fdf82d3 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 16:32:58 2014 -0700 Merge pull request #30 from dabingnn/mesh3d_work Mesh3d work commit fdf82d36d97ab68fdb7bab54241fdd94f18a53eb Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 16:32:00 2014 -0700 fix compile error after merge (MAC can work) commit 4bef832c3f4d5e5f3c19ca36f13ceba9e4ff1dbe Merge: 510fc0c d19de29 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 16:24:11 2014 -0700 Merge branch 'v3' into mesh3d_work Conflicts: build/cocos2d_libs.xcodeproj/project.pbxproj cocos/2d/cocos2d.vcxproj cocos/2d/cocos2d.vcxproj.filters cocos/Android.mk cocos/CMakeLists.txt cocos/renderer/CMakeLists.txt commit 510fc0cea76bdedfae858bb930d98715ce54f7e9 Merge: e098ed7 7fea347 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 16:11:39 2014 -0700 Merge pull request #29 from dabingnn/mesh3d_work Mesh3d work commit 7fea34782f30ef0498a7a993016f45fcb786b771 Merge: a8a409a e098ed7 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 16:08:01 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit a8a409a7d5280b1075eb6258ee556611a5cba7b3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 16:05:37 2014 -0700 bind ARRAY_BUFFER and ELEMENT_ARRAY_BUFFER to 0 after draw commit e098ed7a5c187256be8313ec5d66294d3554c914 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 16:02:27 2014 -0700 bind buffer to 0 when finish draw commit d13f637a3777e81085e0285faf00105c58229d7c Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 14:00:38 2014 -0700 fix outline width commit 8a79c98b163ad862a2e09cbcc19a939f06556358 Merge: e208712 a0cf4ef Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 13:47:17 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit e20871233915f8b6010e59595c38793ec3d6956e Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 13:47:12 2014 -0700 make some member protected commit a0cf4efc48af801636a55d1c330fb6841896d33b Merge: c0b8902 8b723e8 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 13:06:17 2014 -0700 Merge branch 'mesh3d' of github.com:super626/cocos2d-x into mesh3d commit c0b89021cbbdb13db00b8844aac1f4ff9c90e968 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 13:04:27 2014 -0700 linux work now commit 8b723e82d81cbffd78e7378cab6d11df30baa044 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 12:48:34 2014 -0700 inc drawcall commit 5d0b6304b3e5c9bcb2354c3245511706438dc23c Merge: 1e7032b e783da9 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 12:31:44 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit e783da91fe6c14c8594d3da865e965256376dd10 Merge: 5da20fd 8f7a19a Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 12:31:31 2014 -0700 Merge pull request #28 from dabingnn/mesh3d_work Mesh3d work commit 1e7032b448bc79d76a445258f2b0c5bd6dba5fea Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 12:30:01 2014 -0700 optimize code commit 8f7a19a7b643ac63cbcd776095d6e8a2adb7ca64 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 12:29:37 2014 -0700 adjust code style commit 5da20fd2e75001451ec790f775fc4fe9cb87aa1b Merge: 659fbd6 553acfb Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 12:06:53 2014 -0700 Merge pull request #27 from dabingnn/mesh3d_work Mesh3d work commit 553acfb3ee685f5461a6d2a68779200abcca8670 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 12:06:02 2014 -0700 fix visual error for outline commit 659fbd652aa7f4c2d3629fe446051c3dd0377510 Merge: 056c3e1 c617bb7 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 11:54:54 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit 056c3e1394b9c1588395ac8a7f70db1e63c88c31 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 11:54:47 2014 -0700 fix shader, add multiple sprite to Sprite3DEffectTest commit c617bb74b6bc1e691ee488fd9ca43fa618710bfa Merge: 94d7896 7b19c56 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 11:33:31 2014 -0700 Merge pull request #26 from dabingnn/mesh3d_work Mesh3d work commit 7b19c564e4053ad883617873b11043df1fb98a45 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 11:30:34 2014 -0700 share the same glprogram in effect3DOutline commit 377d3bccd85dc566554c4fe7b529a9d0e82199e7 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 11:19:56 2014 -0700 add class static variable for EffectOutline commit d4913bf735dbc74a21bd8327af0b74325bbf9d1d Merge: 213bbb0 6837cea Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 11:07:04 2014 -0700 Merge branch 'v3' into mesh3d_work commit 213bbb0c289e579895e92620153b95a8cf374521 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 10:55:28 2014 -0700 add mesh.h in cocos2d.h commit 94d789610c9d4426b14e655a73197c652afc74f6 Merge: fa69e09 9af9da5 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 10:41:24 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit fa69e09ce0265b1fe3f4e76fa4dbc952abf17812 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 10:41:05 2014 -0700 remove namespace commit 9af9da50a91804d11537cffe0750e486cf95c8a5 Merge: ff15926 8a38a38 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Fri May 16 10:30:23 2014 -0700 Merge pull request #25 from dabingnn/mesh3d_work Mesh3d work commit 8a38a384742ba130946de8ad1759b61ed2f70495 Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 10:27:28 2014 -0700 remove redundant uniform CC_Texture0 commit db80bf7c7597fd20a1ca5e4ca89ad067b527f034 Merge: ff15926 511295e Author: Huabing.Xu <dabingnn@gmail.com> Date: Fri May 16 10:20:01 2014 -0700 Merge branch 'v3' into mesh3d_work commit ff15926f47edfbb1250440b060c1d887cfecd033 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 09:11:36 2014 -0700 warning more than one texture commit 5debbf8d6de4563361974b67aa52e572f7df9dd6 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Fri May 16 08:45:03 2014 -0700 remove redundant line commit ed357e7484a63bc3eb208d589943f802b7832e4d Merge: a1e2306 25dd07e Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 22:53:10 2014 -0700 Merge pull request #24 from dabingnn/mesh3d_work Mesh3d work commit 25dd07edb7005f593003e90120d6e6439686e5f6 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 22:52:33 2014 -0700 fix memory leak commit 945ae3444fc2d5eb7c6293960e9c11dfbc5b7cb3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 22:49:04 2014 -0700 remove unused member variable commit a1e23064140328f4c9bbe434383ca6f25fcb7548 Merge: bac54fc 712e816 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 22:37:16 2014 -0700 Merge pull request #23 from dabingnn/mesh3d_work Mesh3d work commit 712e81606f2782ac41276c1e8a87d32217ac9d28 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 22:35:48 2014 -0700 fix memory leak commit bac54fce097edd4040b0a7cd522d15644e6b482a Merge: 8ed28c4 54538e8 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 20:01:49 2014 -0700 Merge pull request #22 from dabingnn/mesh3d_work Mesh3d work commit 54538e89a2bf33ad6936130d1cbb3ef153db01a5 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 20:01:29 2014 -0700 android work now commit a6cc0f77875e045d169758adf0cde87360f41475 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 19:53:39 2014 -0700 remove sprite3dEffect include commit d8482fda09d414de76d1dc1a28c0d0b8bcc5aa32 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 19:50:17 2014 -0700 remove unused Sprite3dEffect commit c5e2d5579daca64b0e9394a2b07613352847eca8 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 19:48:12 2014 -0700 remove unused outline shader files commit 09a100cf388d80aa1389d96994ae189cbb0652b2 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 19:43:17 2014 -0700 fix error on IOS commit 8ed28c4854d0b51ed0251f09c27a5ce328599ad5 Merge: d23ffe3 c0e8ea2 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 18:47:37 2014 -0700 Merge pull request #21 from dabingnn/mesh3d_work Mesh3d work commit c0e8ea26ff29fc6a3cd04e7f9e122d4ea0a67e2c Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 18:46:54 2014 -0700 adjust indent, and line to the end of the file commit 661ceb72831d6eccfa522a09cedf994541af6f88 Merge: 8e764e7 d23ffe3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 18:35:18 2014 -0700 Merge branch 'mesh3d' into mesh3d_work Conflicts: cocos/3d/CCSprite3D.cpp cocos/3d/CCSprite3D.h tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp commit 8e764e74dd019852a0ef35b257895a7e79cd9a14 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 18:31:06 2014 -0700 add testCase for outline commit c2ced288851892299fd7258e51f32303959b374d Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 18:03:34 2014 -0700 extract base class Effect3D commit d23ffe3167476d10740df321e579bf647a3698d0 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 18:02:45 2014 -0700 RendeMeshData member rename commit fb8f25553cd317a277c1b924da2c11b9f3188666 Merge: 73cb4b4 819db70 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 17:57:29 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit 819db702d5ffa9461fc9d1d232cea7d373536664 Merge: 2676911 b408f43 Author: Trace0429 <yangtuo0429@gmail.com> Date: Thu May 15 17:54:24 2014 -0700 Merge pull request #20 from Trace0429/mesh3d_work Mesh3d work commit 73cb4b444b222d34e135b0d09b426b9c73c1b790 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 17:54:03 2014 -0700 android meshcommand commit b408f4343e47766416b19a583bc6bb5167439693 Author: Trace0429 <yangtuo@chukong-inc.com> Date: Fri May 16 08:50:38 2014 +0800 windows work now commit afbde9c25cfcdc4a6600a9e7607bc9489ea6b6f9 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 17:38:41 2014 -0700 raw EffectSprite commit 2676911bb71ef92b3d9cf198021169d9e4466525 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 16:37:20 2014 -0700 remove SpriteEffect from Sprite3D commit 83dc4cfc3609d14024c3966e49ee34bf36bbd77f Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 16:34:36 2014 -0700 raw effectSpriteTest commit 39e372ef2037090317c9c4a2287b06cadf83c9c5 Merge: 734633e 6d27912 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 16:14:57 2014 -0700 use meshcommand commit 734633ec1ffc66e590b2ad2da94f6477d78146f2 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 15:38:30 2014 -0700 use meshcommand commit 4ec56afaa9a660e8eaad6afe18ffded8ca858eb1 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 15:31:43 2014 -0700 comment out effect framework commit 6d27912f148e03acc07da3e3b4d0c565af8afefa Merge: d6f6f63 61a9011 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 15:11:25 2014 -0700 Merge pull request #19 from dabingnn/mesh3d_work Mesh3d work commit 61a9011d6c78ea6918664bb608dc51344e0236e5 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 14:55:06 2014 -0700 fix compile error in testcases commit 5f2f585bb8584590ecd3ebcefbb49de45b8f4bed Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 14:52:43 2014 -0700 fix compile error after merge with v3 commit 1a0de47740be51e586cc5615bc28e44ec8a1fc47 Merge: d6f6f63 760ee57 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 14:48:19 2014 -0700 Merge branch 'v3' into mesh3d_work commit d6f6f633927eb00df984ec4239555f9ce2c7e44d Merge: c6fbd6e 76d2523 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 14:26:40 2014 -0700 Merge pull request #18 from dabingnn/mesh3d_work Mesh3d work commit 76d2523ae735384533a1e37f06e370cb3481b0f2 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 14:25:40 2014 -0700 move 3d shaders to shader cache commit 9b68032c809dc6667ffd5c1af37b7ad4d84fe2de Merge: 2c9a573 c6fbd6e Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 13:56:00 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit 2c9a5738c2d24c33d4994e8e44e32fcc8d9ceece Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 13:55:49 2014 -0700 meshcommand commit 0631a51c5d9c0aae55447105b962a888e1158cd3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 13:21:36 2014 -0700 add mesh rebuild when come to foreground in android commit 8695016869ab56f3a046f488485f9fdfb6532417 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 13:13:59 2014 -0700 android work now commit c6fbd6e67d29b2fdfeed74f96de0ff5a6cdae1f5 Merge: cd7b235 0466a38 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 12:21:40 2014 -0700 Merge pull request #17 from dabingnn/mesh3d_work Mesh3d work commit 0466a38e77ca1bc6be09bf18b42a6290db8dace8 Merge: e349e4e cd7b235 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 12:19:24 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit e349e4e0a7047ed49c2bfa9b2e3e5cae5cbc8f67 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 12:18:49 2014 -0700 commit the changed IOS/MAC project file commit a7c9a65d5603622b1d40cc009dfceee60c376f50 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 12:17:57 2014 -0700 remove MeshPart commit cd7b235b5ec5b3ce21bc856888d383e6224fd047 Merge: e666045 3b7b406 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Thu May 15 11:03:54 2014 -0700 Merge pull request #16 from dabingnn/mesh3d_work Mesh3d work commit 3b7b406caff0b6f79fe044612a32e909f778d1e3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Thu May 15 10:59:10 2014 -0700 raw version of single Mesh commit e666045aa4768199c530f494f0a1fb402f2ce922 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 10:44:04 2014 -0700 fix outline commit 5d4f304c5f9e5b35dbb1d1176232ab5189c98c0e Author: yangxiao <yangxiao@cocos2d-x.org> Date: Thu May 15 10:09:45 2014 -0700 without normal no outline effect commit 3f6bd0ffbca804dd9ca6776c8cc2b37643911d63 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 22:39:03 2014 -0700 android listenBackToForeground commit 6bec670319ea154474c32c941c250bc3909a7e2e Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 21:58:09 2014 -0700 add boss1 with normal commit 35c1b8d5fcec188cbef92457e24721ae53820328 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 21:54:20 2014 -0700 change cache commit 076166fba142d5432bbadaf3e75d6c35bcb6905a Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 21:35:59 2014 -0700 depress no .mtl crash commit 498c9693a7e7009615382c5769b7493c3ff6be68 Merge: 8a63b49 d4fd946 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 15:58:50 2014 -0700 Merge branch 'mesh3d' of https://github.com/super626/cocos2d-x into mesh3d commit 8a63b4959cbb5e2b749d7f63f5b4ebe2bc5a6970 Merge: b4a8fee f395cc5 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 15:58:36 2014 -0700 merge dabingnn commit d4fd946fc8afdc95741f6a170e489d3dca9e2519 Merge: f395cc5 a17f074 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Wed May 14 15:53:58 2014 -0700 Merge pull request #15 from dabingnn/mesh3d_work Mesh3d work commit a17f074302d10ff03881cba7e634e094d31feb0a Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 15:52:58 2014 -0700 android can work now commit b4a8fee4b9735e16331a5656055572db9e551367 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 15:33:07 2014 -0700 refactoring render code commit f395cc50cdd8f2f15204ad9a126338d5c2fa72d2 Merge: f129e02 a2c12df Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Wed May 14 15:27:21 2014 -0700 Merge pull request #14 from dabingnn/mesh3d_work Mesh3d work commit a2c12df8d8908abe4dcb1a0c91711a28d9f05cac Merge: 1932e22 f129e02 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 15:26:19 2014 -0700 Merge branch 'mesh3d' of github.com:super626/cocos2d-x into mesh3d_work commit 1932e22962a79530adf583f24070efcee32251d3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 15:25:55 2014 -0700 android can compile now(can not work) commit f129e02ef21a0d44b8517c53d8c6bed0aaf85def Merge: ae2aa0d c0d9097 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Wed May 14 14:21:09 2014 -0700 Merge pull request #13 from dabingnn/mesh3d_work Mesh3d work commit c0d90973c2b87582e99966256c74dcdf23712d6a Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 14:15:16 2014 -0700 include Sprite3DEffect in the cocos2d header commit ae2aa0dd705bf1a961164f9059eec4e5c2281bb5 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 12:51:09 2014 -0700 outline sprite commit e7a542d9c95c145241314fc63fbe12ba0b80ec6a Merge: 1c76d4c 48e9f39 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 10:48:55 2014 -0700 meshvertexattrib work commit 1c76d4ca319c15dadd7243ce4230fa35dfb7a1bb Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 10:40:55 2014 -0700 use meshvertexattribute commit 48e9f3991dd7aafc90e99e1721d04f28d01f94e6 Merge: b70bf52 e0d87a9 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Wed May 14 09:41:57 2014 -0700 Merge pull request #12 from dabingnn/mesh3d_work Mesh3d work commit e0d87a99f42f808429917c8b586509ca75e8a5e2 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:40:14 2014 -0700 remove compile error commit c445e07c895fc2352f1220459d91f41f77690cd8 Merge: b70bf52 86fb75a Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:31:14 2014 -0700 Merge branch 'v3' into mesh3d_work commit b70bf522ef139da670cf41791a3d0ddad3dfa1cc Merge: da24c48 5a2127d Author: yangxiao <yangxiao@cocos2d-x.org> Date: Wed May 14 00:25:47 2014 -0700 vertex attrib commit da24c48c981029493900bcd2143495e546faa75e Author: yangxiao <yangxiao@cocos2d-x.org> Date: Tue May 13 23:49:09 2014 -0700 mesh vertex attribute commit 5a2127d718e6a9cb9f2ca3e1ac353ce1e5c0ebfd Merge: d98adb7 5148f76 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 19:06:38 2014 -0700 Merge pull request #11 from dabingnn/mesh3d_work Mesh3d work commit 5148f76c43bf1e3dc5a49ad6bf112d166d6b1c93 Merge: 02deb39 d98adb7 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 19:05:40 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit 02deb399314f01ec1222d78f2383a65614e33a34 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 19:04:15 2014 -0700 fix texcoord y flipped commit d98adb7d9d906f8376e45a2ba57bffc4e17e1775 Merge: 300eb4e 946283b Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 18:35:08 2014 -0700 Merge pull request #10 from dabingnn/mesh3d_work Mesh3d work commit 946283b83218de893c727dc9780291fe1683a4f9 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 18:22:16 2014 -0700 added blendFunc commit 300eb4e31783452cf16b77f85c3ef6f9dba19fc6 Merge: da7d6a0 ccc0baf Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 16:03:01 2014 -0700 Merge pull request #9 from dabingnn/mesh3d_work Mesh3d work commit ccc0bafd32b3375c2fe2163e0eb32714d06f8525 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 16:01:59 2014 -0700 fix compile error after merge commit 5bfc30b2b930131d23058d99a6862061c2217f38 Merge: da7d6a0 0171e27 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 15:56:46 2014 -0700 Merge branch 'v3' into mesh3d_work commit da7d6a087f22f4a11827ff3410fbcd2561f155fc Merge: 0caad32 f413b4e Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 14:19:24 2014 -0700 Merge pull request #8 from dabingnn/mesh3d_work Mesh3d work commit f413b4e55764d27863ae6978f1dbb2a0a3ca35e0 Merge: f47cfc6 0caad32 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 14:17:01 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit f47cfc67041ed4655a916623a6731876758a5182 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 14:15:06 2014 -0700 add new interface for createSprite3D commit 0caad32f2aa40c45e42d5d61c83419ee06e65a97 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Tue May 13 13:58:35 2014 -0700 default GLProgram to object commit 901ccef93593e2c39cca190784b4fc9684dfa9d0 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 13:13:24 2014 -0700 remove compile warning commit a6f9cdfcdd001d4486eb8206c3bd9d85e9fc9bc8 Merge: 68bdd0b 3eef54c Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 13:01:20 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit 68bdd0be68e3a11bb7bc5312e61ba5fb628c439b Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 12:59:59 2014 -0700 rename init->initWithFile in Sprite3D commit 3eef54ca06c83f72e248ce91fe639a8446ef1be5 Merge: f719f45 1c8773c Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 12:58:23 2014 -0700 Merge pull request #7 from super626/mesh3d_tmp Mesh3d commit 1c8773c53ff0bb87cb249d6392a900cd572dac1e Merge: 23e8786 f719f45 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Tue May 13 12:56:06 2014 -0700 Merge branch 'mesh3d_tmp' into mesh3d commit f719f45aba37791ffdfe107569350a1af94cbeb0 Merge: 6bd3f28 1b76467 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 11:59:46 2014 -0700 Merge pull request #6 from dabingnn/mesh3d_work Mesh3d work commit 1b7646759d9efcdf0942a42c0c22964a99309853 Merge: 6bd3f28 87adf9d Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 11:53:17 2014 -0700 Merge branch 'mesh3d' into mesh3d_work commit 87adf9df61e76f765f78a2bae4ec980ffb73ce57 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 11:52:41 2014 -0700 adjust line indent and header file define commit 23e8786892b89e25d1add091a7c3bc618990e579 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Tue May 13 11:44:22 2014 -0700 using vbo commit 6bd3f28440eca3530379b4610d6f87cc88eb54c5 Merge: 56fc0f4 a239a7e Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 11:42:10 2014 -0700 Merge pull request #5 from dabingnn/mesh3d_work Mesh3d work commit a239a7e35a82f497c337d96a025125b92c8daefd Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 11:39:06 2014 -0700 add CCSprite3d include into cocos2d.h commit 8d580c28a084c1dab2a5ce925871f3361e6b970a Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 11:33:18 2014 -0700 remove cocos2d.h include in Sprite3DTest.h commit 56fc0f4cbccb07cda972efda302ff6689b958ab2 Merge: ab16a26 8bb75e3 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Tue May 13 11:28:47 2014 -0700 Merge pull request #4 from dabingnn/mesh3d Mesh3d commit 8bb75e3dd96131da1c2dd9bc622d7bdbb2ad0514 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 11:26:40 2014 -0700 fix compile error after rename commit 230a73132c09c66b449efbacbc417974616694c6 Author: Huabing.Xu <dabingnn@gmail.com> Date: Tue May 13 11:07:30 2014 -0700 rename FileXXX to CCFileXXX commit ab16a26376f7deddf1a82f3085668e3fd9f09a12 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Tue May 13 10:52:36 2014 -0700 rename _model to _mesh commit 92ac7f75d06ad081282bbddcad5920a1f7584264 Merge: 6b911b5 df147d1 Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Mon May 12 22:23:59 2014 -0700 Merge pull request #3 from dabingnn/mesh3d Mesh3d commit df147d14ddb8e61d907a44c6f03f404c8a68103f Author: Huabing.Xu <dabingnn@gmail.com> Date: Mon May 12 22:21:22 2014 -0700 fix retain/release in sprite3D commit 0b38939fd79168699ab737a8dc8e97c9417cf4ce Author: Huabing.Xu <dabingnn@gmail.com> Date: Mon May 12 20:04:16 2014 -0700 remove compile warnings commit 090f81b8198d18bc0b31bbba28c3e2e6d73e9f92 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Mon May 12 19:16:25 2014 -0700 using glprogramstate work ok commit 0b4f36a964c28f5f4b3224522f27402e0efbe123 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Mon May 12 18:38:52 2014 -0700 add obj commit e8917d7427f3ff0e7c3d874b908e0058adecf2f7 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Mon May 12 18:33:23 2014 -0700 use glprogramstate commit 6b911b52c86cd79e1fd3efc0536a5ca7ab04ab7a Author: yangxiao <yangxiao@cocos2d-x.org> Date: Mon May 12 13:01:56 2014 -0700 sprite3d commit 2a490c344f2db27d467506cf28c910410bb892e6 Merge: 23a5232 01b015d Author: Huabing.Xu <huabing.xu@cocos2d-x.org> Date: Mon May 12 10:52:17 2014 -0700 Merge pull request #1 from dabingnn/newcode Newcode commit 01b015d1238c89b6837ea276a95ce359cf0da5a7 Merge: 23a5232 5d24b3d Author: Huabing.Xu <dabingnn@gmail.com> Date: Mon May 12 10:50:14 2014 -0700 Merge branch 'v3' into newcode commit 23a5232fe5bb4c0b0bc821d1945426486dafe253 Author: yangxiao <yangxiao@cocos2d-x.org> Date: Mon May 12 09:44:41 2014 -0700 3d mesh initial code
2014-05-19 05:49:16 +08:00
#include "renderer/CCMeshCommand.h"
Squashed commit of the following: commit c16dcfaaea0922039aad05bce1f4efed18e04871 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 19:05:18 2014 -0700 more linux fixes commit 1553795976c9090a1b46deb53d12910fe0676008 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 19:04:04 2014 -0700 more linux fixes commit 1e43a8cabff33cbf25aa5eb5412f53a878222d83 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 19:02:07 2014 -0700 fixes linux isuses commit 723a445dd6411f91846da2b801248ad8298174f1 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:58:50 2014 -0700 more linux fixes commit 533c8025e794fc76cef02f396b3a93b3d7f4cfc8 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:57:33 2014 -0700 more linux fixes commit 4ba1e84959670bcbf044f18d1c0d4b3cb3be4090 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:53:43 2014 -0700 more linux fixes commit 1f8e011f306a47ed4134224e5e349929201f0539 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:49:28 2014 -0700 more linux fixes commit 3e2033100822ff6d532a1b4f012337491dc11920 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:47:43 2014 -0700 more linux fixes commit 2e708863c75fd032f1b2396dfdf1d31f7a62b713 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:46:00 2014 -0700 more linux fixes commit 861b5b92a6efd4de7b926c20d636ce9d749b293f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:43:15 2014 -0700 more linux fixes commit 2a43365a0c1755e9b9cada53301be1a20adb31cf Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:36:06 2014 -0700 more fixes for linux commit 7d332bf911892f87c7824d2a5da7bf73ce7ec411 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:35:29 2014 -0700 more fixes for linux commit f1becc17d3316dfe3678c23c9dcedb7a447d9235 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:34:44 2014 -0700 more fixes for linux commit d2e5959bb0dde921dd5e73be1d8acc3b3f50e51d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:33:45 2014 -0700 fixes for linux commit ad9b633c352107cf0e8b060a0e23d6e6a3f5e80f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:16:48 2014 -0700 compiles on Windows commit 4425ee8e5de8f42a2d6050e4470109600dce8b5d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Apr 30 18:07:20 2014 -0700 fix builder
2014-05-01 10:09:13 +08:00
#include "base/CCConfiguration.h"
2014-04-30 08:37:36 +08:00
#include "base/CCDirector.h"
#include "base/CCEventDispatcher.h"
#include "base/CCEventListenerCustom.h"
#include "base/CCEventType.h"
#include "2d/CCCamera.h"
2014-08-27 12:09:23 +08:00
#include "2d/CCScene.h"
2014-04-15 07:46:19 +08:00
NS_CC_BEGIN
2014-04-15 07:46:19 +08:00
// helper
static bool compareRenderCommand(RenderCommand* a, RenderCommand* b)
{
return a->getGlobalOrder() < b->getGlobalOrder();
}
2015-01-12 14:20:41 +08:00
static bool compare3DCommand(RenderCommand* a, RenderCommand* b)
{
return a->getDepth() > b->getDepth();
2015-01-12 14:20:41 +08:00
}
2014-04-15 07:46:19 +08:00
// queue
void RenderQueue::push_back(RenderCommand* command)
{
float z = command->getGlobalOrder();
if(z < 0)
2015-01-12 14:20:41 +08:00
{
_commands[QUEUE_GROUP::GLOBALZ_NEG].push_back(command);
}
else if(z > 0)
{
_commands[QUEUE_GROUP::GLOBALZ_POS].push_back(command);
}
else
{
if(command->is3D())
2015-01-12 14:20:41 +08:00
{
if(command->isTransparent())
{
_commands[QUEUE_GROUP::TRANSPARENT_3D].push_back(command);
}
else
{
_commands[QUEUE_GROUP::OPAQUE_3D].push_back(command);
}
2015-01-12 14:20:41 +08:00
}
else
{
_commands[QUEUE_GROUP::GLOBALZ_ZERO].push_back(command);
2015-01-12 14:20:41 +08:00
}
}
}
ssize_t RenderQueue::size() const
{
ssize_t result(0);
for(int index = 0; index < QUEUE_GROUP::QUEUE_COUNT; ++index)
{
result += _commands[index].size();
}
return result;
}
void RenderQueue::sort()
{
// Don't sort _queue0, it already comes sorted
std::sort(std::begin(_commands[QUEUE_GROUP::TRANSPARENT_3D]), std::end(_commands[QUEUE_GROUP::TRANSPARENT_3D]), compare3DCommand);
std::sort(std::begin(_commands[QUEUE_GROUP::GLOBALZ_NEG]), std::end(_commands[QUEUE_GROUP::GLOBALZ_NEG]), compareRenderCommand);
std::sort(std::begin(_commands[QUEUE_GROUP::GLOBALZ_POS]), std::end(_commands[QUEUE_GROUP::GLOBALZ_POS]), compareRenderCommand);
}
RenderCommand* RenderQueue::operator[](ssize_t index) const
{
for(int queIndex = 0; queIndex < QUEUE_GROUP::QUEUE_COUNT; ++queIndex)
{
if(index < static_cast<ssize_t>(_commands[queIndex].size()))
return _commands[queIndex][index];
else
{
index -= _commands[queIndex].size();
}
}
2015-01-12 14:20:41 +08:00
CCASSERT(false, "invalid index");
return nullptr;
}
void RenderQueue::clear()
{
_commands.clear();
2015-01-28 03:12:51 +08:00
for(int index = 0; index < QUEUE_COUNT; ++index)
{
_commands.push_back(std::vector<RenderCommand*>());
}
}
2015-01-27 08:37:11 +08:00
void RenderQueue::saveRenderState()
{
_isDepthEnabled = glIsEnabled(GL_DEPTH_TEST);
_isCullEnabled = glIsEnabled(GL_CULL_FACE);
glGetBooleanv(GL_DEPTH_WRITEMASK, &_isDepthWrite);
CHECK_GL_ERROR_DEBUG();
}
void RenderQueue::restoreRenderState()
{
if (_isCullEnabled)
{
glEnable(GL_CULL_FACE);
}
else
{
glDisable(GL_CULL_FACE);
}
if (_isDepthEnabled)
{
glEnable(GL_DEPTH_TEST);
}
else
{
glDisable(GL_DEPTH_TEST);
}
glDepthMask(_isDepthWrite);
CHECK_GL_ERROR_DEBUG();
}
//
//
//
2014-04-15 07:46:19 +08:00
static const int DEFAULT_RENDER_QUEUE = 0;
2014-04-15 07:46:19 +08:00
//
// constructors, destructors, init
//
Renderer::Renderer()
:_lastMaterialID(0)
2014-06-23 23:58:45 +08:00
,_lastBatchedMeshCommand(nullptr)
2014-08-27 14:54:35 +08:00
,_filledVertex(0)
,_filledIndex(0)
2014-10-16 15:33:31 +08:00
,_numberQuads(0)
,_glViewAssigned(false)
,_isRendering(false)
2015-01-16 08:41:07 +08:00
,_isDepthTestFor2D(false)
#if CC_ENABLE_CACHE_TEXTURE_DATA
,_cacheTextureListener(nullptr)
#endif
2013-11-08 07:48:37 +08:00
{
_groupCommandManager = new (std::nothrow) GroupCommandManager();
_commandGroupStack.push(DEFAULT_RENDER_QUEUE);
2013-11-14 09:31:12 +08:00
RenderQueue defaultRenderQueue;
_renderGroups.push_back(defaultRenderQueue);
_batchedCommands.reserve(BATCH_QUADCOMMAND_RESEVER_SIZE);
2015-01-10 06:06:21 +08:00
// default clear color
_clearColor = Color4F::BLACK;
2013-11-08 07:48:37 +08:00
}
Renderer::~Renderer()
{
2013-11-14 09:31:12 +08:00
_renderGroups.clear();
_groupCommandManager->release();
glDeleteBuffers(2, _buffersVBO);
glDeleteBuffers(2, _quadbuffersVBO);
2013-12-05 09:02:02 +08:00
if (Configuration::getInstance()->supportsShareableVAO())
{
glDeleteVertexArrays(1, &_buffersVAO);
2013-11-23 02:24:52 +08:00
glDeleteVertexArrays(1, &_quadVAO);
GL::bindVAO(0);
2013-12-05 09:02:02 +08:00
}
#if CC_ENABLE_CACHE_TEXTURE_DATA
Director::getInstance()->getEventDispatcher()->removeEventListener(_cacheTextureListener);
#endif
2013-11-08 08:50:53 +08:00
}
void Renderer::initGLView()
{
#if CC_ENABLE_CACHE_TEXTURE_DATA
_cacheTextureListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom* event){
/** listen the event that renderer was recreated on Android/WP8 */
this->setupBuffer();
});
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_cacheTextureListener, -1);
2013-12-05 09:02:02 +08:00
#endif
//setup index data for quads
for( int i=0; i < VBO_SIZE/4; i++)
{
_quadIndices[i*6+0] = (GLushort) (i*4+0);
_quadIndices[i*6+1] = (GLushort) (i*4+1);
_quadIndices[i*6+2] = (GLushort) (i*4+2);
_quadIndices[i*6+3] = (GLushort) (i*4+3);
_quadIndices[i*6+4] = (GLushort) (i*4+2);
_quadIndices[i*6+5] = (GLushort) (i*4+1);
}
2013-12-05 09:02:02 +08:00
setupBuffer();
_glViewAssigned = true;
2013-11-08 08:50:53 +08:00
}
2013-12-05 09:02:02 +08:00
void Renderer::setupBuffer()
{
if(Configuration::getInstance()->supportsShareableVAO())
{
setupVBOAndVAO();
}
else
{
setupVBO();
}
}
2013-11-08 08:50:53 +08:00
void Renderer::setupVBOAndVAO()
{
//generate vbo and vao for trianglesCommand
glGenVertexArrays(1, &_buffersVAO);
GL::bindVAO(_buffersVAO);
2013-11-08 08:50:53 +08:00
glGenBuffers(2, &_buffersVBO[0]);
glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
2014-08-27 14:54:35 +08:00
glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * VBO_SIZE, _verts, GL_DYNAMIC_DRAW);
2013-11-08 08:50:53 +08:00
// vertices
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, vertices));
// colors
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, colors));
// tex coords
2014-05-09 03:34:26 +08:00
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_TEX_COORD);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, texCoords));
2013-11-08 08:50:53 +08:00
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]);
2014-08-27 14:54:35 +08:00
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * INDEX_VBO_SIZE, _indices, GL_STATIC_DRAW);
2013-11-08 08:50:53 +08:00
// Must unbind the VAO before changing the element buffer.
GL::bindVAO(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//generate vbo and vao for quadCommand
glGenVertexArrays(1, &_quadVAO);
GL::bindVAO(_quadVAO);
glGenBuffers(2, &_quadbuffersVBO[0]);
glBindBuffer(GL_ARRAY_BUFFER, _quadbuffersVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[0]) * VBO_SIZE, _quadVerts, GL_DYNAMIC_DRAW);
// vertices
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, vertices));
// colors
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, colors));
// tex coords
glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_TEX_COORD);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), (GLvoid*) offsetof( V3F_C4B_T2F, texCoords));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _quadbuffersVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_quadIndices[0]) * INDEX_VBO_SIZE, _quadIndices, GL_STATIC_DRAW);
// Must unbind the VAO before changing the element buffer.
GL::bindVAO(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
2013-11-08 08:50:53 +08:00
CHECK_GL_ERROR_DEBUG();
}
2013-12-05 09:02:02 +08:00
void Renderer::setupVBO()
{
glGenBuffers(2, &_buffersVBO[0]);
2014-10-16 15:33:31 +08:00
glGenBuffers(2, &_quadbuffersVBO[0]);
2013-12-05 09:02:02 +08:00
mapBuffers();
}
void Renderer::mapBuffers()
{
// Avoid changing the element buffer for whatever VAO might be bound.
GL::bindVAO(0);
glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
2014-08-27 14:54:35 +08:00
glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * VBO_SIZE, _verts, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, _quadbuffersVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[0]) * VBO_SIZE, _quadVerts, GL_DYNAMIC_DRAW);
2013-12-05 09:02:02 +08:00
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]);
2014-08-27 14:54:35 +08:00
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * INDEX_VBO_SIZE, _indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _quadbuffersVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_quadIndices[0]) * INDEX_VBO_SIZE, _quadIndices, GL_STATIC_DRAW);
2013-12-05 09:02:02 +08:00
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
CHECK_GL_ERROR_DEBUG();
}
2013-11-16 09:32:29 +08:00
void Renderer::addCommand(RenderCommand* command)
{
int renderQueue =_commandGroupStack.top();
addCommand(command, renderQueue);
2013-11-16 09:32:29 +08:00
}
void Renderer::addCommand(RenderCommand* command, int renderQueue)
{
CCASSERT(!_isRendering, "Cannot add command while rendering");
CCASSERT(renderQueue >=0, "Invalid render queue");
CCASSERT(command->getType() != RenderCommand::Type::UNKNOWN_COMMAND, "Invalid Command Type");
_renderGroups[renderQueue].push_back(command);
2014-08-27 17:53:46 +08:00
}
void Renderer::pushGroup(int renderQueueID)
{
2014-04-11 16:07:55 +08:00
CCASSERT(!_isRendering, "Cannot change render queue while rendering");
_commandGroupStack.push(renderQueueID);
}
void Renderer::popGroup()
{
2014-04-11 16:07:55 +08:00
CCASSERT(!_isRendering, "Cannot change render queue while rendering");
_commandGroupStack.pop();
}
2013-11-16 03:29:11 +08:00
int Renderer::createRenderQueue()
{
RenderQueue newRenderQueue;
_renderGroups.push_back(newRenderQueue);
return (int)_renderGroups.size() - 1;
2013-11-16 03:29:11 +08:00
}
2015-01-12 14:20:41 +08:00
void Renderer::processRenderCommand(RenderCommand* command)
{
2015-01-12 14:20:41 +08:00
auto commandType = command->getType();
if( RenderCommand::Type::TRIANGLES_COMMAND == commandType)
{
2015-01-12 14:20:41 +08:00
//Draw if we have batched other commands which are not triangle command
flush3D();
flushQuads();
//Process triangle command
auto cmd = static_cast<TrianglesCommand*>(command);
//Draw batched Triangles if necessary
if(cmd->isSkipBatching() || _filledVertex + cmd->getVertexCount() > VBO_SIZE || _filledIndex + cmd->getIndexCount() > INDEX_VBO_SIZE)
{
2015-01-12 14:20:41 +08:00
CCASSERT(cmd->getVertexCount()>= 0 && cmd->getVertexCount() < VBO_SIZE, "VBO for vertex is not big enough, please break the data down or use customized render command");
CCASSERT(cmd->getIndexCount()>= 0 && cmd->getIndexCount() < INDEX_VBO_SIZE, "VBO for index is not big enough, please break the data down or use customized render command");
//Draw batched Triangles if VBO is full
drawBatchedTriangles();
}
//Batch Triangles
_batchedCommands.push_back(cmd);
fillVerticesAndIndices(cmd);
if(cmd->isSkipBatching())
{
drawBatchedTriangles();
}
}
else if ( RenderCommand::Type::QUAD_COMMAND == commandType )
{
//Draw if we have batched other commands which are not quad command
flush3D();
flushTriangles();
//Process quad command
auto cmd = static_cast<QuadCommand*>(command);
//Draw batched quads if necessary
if(cmd->isSkipBatching()|| (_numberQuads + cmd->getQuadCount()) * 4 > VBO_SIZE )
{
CCASSERT(cmd->getQuadCount()>= 0 && cmd->getQuadCount() * 4 < VBO_SIZE, "VBO for vertex is not big enough, please break the data down or use customized render command");
//Draw batched quads if VBO is full
drawBatchedQuads();
}
2015-01-12 14:20:41 +08:00
//Batch Quads
_batchQuadCommands.push_back(cmd);
fillQuads(cmd);
if(cmd->isSkipBatching())
{
drawBatchedQuads();
}
}
else if (RenderCommand::Type::MESH_COMMAND == commandType)
{
flush2D();
auto cmd = static_cast<MeshCommand*>(command);
if (cmd->isSkipBatching() || _lastBatchedMeshCommand == nullptr || _lastBatchedMeshCommand->getMaterialID() != cmd->getMaterialID())
{
flush3D();
2015-01-10 06:06:21 +08:00
if(cmd->isSkipBatching())
{
2015-01-12 14:20:41 +08:00
cmd->execute();
2015-01-10 06:06:21 +08:00
}
else
{
2015-01-12 14:20:41 +08:00
cmd->preBatchDraw();
2015-01-10 06:06:21 +08:00
cmd->batchDraw();
2015-01-12 14:20:41 +08:00
_lastBatchedMeshCommand = cmd;
2015-01-10 06:06:21 +08:00
}
}
else
{
2015-01-12 14:20:41 +08:00
cmd->batchDraw();
}
}
2015-01-12 14:20:41 +08:00
else if(RenderCommand::Type::GROUP_COMMAND == commandType)
{
flush();
int renderQueueID = ((GroupCommand*) command)->getRenderQueueID();
visitRenderQueue(_renderGroups[renderQueueID]);
}
else if(RenderCommand::Type::CUSTOM_COMMAND == commandType)
{
flush();
auto cmd = static_cast<CustomCommand*>(command);
cmd->execute();
}
else if(RenderCommand::Type::BATCH_COMMAND == commandType)
{
flush();
auto cmd = static_cast<BatchCommand*>(command);
cmd->execute();
}
else if(RenderCommand::Type::PRIMITIVE_COMMAND == commandType)
{
flush();
auto cmd = static_cast<PrimitiveCommand*>(command);
cmd->execute();
}
else
{
CCLOGERROR("Unknown commands in renderQueue");
}
}
2015-01-27 08:37:11 +08:00
void Renderer::visitRenderQueue(RenderQueue& queue)
2015-01-12 14:20:41 +08:00
{
2015-01-27 08:37:11 +08:00
queue.saveRenderState();
2015-01-28 06:41:16 +08:00
//
//Process Global-Z < 0 Objects
//
2015-01-28 10:59:29 +08:00
const auto& zNegQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::GLOBALZ_NEG);
2015-01-28 06:41:16 +08:00
if (zNegQueue.size() > 0)
{
2015-01-28 06:41:16 +08:00
if(_isDepthTestFor2D)
{
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
}
else
{
glDisable(GL_DEPTH_TEST);
glDepthMask(false);
}
for (auto it = zNegQueue.cbegin(); it != zNegQueue.cend(); ++it)
{
processRenderCommand(*it);
}
flush();
}
2015-01-28 06:41:16 +08:00
//
2015-01-12 14:20:41 +08:00
//Process Opaque Object
2015-01-28 06:41:16 +08:00
//
2015-01-28 10:59:29 +08:00
const auto& opaqueQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::OPAQUE_3D);
2015-01-12 14:20:41 +08:00
if (opaqueQueue.size() > 0)
{
//Clear depth to achieve layered rendering
2015-01-12 14:20:41 +08:00
glDepthMask(true);
glEnable(GL_DEPTH_TEST);
2015-01-28 06:41:16 +08:00
for (auto it = opaqueQueue.cbegin(); it != opaqueQueue.cend(); ++it)
{
2015-01-12 14:20:41 +08:00
processRenderCommand(*it);
}
2015-01-28 06:41:16 +08:00
flush();
2015-01-12 14:20:41 +08:00
}
2015-01-28 06:41:16 +08:00
//
//Process 3D Transparent object
//
2015-01-28 10:59:29 +08:00
const auto& transQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::TRANSPARENT_3D);
2015-01-28 06:41:16 +08:00
if (transQueue.size() > 0)
2015-01-12 14:20:41 +08:00
{
glEnable(GL_DEPTH_TEST);
2015-01-28 06:41:16 +08:00
glDepthMask(false);
for (auto it = transQueue.cbegin(); it != transQueue.cend(); ++it)
{
processRenderCommand(*it);
}
flush();
2015-01-12 14:20:41 +08:00
}
2015-01-28 06:41:16 +08:00
//
//Process Global-Z = 0 Queue
//
2015-01-28 10:59:29 +08:00
const auto& zZeroQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::GLOBALZ_ZERO);
2015-01-28 06:41:16 +08:00
if (zZeroQueue.size() > 0)
2015-01-16 08:41:07 +08:00
{
2015-01-28 06:41:16 +08:00
if(_isDepthTestFor2D)
{
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
}
else
{
glDisable(GL_DEPTH_TEST);
glDepthMask(false);
}
for (auto it = zZeroQueue.cbegin(); it != zZeroQueue.cend(); ++it)
{
processRenderCommand(*it);
}
flush();
2015-01-16 08:41:07 +08:00
}
2015-01-28 06:41:16 +08:00
//
//Process Global-Z > 0 Queue
//
2015-01-28 10:59:29 +08:00
const auto& zPosQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::GLOBALZ_POS);
2015-01-28 06:41:16 +08:00
if (zPosQueue.size() > 0)
2015-01-12 14:20:41 +08:00
{
2015-01-28 06:41:16 +08:00
for (auto it = zPosQueue.cbegin(); it != zPosQueue.cend(); ++it)
{
processRenderCommand(*it);
}
flush();
2015-01-12 14:20:41 +08:00
}
2015-01-27 08:37:11 +08:00
queue.restoreRenderState();
}
void Renderer::render()
{
2013-11-07 06:57:42 +08:00
//Uncomment this once everything is rendered by new renderer
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//TODO: setup camera or MVP
_isRendering = true;
if (_glViewAssigned)
2013-11-14 09:31:12 +08:00
{
//Process render commands
//1. Sort render commands based on ID
for (auto &renderqueue : _renderGroups)
2013-11-14 09:31:12 +08:00
{
renderqueue.sort();
}
visitRenderQueue(_renderGroups[0]);
2013-11-14 09:31:12 +08:00
}
clean();
_isRendering = false;
}
void Renderer::clean()
{
// Clear render group
2013-11-15 02:35:28 +08:00
for (size_t j = 0 ; j < _renderGroups.size(); j++)
{
//commands are owned by nodes
// for (const auto &cmd : _renderGroups[j])
// {
// cmd->releaseToCommandPool();
// }
2013-11-15 02:35:28 +08:00
_renderGroups[j].clear();
2013-11-11 16:14:29 +08:00
}
2014-10-16 14:56:17 +08:00
// Clear batch commands
_batchedCommands.clear();
_batchQuadCommands.clear();
2014-08-27 14:54:35 +08:00
_filledVertex = 0;
_filledIndex = 0;
_numberQuads = 0;
2013-11-11 16:14:29 +08:00
_lastMaterialID = 0;
2014-06-23 23:58:45 +08:00
_lastBatchedMeshCommand = nullptr;
2013-11-11 16:14:29 +08:00
}
2013-11-09 04:06:39 +08:00
2015-01-10 06:06:21 +08:00
void Renderer::clear()
{
2015-01-12 14:20:41 +08:00
//Enable Depth mask to make sure glClear clear the depth buffer correctly
2015-01-10 06:06:21 +08:00
glDepthMask(true);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(false);
}
2015-01-16 08:54:27 +08:00
void Renderer::setDepthTest(bool enable)
{
if (enable)
{
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
// glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
else
{
glDisable(GL_DEPTH_TEST);
}
_isDepthTestFor2D = enable;
CHECK_GL_ERROR_DEBUG();
}
2015-01-12 14:20:41 +08:00
void Renderer::fillVerticesAndIndices(const TrianglesCommand* cmd)
{
memcpy(_verts + _filledVertex, cmd->getVertices(), sizeof(V3F_C4B_T2F) * cmd->getVertexCount());
2014-08-27 16:43:14 +08:00
const Mat4& modelView = cmd->getModelView();
for(ssize_t i=0; i< cmd->getVertexCount(); ++i)
{
2014-08-27 16:43:14 +08:00
V3F_C4B_T2F *q = &_verts[i + _filledVertex];
2014-08-27 14:54:35 +08:00
Vec3 *vec1 = (Vec3*)&q->vertices;
modelView.transformPoint(vec1);
}
2014-08-27 16:43:14 +08:00
const unsigned short* indices = cmd->getIndices();
2014-08-27 16:43:14 +08:00
//fill index
for(ssize_t i=0; i< cmd->getIndexCount(); ++i)
2014-08-27 16:43:14 +08:00
{
_indices[_filledIndex + i] = _filledVertex + indices[i];
2014-08-27 16:43:14 +08:00
}
_filledVertex += cmd->getVertexCount();
_filledIndex += cmd->getIndexCount();
}
void Renderer::fillQuads(const QuadCommand *cmd)
{
const Mat4& modelView = cmd->getModelView();
2014-12-30 15:07:50 +08:00
const V3F_C4B_T2F* quads = (V3F_C4B_T2F*)cmd->getQuads();
for(ssize_t i=0; i< cmd->getQuadCount() * 4; ++i)
{
2014-12-30 15:07:50 +08:00
_quadVerts[i + _numberQuads * 4] = quads[i];
modelView.transformPoint(quads[i].vertices,&(_quadVerts[i + _numberQuads * 4].vertices));
}
_numberQuads += cmd->getQuadCount();
}
void Renderer::drawBatchedTriangles()
2013-11-11 16:14:29 +08:00
{
//TODO: we can improve the draw performance by insert material switching command before hand.
2013-11-14 02:26:26 +08:00
2014-08-27 16:43:14 +08:00
int indexToDraw = 0;
int startIndex = 0;
2013-11-11 16:14:29 +08:00
//Upload buffer to VBO
if(_filledVertex <= 0 || _filledIndex <= 0 || _batchedCommands.empty())
2013-11-19 07:52:47 +08:00
{
2013-11-11 16:14:29 +08:00
return;
2013-11-19 07:52:47 +08:00
}
2013-11-11 16:14:29 +08:00
2013-12-05 09:02:02 +08:00
if (Configuration::getInstance()->supportsShareableVAO())
{
2014-08-27 14:54:35 +08:00
//Bind VAO
GL::bindVAO(_buffersVAO);
2013-12-05 09:02:02 +08:00
//Set VBO data
glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
2013-11-11 16:14:29 +08:00
// option 1: subdata
// glBufferSubData(GL_ARRAY_BUFFER, sizeof(_quads[0])*start, sizeof(_quads[0]) * n , &_quads[start] );
// option 2: data
// glBufferData(GL_ARRAY_BUFFER, sizeof(quads_[0]) * (n-start), &quads_[start], GL_DYNAMIC_DRAW);
// option 3: orphaning + glMapBuffer
2014-08-27 14:54:35 +08:00
glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * _filledVertex, nullptr, GL_DYNAMIC_DRAW);
2013-12-05 09:02:02 +08:00
void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
2014-08-27 14:54:35 +08:00
memcpy(buf, _verts, sizeof(_verts[0])* _filledVertex);
2013-12-05 09:02:02 +08:00
glUnmapBuffer(GL_ARRAY_BUFFER);
2013-11-11 16:14:29 +08:00
2013-12-05 09:02:02 +08:00
glBindBuffer(GL_ARRAY_BUFFER, 0);
2014-08-27 14:54:35 +08:00
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * _filledIndex, _indices, GL_STATIC_DRAW);
2013-12-05 09:02:02 +08:00
}
else
{
2014-08-27 14:54:35 +08:00
#define kQuadSize sizeof(_verts[0])
2013-12-05 09:02:02 +08:00
glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
2014-08-27 14:54:35 +08:00
glBufferData(GL_ARRAY_BUFFER, sizeof(_verts[0]) * _filledVertex , _verts, GL_DYNAMIC_DRAW);
2013-12-05 09:02:02 +08:00
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);
// vertices
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, vertices));
// colors
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, colors));
// tex coords
2014-05-09 03:34:26 +08:00
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, texCoords));
2013-12-05 09:02:02 +08:00
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]);
2014-08-27 14:54:35 +08:00
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_indices[0]) * _filledIndex, _indices, GL_STATIC_DRAW);
2013-12-05 09:02:02 +08:00
}
2013-11-11 16:14:29 +08:00
2013-11-12 03:54:08 +08:00
//Start drawing verties in batch
for(const auto& cmd : _batchedCommands)
2013-11-11 16:14:29 +08:00
{
auto newMaterialID = cmd->getMaterialID();
if(_lastMaterialID != newMaterialID || newMaterialID == MATERIAL_ID_DO_NOT_BATCH)
2013-11-11 16:14:29 +08:00
{
//Draw quads
2014-08-27 16:43:14 +08:00
if(indexToDraw > 0)
2013-11-09 04:06:39 +08:00
{
2014-08-27 16:43:14 +08:00
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) );
_drawnBatches++;
2014-08-27 16:43:14 +08:00
_drawnVertices += indexToDraw;
2013-11-09 04:06:39 +08:00
2014-08-27 16:43:14 +08:00
startIndex += indexToDraw;
indexToDraw = 0;
2013-11-09 04:06:39 +08:00
}
//Use new material
cmd->useMaterial();
_lastMaterialID = newMaterialID;
2013-11-11 16:14:29 +08:00
}
indexToDraw += cmd->getIndexCount();
}
2014-10-16 14:56:17 +08:00
//Draw any remaining triangles
2014-08-27 16:43:14 +08:00
if(indexToDraw > 0)
2013-11-12 03:54:08 +08:00
{
2014-08-27 16:43:14 +08:00
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) );
_drawnBatches++;
2014-08-27 16:43:14 +08:00
_drawnVertices += indexToDraw;
2013-11-12 03:54:08 +08:00
}
2013-11-08 07:48:37 +08:00
2013-12-05 09:02:02 +08:00
if (Configuration::getInstance()->supportsShareableVAO())
{
//Unbind VAO
GL::bindVAO(0);
}
else
{
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
_batchedCommands.clear();
2014-08-27 14:54:35 +08:00
_filledVertex = 0;
_filledIndex = 0;
2013-11-08 07:48:37 +08:00
}
void Renderer::drawBatchedQuads()
{
//TODO: we can improve the draw performance by insert material switching command before hand.
int indexToDraw = 0;
int startIndex = 0;
//Upload buffer to VBO
if(_numberQuads <= 0 || _batchQuadCommands.empty())
{
return;
}
if (Configuration::getInstance()->supportsShareableVAO())
{
//Bind VAO
GL::bindVAO(_quadVAO);
//Set VBO data
glBindBuffer(GL_ARRAY_BUFFER, _quadbuffersVBO[0]);
// option 1: subdata
// glBufferSubData(GL_ARRAY_BUFFER, sizeof(_quads[0])*start, sizeof(_quads[0]) * n , &_quads[start] );
// option 2: data
// glBufferData(GL_ARRAY_BUFFER, sizeof(quads_[0]) * (n-start), &quads_[start], GL_DYNAMIC_DRAW);
// option 3: orphaning + glMapBuffer
glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[0]) * _numberQuads * 4, nullptr, GL_DYNAMIC_DRAW);
void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(buf, _quadVerts, sizeof(_quadVerts[0])* _numberQuads * 4);
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _quadbuffersVBO[1]);
}
else
{
#define kQuadSize sizeof(_verts[0])
glBindBuffer(GL_ARRAY_BUFFER, _quadbuffersVBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[0]) * _numberQuads * 4 , _quadVerts, GL_DYNAMIC_DRAW);
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);
// vertices
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, vertices));
// colors
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, colors));
// tex coords
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(V3F_C4B_T2F, texCoords));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _quadbuffersVBO[1]);
}
//Start drawing verties in batch
for(const auto& cmd : _batchQuadCommands)
{
auto newMaterialID = cmd->getMaterialID();
if(_lastMaterialID != newMaterialID || newMaterialID == MATERIAL_ID_DO_NOT_BATCH)
{
//Draw quads
if(indexToDraw > 0)
{
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) );
_drawnBatches++;
_drawnVertices += indexToDraw;
startIndex += indexToDraw;
indexToDraw = 0;
}
//Use new material
cmd->useMaterial();
_lastMaterialID = newMaterialID;
}
indexToDraw += cmd->getQuadCount() * 6;
}
//Draw any remaining quad
if(indexToDraw > 0)
{
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[0])) );
_drawnBatches++;
_drawnVertices += indexToDraw;
}
if (Configuration::getInstance()->supportsShareableVAO())
{
//Unbind VAO
GL::bindVAO(0);
}
else
{
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
_batchQuadCommands.clear();
_numberQuads = 0;
}
2013-11-09 04:06:39 +08:00
void Renderer::flush()
2014-06-23 23:58:45 +08:00
{
flush2D();
flush3D();
}
void Renderer::flush2D()
2013-11-09 04:06:39 +08:00
{
2015-01-12 14:20:41 +08:00
flushQuads();
flushTriangles();
2013-11-09 04:06:39 +08:00
}
2014-06-23 23:58:45 +08:00
void Renderer::flush3D()
{
if (_lastBatchedMeshCommand)
{
2014-06-24 19:45:51 +08:00
_lastBatchedMeshCommand->postBatchDraw();
2014-06-23 23:58:45 +08:00
_lastBatchedMeshCommand = nullptr;
}
}
2015-01-10 06:06:21 +08:00
void Renderer::flushQuads()
{
if(_numberQuads > 0)
{
drawBatchedQuads();
_lastMaterialID = 0;
}
}
void Renderer::flushTriangles()
{
if(_filledIndex > 0)
{
drawBatchedTriangles();
_lastMaterialID = 0;
}
}
2014-04-15 07:46:19 +08:00
2015-01-10 06:06:21 +08:00
// helpers
Squashed commit of the following: commit a9572b8913f3a38b59adbd7b4017ab9848a6b2b5 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed May 14 10:03:44 2014 -0700 math renames `Vector2` -> `Vec2` `Vector3` -> `Vec3` `Vector4` -> `Vec4` `Matrix` -> `Mat4` commit 4e107f4bd854c26bfceb52b063d6bd9cea02d6a3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:24:28 2014 -0700 raw version of rename Vector3 commit 1d115573ebe96a5fc815fa44fbe6417ea7dba841 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:07:14 2014 -0700 rename Vector2 after merge commit ab2ed58c129dbc30a4c0970ed94568c5d271657b Merge: 1978d2d 86fb75a Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:05:30 2014 -0700 Merge branch 'v3' into v3_renameMathClassName Conflicts: tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp commit 1978d2d174877172ccddc083020a1bbf43ad3b39 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 08:51:45 2014 -0700 rename vector2 in tests/cpp-empty-test folder commit d4e0ff13dcce62724d2fece656543f26aa28e467 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:58:23 2014 -0700 rename vector2 in tests/cpp-tests cpp files commit be50ca2ec75e0fd32a6fcdaa15fe1ebb4cafe79f Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:52:57 2014 -0700 rename vector2 in tests/cpp-tests head files commit 6daef564400d4e28c4ce20859a68e0f583fed125 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:49:48 2014 -0700 rename vector2 in extension folder commit 8f3f0f65ceea92c9e7a0d87ab54e62220c5572e2 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:47:22 2014 -0700 rename vector2 in cocos/2d cpp files commit e1f3105aae06d595661a3030f519f7cc13aefbed Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:44:39 2014 -0700 rename vector2 in cocos/2d head files commit 6708d890bfe486109120c3cd4b9fe5c078b7108f Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:40:59 2014 -0700 rename vector2 in cocos/base folder commit d3978fa5447c31ea2f3ece5469b7e746dfba4248 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:40:43 2014 -0700 rename vector2 in cocos/deprecated folder commit 4bff45139363d6b9706edbbcf9f322d48b4fd019 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:40:26 2014 -0700 rename vector2 in cocos/editor-support folder commit 353d244c995f8b5d14f635c52aed8bc5e5fc1a6f Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:36:48 2014 -0700 rename vector2 in cocos/ui folder commit 758b8f4d513084b9922d7242e9b8f2c7f316de6c Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:32:39 2014 -0700 rename vector2 in cocos/renderer folder commit 0bd2710dd8714cecb993880bc37affd9ecb05c27 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:32:15 2014 -0700 rename vector2 in cocos/physics folder commit b7f0581c4587348bdbc1478d5374c2325735f21d Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:25:01 2014 -0700 rename vector2 in cocos/math folder commit a8631a8e1a4e2740807ccd9be9d70de6ecaad7dd Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:16:55 2014 -0700 rename Vector2 to Vec2 deprecate typedef Vector2
2014-05-15 01:07:09 +08:00
bool Renderer::checkVisibility(const Mat4 &transform, const Size &size)
2014-04-15 07:46:19 +08:00
{
2014-08-27 12:09:23 +08:00
auto scene = Director::getInstance()->getRunningScene();
// only cull the default camera. The culling algorithm is valid for default camera.
if (scene && scene->_defaultCamera != Camera::getVisitingCamera())
2014-08-27 12:09:23 +08:00
return true;
2014-04-15 07:46:19 +08:00
// half size of the screen
Size screen_half = Director::getInstance()->getWinSize();
screen_half.width /= 2;
screen_half.height /= 2;
float hSizeX = size.width/2;
float hSizeY = size.height/2;
Squashed commit of the following: commit a9572b8913f3a38b59adbd7b4017ab9848a6b2b5 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed May 14 10:03:44 2014 -0700 math renames `Vector2` -> `Vec2` `Vector3` -> `Vec3` `Vector4` -> `Vec4` `Matrix` -> `Mat4` commit 4e107f4bd854c26bfceb52b063d6bd9cea02d6a3 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:24:28 2014 -0700 raw version of rename Vector3 commit 1d115573ebe96a5fc815fa44fbe6417ea7dba841 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:07:14 2014 -0700 rename Vector2 after merge commit ab2ed58c129dbc30a4c0970ed94568c5d271657b Merge: 1978d2d 86fb75a Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 09:05:30 2014 -0700 Merge branch 'v3' into v3_renameMathClassName Conflicts: tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest_Editor.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest_Editor.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest_Editor.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest.cpp tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UITextFieldTest/UITextFieldTest_Editor.cpp commit 1978d2d174877172ccddc083020a1bbf43ad3b39 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 08:51:45 2014 -0700 rename vector2 in tests/cpp-empty-test folder commit d4e0ff13dcce62724d2fece656543f26aa28e467 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:58:23 2014 -0700 rename vector2 in tests/cpp-tests cpp files commit be50ca2ec75e0fd32a6fcdaa15fe1ebb4cafe79f Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:52:57 2014 -0700 rename vector2 in tests/cpp-tests head files commit 6daef564400d4e28c4ce20859a68e0f583fed125 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:49:48 2014 -0700 rename vector2 in extension folder commit 8f3f0f65ceea92c9e7a0d87ab54e62220c5572e2 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:47:22 2014 -0700 rename vector2 in cocos/2d cpp files commit e1f3105aae06d595661a3030f519f7cc13aefbed Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:44:39 2014 -0700 rename vector2 in cocos/2d head files commit 6708d890bfe486109120c3cd4b9fe5c078b7108f Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:40:59 2014 -0700 rename vector2 in cocos/base folder commit d3978fa5447c31ea2f3ece5469b7e746dfba4248 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:40:43 2014 -0700 rename vector2 in cocos/deprecated folder commit 4bff45139363d6b9706edbbcf9f322d48b4fd019 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:40:26 2014 -0700 rename vector2 in cocos/editor-support folder commit 353d244c995f8b5d14f635c52aed8bc5e5fc1a6f Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:36:48 2014 -0700 rename vector2 in cocos/ui folder commit 758b8f4d513084b9922d7242e9b8f2c7f316de6c Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:32:39 2014 -0700 rename vector2 in cocos/renderer folder commit 0bd2710dd8714cecb993880bc37affd9ecb05c27 Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:32:15 2014 -0700 rename vector2 in cocos/physics folder commit b7f0581c4587348bdbc1478d5374c2325735f21d Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:25:01 2014 -0700 rename vector2 in cocos/math folder commit a8631a8e1a4e2740807ccd9be9d70de6ecaad7dd Author: Huabing.Xu <dabingnn@gmail.com> Date: Wed May 14 00:16:55 2014 -0700 rename Vector2 to Vec2 deprecate typedef Vector2
2014-05-15 01:07:09 +08:00
Vec4 v4world, v4local;
2014-04-15 22:35:35 +08:00
v4local.set(hSizeX, hSizeY, 0, 1);
transform.transformVector(v4local, &v4world);
2014-04-15 07:46:19 +08:00
// center of screen is (0,0)
v4world.x -= screen_half.width;
v4world.y -= screen_half.height;
// convert content size to world coordinates
2014-04-15 22:35:35 +08:00
float wshw = std::max(fabsf(hSizeX * transform.m[0] + hSizeY * transform.m[4]), fabsf(hSizeX * transform.m[0] - hSizeY * transform.m[4]));
float wshh = std::max(fabsf(hSizeX * transform.m[1] + hSizeY * transform.m[5]), fabsf(hSizeX * transform.m[1] - hSizeY * transform.m[5]));
2014-04-15 07:46:19 +08:00
// compare if it in the positive quadrant of the screen
float tmpx = (fabsf(v4world.x)-wshw);
float tmpy = (fabsf(v4world.y)-wshh);
bool ret = (tmpx < screen_half.width && tmpy < screen_half.height);
return ret;
}
2015-01-10 06:06:21 +08:00
void Renderer::setClearColor(const Color4F &clearColor)
{
_clearColor = clearColor;
glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a);
}
2014-01-17 13:49:14 +08:00
NS_CC_END