You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
5.1 KiB
157 lines
5.1 KiB
/******************************************************************************
|
|
* Spine Runtimes License Agreement
|
|
* Last updated January 1, 2020. Replaces all prior versions.
|
|
*
|
|
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
*
|
|
* Integration of the Spine Runtimes into software or otherwise creating
|
|
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
* http://esotericsoftware.com/spine-editor-license
|
|
*
|
|
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
* "Products"), provided that each user of the Products must obtain their own
|
|
* Spine Editor license and redistribution of the Products in any form must
|
|
* include this license and copyright notice.
|
|
*
|
|
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*****************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
|
#include "IOBuffer.h"
|
|
#include "SkeletonAnimation.h"
|
|
#include "middleware-adapter.h"
|
|
|
|
namespace spine {
|
|
class SkeletonCache : public SkeletonAnimation {
|
|
public:
|
|
struct SegmentData {
|
|
friend class SkeletonCache;
|
|
|
|
SegmentData();
|
|
~SegmentData();
|
|
|
|
void setTexture(cc::middleware::Texture2D *value);
|
|
cc::middleware::Texture2D *getTexture() const;
|
|
|
|
public:
|
|
int indexCount = 0;
|
|
int vertexFloatCount = 0;
|
|
int blendMode = 0;
|
|
|
|
private:
|
|
cc::middleware::Texture2D *_texture = nullptr;
|
|
};
|
|
|
|
struct BoneData {
|
|
cc::Mat4 globalTransformMatrix;
|
|
};
|
|
|
|
struct ColorData {
|
|
cc::middleware::Color4B finalColor;
|
|
cc::middleware::Color4B darkColor;
|
|
int vertexFloatOffset = 0;
|
|
};
|
|
|
|
struct FrameData {
|
|
friend class SkeletonCache;
|
|
|
|
FrameData();
|
|
~FrameData();
|
|
|
|
const std::vector<BoneData *> &getBones() const {
|
|
return _bones;
|
|
}
|
|
std::size_t getBoneCount() const;
|
|
|
|
const std::vector<ColorData *> &getColors() const {
|
|
return _colors;
|
|
}
|
|
std::size_t getColorCount() const;
|
|
|
|
const std::vector<SegmentData *> &getSegments() const {
|
|
return _segments;
|
|
}
|
|
std::size_t getSegmentCount() const;
|
|
|
|
private:
|
|
// if segment data is empty, it will build new one.
|
|
SegmentData *buildSegmentData(std::size_t index);
|
|
// if color data is empty, it will build new one.
|
|
ColorData *buildColorData(std::size_t index);
|
|
// if bone data is empty, it will build new one.
|
|
BoneData *buildBoneData(std::size_t index);
|
|
|
|
std::vector<BoneData *> _bones;
|
|
std::vector<ColorData *> _colors;
|
|
std::vector<SegmentData *> _segments;
|
|
|
|
public:
|
|
cc::middleware::IOBuffer ib;
|
|
cc::middleware::IOBuffer vb;
|
|
};
|
|
|
|
struct AnimationData {
|
|
friend class SkeletonCache;
|
|
|
|
AnimationData();
|
|
~AnimationData();
|
|
void reset();
|
|
|
|
FrameData *getFrameData(std::size_t frameIdx) const;
|
|
std::size_t getFrameCount() const;
|
|
|
|
bool isComplete() const { return _isComplete; }
|
|
bool needUpdate(int toFrameIdx) const;
|
|
|
|
private:
|
|
// if frame is empty, it will build new one.
|
|
FrameData *buildFrameData(std::size_t frameIdx);
|
|
|
|
private:
|
|
std::string _animationName = "";
|
|
bool _isComplete = false;
|
|
float _totalTime = 0.0f;
|
|
std::vector<FrameData *> _frames;
|
|
};
|
|
|
|
SkeletonCache();
|
|
virtual ~SkeletonCache();
|
|
|
|
virtual void beginSchedule() override {}
|
|
virtual void stopSchedule() override {}
|
|
virtual void update(float deltaTime) override;
|
|
virtual void render(float deltaTime) override {}
|
|
virtual void onAnimationStateEvent(TrackEntry *entry, EventType type, Event *event) override;
|
|
|
|
void updateToFrame(const std::string &animationName, int toFrameIdx = -1);
|
|
// if animation data is empty, it will build new one.
|
|
AnimationData *buildAnimationData(const std::string &animationName);
|
|
AnimationData *getAnimationData(const std::string &animationName);
|
|
void resetAllAnimationData();
|
|
void resetAnimationData(const std::string &animationName);
|
|
|
|
private:
|
|
void renderAnimationFrame(AnimationData *animationData);
|
|
|
|
public:
|
|
static float FrameTime;
|
|
static float MaxCacheTime;
|
|
|
|
private:
|
|
std::string _curAnimationName = "";
|
|
std::map<std::string, AnimationData *> _animationCaches;
|
|
};
|
|
} // namespace spine
|
|
|