Feature/new skeleton culling (#1196)

* Fix culling of skeleton and clean up code

* Optionally draw the bounding rectangle of skeletons

* Add Visual Studio compiler support

* Fix indentation

* Fix indentation

* Fix indentation

* Revert some indentation changes
This commit is contained in:
sp-stefano-lanza 2018-10-16 15:46:49 +02:00 committed by Mario Zechner
parent a5023f521c
commit 7183e3b0bd
11 changed files with 505 additions and 313 deletions

View File

@ -65,7 +65,7 @@ bool AppDelegate::applicationDidFinishLaunching () {
glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER); glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
#endif #endif
Size frameSize = glview->getFrameSize(); cocos2d::Size frameSize = glview->getFrameSize();
vector<string> searchPath; vector<string> searchPath;

View File

@ -67,7 +67,7 @@ bool BatchingExample::init () {
int xMin = _contentSize.width * 0.10f, xMax = _contentSize.width * 0.90f; int xMin = _contentSize.width * 0.10f, xMax = _contentSize.width * 0.90f;
int yMin = 0, yMax = _contentSize.height * 0.7f; int yMin = 0, yMax = _contentSize.height * 0.7f;
for (int i = 0, j = 0; i < NUM_SKELETONS; i++) { for (int i = 0; i < NUM_SKELETONS; i++) {
// Each skeleton node shares the same atlas, skeleton data, and mix times. // Each skeleton node shares the same atlas, skeleton data, and mix times.
SkeletonAnimation* skeletonNode = SkeletonAnimation::createWithData(_skeletonData, false); SkeletonAnimation* skeletonNode = SkeletonAnimation::createWithData(_skeletonData, false);
skeletonNode->setAnimationStateData(_stateData); skeletonNode->setAnimationStateData(_stateData);

View File

@ -53,8 +53,10 @@ bool CoinExample::init () {
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create(); EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool { listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
if (!skeletonNode->getDebugBonesEnabled()) if (!skeletonNode->getDebugBonesEnabled()) {
skeletonNode->setDebugBonesEnabled(true); skeletonNode->setDebugBonesEnabled(true);
skeletonNode->setDebugBoundingRectEnabled(true);
}
else if (skeletonNode->getTimeScale() == 1) else if (skeletonNode->getTimeScale() == 1)
skeletonNode->setTimeScale(0.3f); skeletonNode->setTimeScale(0.3f);
else else

View File

@ -54,8 +54,10 @@ bool GoblinsExample::init () {
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create(); EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool { listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
if (!skeletonNode->getDebugBonesEnabled()) if (!skeletonNode->getDebugBonesEnabled()) {
skeletonNode->setDebugBonesEnabled(true); skeletonNode->setDebugBonesEnabled(true);
skeletonNode->setDebugBoundingRectEnabled(true);
}
else if (skeletonNode->getTimeScale() == 1) else if (skeletonNode->getTimeScale() == 1)
skeletonNode->setTimeScale(0.3f); skeletonNode->setTimeScale(0.3f);
else else

View File

@ -67,6 +67,7 @@ bool RaptorExample::init () {
if (!skeletonNode->getDebugBonesEnabled()) { if (!skeletonNode->getDebugBonesEnabled()) {
skeletonNode->setDebugBonesEnabled(true); skeletonNode->setDebugBonesEnabled(true);
skeletonNode->setDebugMeshesEnabled(true); skeletonNode->setDebugMeshesEnabled(true);
skeletonNode->setDebugBoundingRectEnabled(true);
} else if (skeletonNode->getTimeScale() == 1) } else if (skeletonNode->getTimeScale() == 1)
skeletonNode->setTimeScale(0.3f); skeletonNode->setTimeScale(0.3f);
else else

View File

@ -78,7 +78,14 @@ bool SkeletonRendererSeparatorExample::init () {
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create(); EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool { listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
if (!backNode->getDebugBonesEnabled()) if (!backNode->getDebugBonesEnabled())
{
backNode->setDebugBonesEnabled(true); backNode->setDebugBonesEnabled(true);
backNode->setDebugSlotsEnabled(true);
backNode->setDebugBoundingRectEnabled(true);
frontNode->setDebugBonesEnabled(true);
frontNode->setDebugSlotsEnabled(true);
frontNode->setDebugBoundingRectEnabled(true);
}
else if (backNode->getTimeScale() == 1) else if (backNode->getTimeScale() == 1)
backNode->setTimeScale(0.3f); backNode->setTimeScale(0.3f);
else else

View File

@ -84,8 +84,10 @@ bool SpineboyExample::init () {
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create(); EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool { listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
if (!skeletonNode->getDebugBonesEnabled()) if (!skeletonNode->getDebugBonesEnabled()) {
skeletonNode->setDebugBonesEnabled(true); skeletonNode->setDebugBonesEnabled(true);
skeletonNode->setDebugBoundingRectEnabled(true);
}
else if (skeletonNode->getTimeScale() == 1) else if (skeletonNode->getTimeScale() == 1)
skeletonNode->setTimeScale(0.3f); skeletonNode->setTimeScale(0.3f);
else else

View File

@ -53,8 +53,11 @@ bool TankExample::init () {
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create(); EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool { listener->onTouchBegan = [this] (Touch* touch, Event* event) -> bool {
if (!skeletonNode->getDebugBonesEnabled()) if (!skeletonNode->getDebugBonesEnabled()) {
skeletonNode->setDebugBonesEnabled(true); skeletonNode->setDebugBonesEnabled(true);
skeletonNode->setDebugSlotsEnabled(true);
skeletonNode->setDebugBoundingRectEnabled(true);
}
else if (skeletonNode->getTimeScale() == 1) else if (skeletonNode->getTimeScale() == 1)
skeletonNode->setTimeScale(0.3f); skeletonNode->setTimeScale(0.3f);
else else

File diff suppressed because it is too large Load Diff

View File

@ -49,12 +49,11 @@ public:
virtual void update (float deltaTime) override; virtual void update (float deltaTime) override;
virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t transformFlags) override; virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t transformFlags) override;
virtual void drawDebug (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t transformFlags);
virtual cocos2d::Rect getBoundingBox () const override; virtual cocos2d::Rect getBoundingBox () const override;
virtual void onEnter () override; virtual void onEnter () override;
virtual void onExit () override; virtual void onExit () override;
spSkeleton* getSkeleton(); spSkeleton* getSkeleton() const;
void setTimeScale(float scale); void setTimeScale(float scale);
float getTimeScale() const; float getTimeScale() const;
@ -69,6 +68,9 @@ public:
void setDebugMeshesEnabled(bool enabled); void setDebugMeshesEnabled(bool enabled);
bool getDebugMeshesEnabled() const; bool getDebugMeshesEnabled() const;
void setDebugBoundingRectEnabled(bool enabled);
bool getDebugBoundingRectEnabled() const;
// --- Convenience methods for common Skeleton_* functions. // --- Convenience methods for common Skeleton_* functions.
void updateWorldTransform (); void updateWorldTransform ();
@ -113,9 +115,6 @@ public:
virtual void setOpacityModifyRGB (bool value) override; virtual void setOpacityModifyRGB (bool value) override;
virtual bool isOpacityModifyRGB () const override; virtual bool isOpacityModifyRGB () const override;
// Frees global memory used for temporay vertex transformations.
static void destroyScratchBuffers();
CC_CONSTRUCTOR_ACCESS: CC_CONSTRUCTOR_ACCESS:
SkeletonRenderer (); SkeletonRenderer ();
SkeletonRenderer(spSkeleton* skeleton, bool ownsSkeleton = false, bool ownsSkeletonData = false); SkeletonRenderer(spSkeleton* skeleton, bool ownsSkeleton = false, bool ownsSkeletonData = false);
@ -139,6 +138,7 @@ protected:
virtual AttachmentVertices* getAttachmentVertices (spRegionAttachment* attachment) const; virtual AttachmentVertices* getAttachmentVertices (spRegionAttachment* attachment) const;
virtual AttachmentVertices* getAttachmentVertices (spMeshAttachment* attachment) const; virtual AttachmentVertices* getAttachmentVertices (spMeshAttachment* attachment) const;
void setupGLProgramState(bool twoColorTintEnabled); void setupGLProgramState(bool twoColorTintEnabled);
virtual void drawDebug (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t transformFlags);
bool _ownsSkeletonData; bool _ownsSkeletonData;
bool _ownsSkeleton; bool _ownsSkeleton;
@ -152,8 +152,10 @@ protected:
bool _debugSlots; bool _debugSlots;
bool _debugBones; bool _debugBones;
bool _debugMeshes; bool _debugMeshes;
bool _debugBoundingRect;
spSkeletonClipping* _clipper; spSkeletonClipping* _clipper;
spVertexEffect* _effect; spVertexEffect* _effect;
cocos2d::Rect _boundingRect;
int _startSlotIndex; int _startSlotIndex;
int _endSlotIndex; int _endSlotIndex;

View File

@ -57,7 +57,7 @@ void TwoColorTrianglesCommand::init(float globalOrder, GLuint textureID, GLProgr
if(_triangles.indexCount % 3 != 0) { if(_triangles.indexCount % 3 != 0) {
int count = _triangles.indexCount; int count = _triangles.indexCount;
_triangles.indexCount = count / 3 * 3; _triangles.indexCount = count / 3 * 3;
CCLOGERROR("Resize indexCount from %zd to %zd, size must be multiple times of 3", count, _triangles.indexCount); CCLOGERROR("Resize indexCount from %d to %d, size must be multiple times of 3", count, _triangles.indexCount);
} }
_mv = mv; _mv = mv;