Merge branch 'develop' of https://github.com/cocos2d/cocos2d-x into develop_label_fixs

Conflicts:
	cocos/2d/CCLabel.cpp
This commit is contained in:
Dhilan007 2014-03-26 11:15:48 +08:00
commit 1247760d95
71 changed files with 1167 additions and 794 deletions

View File

@ -1 +1 @@
819b72559f8be48c41958b0afb4c6513207b453a
8141cfdd7d973fa5a4c189a72c2fd6cac8eb95ae

View File

@ -590,7 +590,7 @@ void EventDispatcher::dispatchEventToListeners(EventListenerVector* listeners, c
// priority < 0
if (fixedPriorityListeners)
{
CCASSERT(listeners->getGt0Index() <= fixedPriorityListeners->size(), "Out of range exception!");
CCASSERT(listeners->getGt0Index() <= static_cast<ssize_t>(fixedPriorityListeners->size()), "Out of range exception!");
if (!fixedPriorityListeners->empty())
{

View File

@ -231,6 +231,8 @@ bool FontAtlas::prepareLetterDefinitions(unsigned short *utf16String)
auto pixelFormat = fontTTf->getOutlineSize() > 0 ? Texture2D::PixelFormat::AI88 : Texture2D::PixelFormat::A8;
bool existNewLetter = false;
int bottomHeight = _commonLineHeight - _fontAscender;
for (int i = 0; i < length; ++i)
{
auto outIterator = _fontLetterDefinitions.find(utf16String[i]);
@ -248,6 +250,7 @@ bool FontAtlas::prepareLetterDefinitions(unsigned short *utf16String)
tempDef.height = tempRect.size.height + _letterPadding;
tempDef.offsetX = tempRect.origin.x + offsetAdjust;
tempDef.offsetY = _fontAscender + tempRect.origin.y - offsetAdjust;
tempDef.clipBottom = bottomHeight - (tempDef.height + tempRect.origin.y + offsetAdjust);
if (_currentPageOrigX + tempDef.width > CacheTextureWidth)
{
@ -290,6 +293,7 @@ bool FontAtlas::prepareLetterDefinitions(unsigned short *utf16String)
tempDef.offsetX = 0;
tempDef.offsetY = 0;
tempDef.textureID = 0;
tempDef.clipBottom = 0;
_currentPageOrigX += 1;
}

View File

@ -50,6 +50,8 @@ struct FontLetterDefinition
int textureID;
bool validDefinition;
int xAdvance;
int clipBottom;
};
class CC_DLL FontAtlas : public Ref

View File

@ -388,7 +388,7 @@ unsigned char * makeDistanceMap( unsigned char *img, long width, long height)
double * data = (double *) calloc( pixelAmount, sizeof(double) );
double * outside = (double *) calloc( pixelAmount, sizeof(double) );
double * inside = (double *) calloc( pixelAmount, sizeof(double) );
unsigned int i,j;
long i,j;
// Convert img into double (data) rescale image levels between 0 and 1
long outWidth = width + 2 * FontFreeType::DistanceMapSpread;

View File

@ -341,7 +341,9 @@ void Label::reset()
_textColor = Color4B::WHITE;
_textColorF = Color4F::WHITE;
setColor(Color3B::WHITE);
_shadowEnabled = false;
_clipEnabled = false;
}
void Label::updateShaderProgram()

View File

@ -217,6 +217,10 @@ public:
virtual Sprite * getLetter(int lettetIndex);
/** clip upper and lower margin for reduce height of label.
*/
void setClipMarginEnabled(bool clipEnabled) { _clipEnabled = clipEnabled; }
bool isClipMarginEnabled() const { return _clipEnabled; }
// font related stuff
int getCommonLineHeight() const;
@ -370,6 +374,8 @@ protected:
Color4B _textColor;
Color4F _textColorF;
bool _clipEnabled;
private:
CC_DISALLOW_COPY_AND_ASSIGN(Label);

View File

@ -321,6 +321,16 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
FontLetterDefinition tempDefinition;
Point letterPosition;
const auto& kernings = theLabel->_horizontalKernings;
float clipTop = 0;
float clipBottom = 0;
int lineIndex = 0;
bool lineStart = true;
bool clip = false;
if (theLabel->_currentLabelType == Label::LabelType::TTF && theLabel->_clipEnabled)
{
clip = true;
}
for (unsigned int i = 0; i < stringLen; i++)
{
@ -337,9 +347,10 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
charYOffset = -1;
charAdvance = -1;
}
if (c == '\n')
{
lineIndex++;
nextFontPositionX = 0;
nextFontPositionY -= theLabel->_commonLineHeight;
@ -347,8 +358,30 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
if(nextFontPositionY < theLabel->_commonLineHeight)
break;
lineStart = true;
continue;
}
else if (clip && tempDefinition.height > 0.0f)
{
if (lineStart)
{
if (lineIndex == 0)
{
clipTop = charYOffset;
}
lineStart = false;
clipBottom = tempDefinition.clipBottom;
}
else if(tempDefinition.clipBottom < clipBottom)
{
clipBottom = tempDefinition.clipBottom;
}
if (lineIndex == 0 && charYOffset < clipTop)
{
clipTop = charYOffset;
}
}
letterPosition.x = (nextFontPositionX + charXOffset + kernings[i]) / contentScaleFactor;
letterPosition.y = (nextFontPositionY - charYOffset) / contentScaleFactor;
@ -382,11 +415,26 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
}
tmpSize.height = totalHeight;
if (theLabel->_labelHeight > 0)
{
tmpSize.height = theLabel->_labelHeight * contentScaleFactor;
}
if (clip)
{
int clipTotal = (clipTop + clipBottom) / contentScaleFactor;
tmpSize.height -= clipTotal * contentScaleFactor;
clipBottom /= contentScaleFactor;
for (int i = 0; i < theLabel->_limitShowCount; i++)
{
theLabel->_lettersInfo[i].position.y -= clipBottom;
}
}
theLabel->setContentSize(CC_SIZE_PIXELS_TO_POINTS(tmpSize));
return true;
}

View File

@ -492,7 +492,7 @@ void TMXLayer::setTileGID(uint32_t gid, const Point& pos, TMXTileFlags flags)
{
CCASSERT(pos.x < _layerSize.width && pos.y < _layerSize.height && pos.x >=0 && pos.y >=0, "TMXLayer: invalid position");
CCASSERT(_tiles && _atlasIndexArray, "TMXLayer: the tiles map has been released");
CCASSERT(gid == 0 || gid >= _tileSet->_firstGid, "TMXLayer: invalid gid" );
CCASSERT(gid == 0 || (int)gid >= _tileSet->_firstGid, "TMXLayer: invalid gid" );
TMXTileFlags currentFlags;
uint32_t currentGID = getTileGIDAt(pos, &currentFlags);

View File

@ -1203,6 +1203,9 @@ void Texture2D::generateMipmap()
GL::bindTexture2D( _name );
glGenerateMipmap(GL_TEXTURE_2D);
_hasMipmaps = true;
#if CC_ENABLE_CACHE_TEXTURE_DATA
VolatileTextureMgr::setHasMipmaps(this, _hasMipmaps);
#endif
}
bool Texture2D::hasMipmaps() const

View File

@ -635,6 +635,12 @@ void VolatileTextureMgr::addStringTexture(Texture2D *tt, const char* text, const
vt->_fontDefinition = fontDefinition;
}
void VolatileTextureMgr::setHasMipmaps(Texture2D *t, bool hasMipmaps)
{
VolatileTexture *vt = findVolotileTexture(t);
vt->_hasMipmaps = hasMipmaps;
}
void VolatileTextureMgr::setTexParameters(Texture2D *t, const Texture2D::TexParams &texParams)
{
VolatileTexture *vt = findVolotileTexture(t);
@ -717,6 +723,9 @@ void VolatileTextureMgr::reloadAllTextures()
default:
break;
}
if (vt->_hasMipmaps) {
vt->_texture->generateMipmap();
}
vt->_texture->setTexParameters(vt->_texParams);
}

View File

@ -251,6 +251,7 @@ protected:
std::string _fileName;
bool _hasMipmaps;
Texture2D::TexParams _texParams;
std::string _text;
FontDefinition _fontDefinition;
@ -264,6 +265,7 @@ public:
static void addDataTexture(Texture2D *tt, void* data, int dataLen, Texture2D::PixelFormat pixelFormat, const Size& contentSize);
static void addImage(Texture2D *tt, Image *image);
static void setHasMipmaps(Texture2D *t, bool hasMipmaps);
static void setTexParameters(Texture2D *t, const Texture2D::TexParams &texParams);
static void removeTexture(Texture2D *t);
static void reloadAllTextures();

View File

@ -241,7 +241,7 @@ void ActionNode::insertFrame(int index, ActionFrame* frame)
return;
}
int frameType = frame->getFrameType();
if(frameType < _frameArray.size())
if(frameType < (int)_frameArray.size())
{
auto cArray = _frameArray.at(frameType);
cArray->insert(index, frame);
@ -256,7 +256,7 @@ void ActionNode::addFrame(ActionFrame* frame)
}
int frameType = frame->getFrameType();
if(frameType < _frameArray.size())
if(frameType < (int)_frameArray.size())
{
auto cArray = _frameArray.at(frameType);
cArray->pushBack(frame);
@ -270,7 +270,7 @@ void ActionNode::deleteFrame(ActionFrame* frame)
return;
}
int frameType = frame->getFrameType();
if(frameType < _frameArray.size())
if(frameType < (int)_frameArray.size())
{
auto cArray = _frameArray.at(frameType);
cArray->eraseObject(frame);

View File

@ -126,8 +126,8 @@ void Skin::setSkinData(const BaseData &var)
setScaleX(_skinData.scaleX);
setScaleY(_skinData.scaleY);
setRotationX(CC_RADIANS_TO_DEGREES(_skinData.skewX));
setRotationY(CC_RADIANS_TO_DEGREES(-_skinData.skewY));
setRotationSkewX(CC_RADIANS_TO_DEGREES(_skinData.skewX));
setRotationSkewY(CC_RADIANS_TO_DEGREES(-_skinData.skewY));
setPosition(Point(_skinData.x, _skinData.y));
_skinTransform = getNodeToParentTransform();

View File

@ -187,16 +187,19 @@ void WsThreadHelper::update(float dt)
WsMessage *msg = nullptr;
// Returns quickly if no message
std::lock_guard<std::mutex> lk(_UIWsMessageQueueMutex);
_UIWsMessageQueueMutex.lock();
if (0 == _UIWsMessageQueue->size())
{
_UIWsMessageQueueMutex.unlock();
return;
}
// Gets message
msg = *(_UIWsMessageQueue->begin());
_UIWsMessageQueue->pop_front();
_UIWsMessageQueueMutex.unlock();
if (_ws)
{

View File

@ -3,6 +3,11 @@
-- @module Label
-- @extend SpriteBatchNode,LabelProtocol,
--------------------------------
-- @function [parent=#Label] isClipMarginEnabled
-- @param self
-- @return bool#bool ret (return value: bool)
--------------------------------
-- @function [parent=#Label] enableShadow
-- @param self
@ -57,6 +62,11 @@
-- @param self
-- @return TextHAlignment#TextHAlignment ret (return value: cc.TextHAlignment)
--------------------------------
-- @function [parent=#Label] setClipMarginEnabled
-- @param self
-- @param #bool bool
--------------------------------
-- @function [parent=#Label] setString
-- @param self

View File

@ -52,6 +52,11 @@
-- @param self
-- @return RichText#RichText ret (return value: ccui.RichText)
--------------------------------
-- @function [parent=#RichText] getDescription
-- @param self
-- @return string#string ret (return value: string)
--------------------------------
-- @function [parent=#RichText] RichText
-- @param self

View File

@ -187,58 +187,22 @@
-- @param #int int
-- @param #int int
--------------------------------
-- @function [parent=#ScrollView] getChildByName
-- @param self
-- @param #char char
-- @return Widget#Widget ret (return value: ccui.Widget)
--------------------------------
-- @function [parent=#ScrollView] getDescription
-- @param self
-- @return string#string ret (return value: string)
--------------------------------
-- @function [parent=#ScrollView] removeAllChildren
-- @function [parent=#ScrollView] update
-- @param self
-- @param #float float
--------------------------------
-- overload function: getChildren()
--
-- overload function: getChildren()
--
-- @function [parent=#ScrollView] getChildren
-- @param self
-- @return array_table#array_table ret (retunr value: array_table)
--------------------------------
-- @function [parent=#ScrollView] getNodes
-- @param self
-- @return array_table#array_table ret (return value: array_table)
--------------------------------
-- @function [parent=#ScrollView] getChildByTag
-- @param self
-- @param #int int
-- @return Node#Node ret (return value: cc.Node)
--------------------------------
-- @function [parent=#ScrollView] removeNode
-- @param self
-- @param #cc.Node node
--------------------------------
-- @function [parent=#ScrollView] removeNodeByTag
-- @param self
-- @param #int int
--------------------------------
-- overload function: addNode(cc.Node, int)
--
-- overload function: addNode(cc.Node)
--
-- overload function: addNode(cc.Node, int, int)
--
-- @function [parent=#ScrollView] addNode
-- @param self
-- @param #cc.Node node
-- @param #int int
-- @param #int int
--------------------------------
-- @function [parent=#ScrollView] getLayoutType
-- @param self
@ -250,24 +214,7 @@
-- @param #bool bool
--------------------------------
-- @function [parent=#ScrollView] update
-- @param self
-- @param #float float
--------------------------------
-- @function [parent=#ScrollView] getNodeByTag
-- @param self
-- @param #int int
-- @return Node#Node ret (return value: cc.Node)
--------------------------------
-- @function [parent=#ScrollView] getChildByName
-- @param self
-- @param #char char
-- @return Widget#Widget ret (return value: ccui.Widget)
--------------------------------
-- @function [parent=#ScrollView] removeAllNodes
-- @function [parent=#ScrollView] removeAllChildren
-- @param self
--------------------------------
@ -276,6 +223,21 @@
-- @param #cc.Node node
-- @param #bool bool
--------------------------------
-- overload function: getChildren()
--
-- overload function: getChildren()
--
-- @function [parent=#ScrollView] getChildren
-- @param self
-- @return array_table#array_table ret (retunr value: array_table)
--------------------------------
-- @function [parent=#ScrollView] getChildByTag
-- @param self
-- @param #int int
-- @return Node#Node ret (return value: cc.Node)
--------------------------------
-- @function [parent=#ScrollView] getChildrenCount
-- @param self

View File

@ -1,18 +1,13 @@
--------------------------------
-- @module Widget
-- @extend Node
-- @extend ProtectedNode
--------------------------------
-- @function [parent=#Widget] setSizePercent
-- @param self
-- @param #point_table point
--------------------------------
-- @function [parent=#Widget] isFlippedX
-- @param self
-- @return bool#bool ret (return value: bool)
--------------------------------
-- @function [parent=#Widget] getCustomSize
-- @param self
@ -29,10 +24,9 @@
-- @param #bool bool
--------------------------------
-- @function [parent=#Widget] getNodeByTag
-- @function [parent=#Widget] getLeftInParent
-- @param self
-- @param #int int
-- @return Node#Node ret (return value: cc.Node)
-- @return float#float ret (return value: float)
--------------------------------
-- @function [parent=#Widget] getTouchEndPos
@ -44,11 +38,6 @@
-- @param self
-- @param #point_table point
--------------------------------
-- @function [parent=#Widget] getNodes
-- @param self
-- @return array_table#array_table ret (return value: array_table)
--------------------------------
-- @function [parent=#Widget] getLayoutSize
-- @param self
@ -69,15 +58,6 @@
-- @param self
-- @return bool#bool ret (return value: bool)
--------------------------------
-- overload function: updateSizeAndPosition(size_table)
--
-- overload function: updateSizeAndPosition()
--
-- @function [parent=#Widget] updateSizeAndPosition
-- @param self
-- @param #size_table size
--------------------------------
-- @function [parent=#Widget] getBottomInParent
-- @param self
@ -100,9 +80,9 @@
-- @return PositionType#PositionType ret (return value: ccui.PositionType)
--------------------------------
-- @function [parent=#Widget] setName
-- @function [parent=#Widget] getWidgetType
-- @param self
-- @param #char char
-- @return WidgetType#WidgetType ret (return value: ccui.WidgetType)
--------------------------------
-- @function [parent=#Widget] getChildByName
@ -116,9 +96,9 @@
-- @return bool#bool ret (return value: bool)
--------------------------------
-- @function [parent=#Widget] removeNodeByTag
-- @function [parent=#Widget] isFocused
-- @param self
-- @param #int int
-- @return bool#bool ret (return value: bool)
--------------------------------
-- @function [parent=#Widget] isTouchEnabled
@ -175,18 +155,10 @@
-- @param #ccui.BrightStyle brightstyle
--------------------------------
-- overload function: addNode(cc.Node, int)
--
-- overload function: addNode(cc.Node)
--
-- overload function: addNode(cc.Node, int, int)
--
-- @function [parent=#Widget] addNode
-- @function [parent=#Widget] setName
-- @param self
-- @param #cc.Node node
-- @param #int int
-- @param #int int
-- @param #char char
--------------------------------
-- @function [parent=#Widget] setLayoutParameter
-- @param self
@ -202,21 +174,11 @@
-- @param self
-- @return point_table#point_table ret (return value: point_table)
--------------------------------
-- @function [parent=#Widget] getLeftInParent
-- @param self
-- @return float#float ret (return value: float)
--------------------------------
-- @function [parent=#Widget] setActionTag
-- @param self
-- @param #int int
--------------------------------
-- @function [parent=#Widget] ignoreContentAdaptWithSize
-- @param self
-- @param #bool bool
--------------------------------
-- @function [parent=#Widget] isBright
-- @param self
@ -234,10 +196,14 @@
-- @return float#float ret (return value: float)
--------------------------------
-- @function [parent=#Widget] getWidgetType
-- overload function: updateSizeAndPosition(size_table)
--
-- overload function: updateSizeAndPosition()
--
-- @function [parent=#Widget] updateSizeAndPosition
-- @param self
-- @return WidgetType#WidgetType ret (return value: ccui.WidgetType)
-- @param #size_table size
--------------------------------
-- @function [parent=#Widget] getSize
-- @param self
@ -254,13 +220,9 @@
-- @return SizeType#SizeType ret (return value: ccui.SizeType)
--------------------------------
-- @function [parent=#Widget] removeNode
-- @param self
-- @param #cc.Node node
--------------------------------
-- @function [parent=#Widget] removeAllNodes
-- @function [parent=#Widget] ignoreContentAdaptWithSize
-- @param self
-- @param #bool bool
--------------------------------
-- @function [parent=#Widget] getPositionPercent
@ -274,7 +236,7 @@
-- @return bool#bool ret (return value: bool)
--------------------------------
-- @function [parent=#Widget] isFocused
-- @function [parent=#Widget] isFlippedX
-- @param self
-- @return bool#bool ret (return value: bool)
@ -310,72 +272,11 @@
-- @param self
-- @return Widget#Widget ret (return value: ccui.Widget)
--------------------------------
-- overload function: addChild(cc.Node, int)
--
-- overload function: addChild(cc.Node)
--
-- overload function: addChild(cc.Node, int, int)
--
-- @function [parent=#Widget] addChild
-- @param self
-- @param #cc.Node node
-- @param #int int
-- @param #int int
--------------------------------
-- @function [parent=#Widget] setColor
-- @param self
-- @param #color3B_table color3b
--------------------------------
-- @function [parent=#Widget] removeFromParent
-- @param self
--------------------------------
-- @function [parent=#Widget] removeAllChildrenWithCleanup
-- @param self
-- @param #bool bool
--------------------------------
-- @function [parent=#Widget] removeAllChildren
-- @param self
--------------------------------
-- @function [parent=#Widget] sortAllChildren
-- @param self
--------------------------------
-- @function [parent=#Widget] removeChild
-- @param self
-- @param #cc.Node node
-- @param #bool bool
--------------------------------
-- overload function: getChildren()
--
-- overload function: getChildren()
--
-- @function [parent=#Widget] getChildren
-- @param self
-- @return array_table#array_table ret (retunr value: array_table)
--------------------------------
-- @function [parent=#Widget] getDescription
-- @param self
-- @return string#string ret (return value: string)
--------------------------------
-- @function [parent=#Widget] getChildByTag
-- @param self
-- @param #int int
-- @return Node#Node ret (return value: cc.Node)
--------------------------------
-- @function [parent=#Widget] removeFromParentAndCleanup
-- @param self
-- @param #bool bool
--------------------------------
-- @function [parent=#Widget] getColor
-- @param self
@ -386,26 +287,20 @@
-- @param self
-- @param #unsigned char char
--------------------------------
-- @function [parent=#Widget] setPosition
-- @param self
-- @param #point_table point
--------------------------------
-- @function [parent=#Widget] removeChildByTag
-- @param self
-- @param #int int
-- @param #bool bool
--------------------------------
-- @function [parent=#Widget] getOpacity
-- @param self
-- @return unsigned char#unsigned char ret (return value: unsigned char)
--------------------------------
-- @function [parent=#Widget] getChildrenCount
-- @function [parent=#Widget] setPosition
-- @param self
-- @return long#long ret (return value: long)
-- @param #point_table point
--------------------------------
-- @function [parent=#Widget] getDescription
-- @param self
-- @return string#string ret (return value: string)
--------------------------------
-- @function [parent=#Widget] Widget

View File

@ -1 +1 @@
83d9fece450a67211518c287e9ecf99ce122c142
bb331bf4e55b4ca2f5b12c75e6c3e638ae3367d0

View File

@ -1544,6 +1544,8 @@ int register_all_cocos2dx(lua_State* tolua_S);

View File

@ -1 +1 @@
11bba6be0cebc89eb4c7195a61d021e51719468f
19adb2eb5a08b20b670b77975f7e30c08bbac2d6

View File

@ -362,12 +362,6 @@ int register_all_cocos2dx_ui(lua_State* tolua_S);

View File

@ -340,7 +340,7 @@ void RichText::formarRenderers()
float newContentSizeHeight = 0.0f;
float *maxHeights = new float[_elementRenders.size()];
for (ssize_t i=0; i<_elementRenders.size(); i++)
for (size_t i=0; i<_elementRenders.size(); i++)
{
Vector<Node*>* row = (_elementRenders[i]);
float maxHeight = 0.0f;
@ -355,7 +355,7 @@ void RichText::formarRenderers()
float nextPosY = _customSize.height;
for (ssize_t i=0; i<_elementRenders.size(); i++)
for (size_t i=0; i<_elementRenders.size(); i++)
{
Vector<Node*>* row = (_elementRenders[i]);
float nextPosX = 0.0f;
@ -375,7 +375,7 @@ void RichText::formarRenderers()
}
size_t length = _elementRenders.size();
for (ssize_t i = 0; i<length; i++)
for (size_t i = 0; i<length; i++)
{
Vector<Node*>* l = _elementRenders[i];
l->clear();

View File

@ -23,9 +23,7 @@
#define CHIPMUNK_HEADER
#ifdef _MSC_VER
#ifndef _USE_MATH_DEFINES
#define _USE_MATH_DEFINES
#endif
#define _USE_MATH_DEFINES
#endif
#include <stdlib.h>
@ -112,10 +110,10 @@ typedef struct cpSpace cpSpace;
#include "cpSpace.h"
// Chipmunk 6.1.5
// Chipmunk 6.2.1
#define CP_VERSION_MAJOR 6
#define CP_VERSION_MINOR 1
#define CP_VERSION_RELEASE 5
#define CP_VERSION_MINOR 2
#define CP_VERSION_RELEASE 1
/// Version string.
extern const char *cpVersionString;

View File

@ -25,6 +25,9 @@
#define CP_HASH_COEF (3344921057ul)
#define CP_HASH_PAIR(A, B) ((cpHashValue)(A)*CP_HASH_COEF ^ (cpHashValue)(B)*CP_HASH_COEF)
// TODO: Eww. Magic numbers.
#define MAGIC_EPSILON 1e-5
//MARK: cpArray
struct cpArray {
@ -43,6 +46,7 @@ cpBool cpArrayContains(cpArray *arr, void *ptr);
void cpArrayFreeEach(cpArray *arr, void (freeFunc)(void*));
//MARK: Foreach loops
static inline cpConstraint *
@ -69,6 +73,7 @@ cpArbiterNext(cpArbiter *node, cpBody *body)
#define CP_BODY_FOREACH_COMPONENT(root, var)\
for(cpBody *var = root; var; var = var->node.next)
//MARK: cpHashSet
typedef cpBool (*cpHashSetEqlFunc)(void *ptr, void *elt);
@ -90,6 +95,7 @@ void cpHashSetEach(cpHashSet *set, cpHashSetIteratorFunc func, void *data);
typedef cpBool (*cpHashSetFilterFunc)(void *elt, void *data);
void cpHashSetFilter(cpHashSet *set, cpHashSetFilterFunc func, void *data);
//MARK: Body Functions
void cpBodyAddShape(cpBody *body, cpShape *shape);
@ -116,7 +122,29 @@ cpShapeActive(cpShape *shape)
return shape->prev || (shape->body && shape->body->shapeList == shape);
}
int cpCollideShapes(const cpShape *a, const cpShape *b, cpContact *arr);
int cpCollideShapes(const cpShape *a, const cpShape *b, cpCollisionID *id, cpContact *arr);
static inline void
CircleSegmentQuery(cpShape *shape, cpVect center, cpFloat r, cpVect a, cpVect b, cpSegmentQueryInfo *info)
{
cpVect da = cpvsub(a, center);
cpVect db = cpvsub(b, center);
cpFloat qa = cpvdot(da, da) - 2.0f*cpvdot(da, db) + cpvdot(db, db);
cpFloat qb = -2.0f*cpvdot(da, da) + 2.0f*cpvdot(da, db);
cpFloat qc = cpvdot(da, da) - r*r;
cpFloat det = qb*qb - 4.0f*qa*qc;
if(det >= 0.0f){
cpFloat t = (-qb - cpfsqrt(det))/(2.0f*qa);
if(0.0f<= t && t <= 1.0f){
info->shape = shape;
info->t = t;
info->n = cpvnormalize(cpvlerp(da, db, t));
}
}
}
// TODO doesn't really need to be inline, but need a better place to put this function
static inline cpSplittingPlane
@ -135,50 +163,12 @@ cpSplittingPlaneCompare(cpSplittingPlane plane, cpVect v)
void cpLoopIndexes(cpVect *verts, int count, int *start, int *end);
static inline cpFloat
cpPolyShapeValueOnAxis(const cpPolyShape *poly, const cpVect n, const cpFloat d)
{
cpVect *verts = poly->tVerts;
cpFloat min = cpvdot(n, verts[0]);
for(int i=1; i<poly->numVerts; i++){
min = cpfmin(min, cpvdot(n, verts[i]));
}
return min - d;
}
static inline cpBool
cpPolyShapeContainsVert(const cpPolyShape *poly, const cpVect v)
{
cpSplittingPlane *planes = poly->tPlanes;
for(int i=0; i<poly->numVerts; i++){
cpFloat dist = cpSplittingPlaneCompare(planes[i], v);
if(dist > 0.0f) return cpFalse;
}
return cpTrue;
}
static inline cpBool
cpPolyShapeContainsVertPartial(const cpPolyShape *poly, const cpVect v, const cpVect n)
{
cpSplittingPlane *planes = poly->tPlanes;
for(int i=0; i<poly->numVerts; i++){
if(cpvdot(planes[i].n, n) < 0.0f) continue;
cpFloat dist = cpSplittingPlaneCompare(planes[i], v);
if(dist > 0.0f) return cpFalse;
}
return cpTrue;
}
//MARK: Spatial Index Functions
cpSpatialIndex *cpSpatialIndexInit(cpSpatialIndex *index, cpSpatialIndexClass *klass, cpSpatialIndexBBFunc bbfunc, cpSpatialIndex *staticIndex);
//MARK: Space Functions
extern cpCollisionHandler cpDefaultCollisionHandler;
@ -221,8 +211,7 @@ cpSpaceUncacheArbiter(cpSpace *space, cpArbiter *arb)
}
void cpShapeUpdateFunc(cpShape *shape, void *unused);
void cpSpaceCollideShapes(cpShape *a, cpShape *b, cpSpace *space);
cpCollisionID cpSpaceCollideShapes(cpShape *a, cpShape *b, cpCollisionID id, cpSpace *space);
//MARK: Arbiters

View File

@ -1,4 +1,5 @@
#include <stdint.h>
#include <float.h>
#ifdef __APPLE__
#include "TargetConditionals.h"
@ -45,6 +46,7 @@
#define cpfpow pow
#define cpffloor floor
#define cpfceil ceil
#define CPFLOAT_MIN DBL_MIN
#else
typedef float cpFloat;
#define cpfsqrt sqrtf
@ -57,6 +59,7 @@
#define cpfpow powf
#define cpffloor floorf
#define cpfceil ceilf
#define CPFLOAT_MIN FLT_MIN
#endif
#ifndef INFINITY
@ -135,6 +138,10 @@ static inline cpFloat cpflerpconst(cpFloat f1, cpFloat f2, cpFloat d)
/// Hash value type.
typedef uintptr_t cpHashValue;
/// Type used internally to cache colliding object info for cpCollideShapes().
/// Should be at least 32 bits.
typedef uint32_t cpCollisionID;
// Oh C, how we love to define our own boolean types to get compiler compatibility
/// Chipmunk's boolean type.
#ifdef CP_BOOL_TYPE

View File

@ -55,6 +55,8 @@ void cpSegmentShapeSetRadius(cpShape *shape, cpFloat radius);
/// Set the vertexes of a poly shape.
void cpPolyShapeSetVerts(cpShape *shape, int numVerts, cpVect *verts, cpVect offset);
/// Set the radius of a poly shape.
void cpPolyShapeSetRadius(cpShape *shape, cpFloat radius);
#ifdef __cplusplus
}

View File

@ -50,7 +50,7 @@ struct cpCollisionHandler {
typedef struct cpContact cpContact;
#define CP_MAX_CONTACTS_PER_ARBITER 4
#define CP_MAX_CONTACTS_PER_ARBITER 2
/// @private
typedef enum cpArbiterState {

View File

@ -79,6 +79,13 @@ static inline cpBB cpBBExpand(const cpBB bb, const cpVect v){
);
}
/// Returns the center of a bounding box.
static inline cpVect
cpBBCenter(cpBB bb)
{
return cpvlerp(cpv(bb.l, bb.b), cpv(bb.r, bb.t), 0.5f);
}
/// Returns the area of the bounding box.
static inline cpFloat cpBBArea(cpBB bb)
{

View File

@ -35,6 +35,8 @@ typedef struct cpPolyShape {
int numVerts;
cpVect *verts, *tVerts;
cpSplittingPlane *planes, *tPlanes;
cpFloat r;
} cpPolyShape;
/// Allocate a polygon shape.
@ -42,26 +44,38 @@ cpPolyShape* cpPolyShapeAlloc(void);
/// Initialize a polygon shape.
/// A convex hull will be created from the vertexes.
cpPolyShape* cpPolyShapeInit(cpPolyShape *poly, cpBody *body, int numVerts, const cpVect *verts, cpVect offset);
/// Initialize a polygon shape.
/// A convex hull will be created from the vertexes.
cpPolyShape* cpPolyShapeInit2(cpPolyShape *poly, cpBody *body, int numVerts, const cpVect *verts, cpVect offset, cpFloat radius);
/// Allocate and initialize a polygon shape.
/// A convex hull will be created from the vertexes.
cpShape* cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset);
cpShape* cpPolyShapeNew(cpBody *body, int numVerts, const cpVect *verts, cpVect offset);
/// Allocate and initialize a polygon shape.
/// A convex hull will be created from the vertexes.
cpShape* cpPolyShapeNew2(cpBody *body, int numVerts, const cpVect *verts, cpVect offset, cpFloat radius);
/// Initialize a box shaped polygon shape.
cpPolyShape* cpBoxShapeInit(cpPolyShape *poly, cpBody *body, cpFloat width, cpFloat height);
/// Initialize an offset box shaped polygon shape.
cpPolyShape* cpBoxShapeInit2(cpPolyShape *poly, cpBody *body, cpBB box);
/// Initialize an offset box shaped polygon shape.
cpPolyShape* cpBoxShapeInit3(cpPolyShape *poly, cpBody *body, cpBB box, cpFloat radius);
/// Allocate and initialize a box shaped polygon shape.
cpShape* cpBoxShapeNew(cpBody *body, cpFloat width, cpFloat height);
/// Allocate and initialize an offset box shaped polygon shape.
cpShape* cpBoxShapeNew2(cpBody *body, cpBB box);
/// Allocate and initialize an offset box shaped polygon shape.
cpShape* cpBoxShapeNew3(cpBody *body, cpBB box, cpFloat radius);
/// Check that a set of vertexes is convex and has a clockwise winding.
/// NOTE: Due to floating point precision issues, hulls created with cpQuickHull() are not guaranteed to validate!
cpBool cpPolyValidate(const cpVect *verts, const int numVerts);
/// Get the number of verts in a polygon shape.
int cpPolyShapeGetNumVerts(cpShape *shape);
int cpPolyShapeGetNumVerts(const cpShape *shape);
/// Get the @c ith vertex of a polygon shape.
cpVect cpPolyShapeGetVert(cpShape *shape, int idx);
cpVect cpPolyShapeGetVert(const cpShape *shape, int idx);
/// Get the radius of a polygon shape.
cpFloat cpPolyShapeGetRadius(const cpShape *shape);
/// @}

View File

@ -33,6 +33,9 @@ typedef struct cpNearestPointQueryInfo {
cpVect p;
/// The distance to the point. The distance is negative if the point is inside the shape.
cpFloat d;
/// The gradient of the signed distance function.
/// The same as info.p/info.d, but accurate even for very small values of info.d.
cpVect g;
} cpNearestPointQueryInfo;
/// Segment query info struct.
@ -218,6 +221,7 @@ cpSegmentShape* cpSegmentShapeInit(cpSegmentShape *seg, cpBody *body, cpVect a,
/// Allocate and initialize a segment shape.
cpShape* cpSegmentShapeNew(cpBody *body, cpVect a, cpVect b, cpFloat radius);
/// Let Chipmunk know about the geometry of adjacent segments to avoid colliding with endcaps.
void cpSegmentShapeSetNeighbors(cpShape *shape, cpVect prev, cpVect next);
CP_DeclareShapeGetter(cpSegmentShape, cpVect, A);

View File

@ -46,7 +46,7 @@ typedef cpBB (*cpSpatialIndexBBFunc)(void *obj);
/// Spatial index/object iterator callback function type.
typedef void (*cpSpatialIndexIteratorFunc)(void *obj, void *data);
/// Spatial query callback function type.
typedef void (*cpSpatialIndexQueryFunc)(void *obj1, void *obj2, void *data);
typedef cpCollisionID (*cpSpatialIndexQueryFunc)(void *obj1, void *obj2, cpCollisionID id, void *data);
/// Spatial segment query callback function type.
typedef cpFloat (*cpSpatialIndexSegmentQueryFunc)(void *obj1, void *obj2, void *data);

View File

@ -151,13 +151,14 @@ static inline cpVect cpvlerp(const cpVect v1, const cpVect v2, const cpFloat t)
/// Returns a normalized copy of v.
static inline cpVect cpvnormalize(const cpVect v)
{
return cpvmult(v, 1.0f/cpvlength(v));
// Neat trick I saw somewhere to avoid div/0.
return cpvmult(v, 1.0f/(cpvlength(v) + CPFLOAT_MIN));
}
/// Returns a normalized copy of v or cpvzero if v was already cpvzero. Protects against divide by zero errors.
/// @deprecated Just an alias for cpvnormalize() now.
static inline cpVect cpvnormalize_safe(const cpVect v)
{
return (v.x == 0.0f && v.y == 0.0f ? cpvzero : cpvnormalize(v));
return cpvnormalize(v);
}
/// Clamp v to length len.

View File

@ -16,7 +16,14 @@ if(BUILD_SHARED)
set_target_properties(chipmunk PROPERTIES LINKER_LANGUAGE CXX)
endif(MSVC)
# set the lib's version number
set_target_properties(chipmunk PROPERTIES VERSION 6.1.5)
# But avoid on Android because symlinks to version numbered .so's don't work with Android's Java-side loadLibrary.
if(NOT ANDROID)
set_target_properties(chipmunk PROPERTIES VERSION 6.2.1)
endif(NOT ANDROID)
if(ANDROID)
# need to explicitly link to the math library because the CMake/Android toolchains may not do it automatically
target_link_libraries(chipmunk m)
endif(ANDROID)
install(TARGETS chipmunk RUNTIME DESTINATION lib LIBRARY DESTINATION lib)
endif(BUILD_SHARED)

View File

@ -83,6 +83,8 @@ cpAreaForSegment(cpVect a, cpVect b, cpFloat r)
cpFloat
cpMomentForPoly(cpFloat m, const int numVerts, const cpVect *verts, cpVect offset)
{
if(numVerts == 2) return cpMomentForSegment(m, verts[0], verts[1]);
cpFloat sum1 = 0.0f;
cpFloat sum2 = 0.0f;
for(int i=0; i<numVerts; i++){

View File

@ -37,7 +37,7 @@ preStep(cpRotaryLimitJoint *joint, cpFloat dt)
}
// calculate moment of inertia coefficient.
joint->iSum = 1.0f/(1.0f/a->i + 1.0f/b->i);
joint->iSum = 1.0f/(a->i_inv + b->i_inv);
// calculate bias velocity
cpFloat maxBias = joint->constraint.maxBias;

View File

@ -72,7 +72,10 @@ typedef struct Thread {
Pair *next;
} Thread;
struct Pair { Thread a, b; };
struct Pair {
Thread a, b;
cpCollisionID id;
};
//MARK: Misc Functions
@ -205,7 +208,7 @@ PairInsert(Node *a, Node *b, cpBBTree *tree)
{
Pair *nextA = a->PAIRS, *nextB = b->PAIRS;
Pair *pair = PairFromPool(tree);
Pair temp = {{NULL, a, nextA},{NULL, b, nextB}};
Pair temp = {{NULL, a, nextA},{NULL, b, nextB}, 0};
a->PAIRS = b->PAIRS = pair;
*pair = temp;
@ -351,7 +354,7 @@ SubtreeQuery(Node *subtree, void *obj, cpBB bb, cpSpatialIndexQueryFunc func, vo
{
if(cpBBIntersects(subtree->bb, bb)){
if(NodeIsLeaf(subtree)){
func(obj, subtree->obj, data);
func(obj, subtree->obj, 0, data);
} else {
SubtreeQuery(subtree->A, obj, bb, func, data);
SubtreeQuery(subtree->B, obj, bb, func, data);
@ -428,7 +431,7 @@ MarkLeafQuery(Node *subtree, Node *leaf, cpBool left, MarkContext *context)
PairInsert(leaf, subtree, context->tree);
} else {
if(subtree->STAMP < leaf->STAMP) PairInsert(subtree, leaf, context->tree);
context->func(leaf->obj, subtree->obj, context->data);
context->func(leaf->obj, subtree->obj, 0, context->data);
}
} else {
MarkLeafQuery(subtree->A, leaf, left, context);
@ -456,7 +459,7 @@ MarkLeaf(Node *leaf, MarkContext *context)
Pair *pair = leaf->PAIRS;
while(pair){
if(leaf == pair->b.leaf){
context->func(pair->a.leaf->obj, leaf->obj, context->data);
pair->id = context->func(pair->a.leaf->obj, leaf->obj, pair->id, context->data);
pair = pair->b.next;
} else {
pair = pair->a.next;
@ -472,7 +475,7 @@ MarkSubtree(Node *subtree, MarkContext *context)
MarkLeaf(subtree, context);
} else {
MarkSubtree(subtree->A, context);
MarkSubtree(subtree->B, context);
MarkSubtree(subtree->B, context); // TODO Force TCO here?
}
}
@ -508,12 +511,12 @@ LeafUpdate(Node *leaf, cpBBTree *tree)
leaf->STAMP = GetMasterTree(tree)->stamp;
return cpTrue;
} else {
return cpFalse;
}
return cpFalse;
}
static void VoidQueryFunc(void *obj1, void *obj2, void *data){}
static cpCollisionID VoidQueryFunc(void *obj1, void *obj2, cpCollisionID id, void *data){return id;}
static void
LeafAddPairs(Node *leaf, cpBBTree *tree)
@ -864,17 +867,17 @@ NodeRender(Node *node, int depth)
// glColor3f(1.0f - v, v, 0.0f);
glLineWidth(cpfmax(5.0f - depth, 1.0f));
glBegin(GL_LINES); {
glVertex2F(bb.l, bb.b);
glVertex2F(bb.l, bb.t);
glVertex2f(bb.l, bb.b);
glVertex2f(bb.l, bb.t);
glVertex2F(bb.l, bb.t);
glVertex2F(bb.r, bb.t);
glVertex2f(bb.l, bb.t);
glVertex2f(bb.r, bb.t);
glVertex2F(bb.r, bb.t);
glVertex2F(bb.r, bb.b);
glVertex2f(bb.r, bb.t);
glVertex2f(bb.r, bb.b);
glVertex2F(bb.r, bb.b);
glVertex2F(bb.l, bb.b);
glVertex2f(bb.r, bb.b);
glVertex2f(bb.l, bb.b);
}; glEnd();
}

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,8 @@ cpPolyShapeTransformVerts(cpPolyShape *poly, cpVect p, cpVect rot)
t = cpfmax(t, v.y);
}
return cpBBNew(l, b, r, t);
cpFloat radius = poly->r;
return cpBBNew(l - radius, b - radius, r + radius, t + radius);
}
static void
@ -84,10 +85,12 @@ cpPolyShapeNearestPointQuery(cpPolyShape *poly, cpVect p, cpNearestPointQueryInf
int count = poly->numVerts;
cpSplittingPlane *planes = poly->tPlanes;
cpVect *verts = poly->tVerts;
cpFloat r = poly->r;
cpVect v0 = verts[count - 1];
cpFloat minDist = INFINITY;
cpVect closestPoint = cpvzero;
cpVect closestNormal = cpvzero;
cpBool outside = cpFalse;
for(int i=0; i<count; i++){
@ -100,14 +103,21 @@ cpPolyShapeNearestPointQuery(cpPolyShape *poly, cpVect p, cpNearestPointQueryInf
if(dist < minDist){
minDist = dist;
closestPoint = closest;
closestNormal = planes[i].n;
}
v0 = v1;
}
cpFloat dist = (outside ? minDist : -minDist);
cpVect g = cpvmult(cpvsub(p, closestPoint), 1.0f/dist);
info->shape = (cpShape *)poly;
info->p = closestPoint; // TODO div/0
info->d = (outside ? minDist : -minDist);
info->p = cpvadd(closestPoint, cpvmult(g, r));
info->d = dist - r;
// Use the normal of the closest segment if the distance is small.
info->g = (minDist > MAGIC_EPSILON ? g : closestNormal);
}
static void
@ -116,20 +126,22 @@ cpPolyShapeSegmentQuery(cpPolyShape *poly, cpVect a, cpVect b, cpSegmentQueryInf
cpSplittingPlane *axes = poly->tPlanes;
cpVect *verts = poly->tVerts;
int numVerts = poly->numVerts;
cpFloat r = poly->r;
for(int i=0; i<numVerts; i++){
cpVect n = axes[i].n;
cpFloat an = cpvdot(a, n);
if(axes[i].d > an) continue;
cpFloat d = axes[i].d + r - an;
if(d > 0.0f) continue;
cpFloat bn = cpvdot(b, n);
cpFloat t = (axes[i].d - an)/(bn - an);
cpFloat t = d/(bn - an);
if(t < 0.0f || 1.0f < t) continue;
cpVect point = cpvlerp(a, b, t);
cpFloat dt = -cpvcross(n, point);
cpFloat dtMin = -cpvcross(n, verts[i]);
cpFloat dtMax = -cpvcross(n, verts[(i+1)%numVerts]);
cpFloat dtMin = -cpvcross(n, verts[(i - 1 + numVerts)%numVerts]);
cpFloat dtMax = -cpvcross(n, verts[i]);
if(dtMin <= dt && dt <= dtMax){
info->shape = (cpShape *)poly;
@ -137,6 +149,15 @@ cpPolyShapeSegmentQuery(cpPolyShape *poly, cpVect a, cpVect b, cpSegmentQueryInf
info->n = n;
}
}
// Also check against the beveled vertexes.
if(r > 0.0f){
for(int i=0; i<numVerts; i++){
cpSegmentQueryInfo circle_info = {NULL, 1.0f, cpvzero};
CircleSegmentQuery(&poly->shape, verts[i], r, a, b, &circle_info);
if(circle_info.t < info->t) (*info) = circle_info;
}
}
}
static const cpShapeClass polyClass = {
@ -164,14 +185,14 @@ cpPolyValidate(const cpVect *verts, const int numVerts)
}
int
cpPolyShapeGetNumVerts(cpShape *shape)
cpPolyShapeGetNumVerts(const cpShape *shape)
{
cpAssertHard(shape->klass == &polyClass, "Shape is not a poly shape.");
return ((cpPolyShape *)shape)->numVerts;
}
cpVect
cpPolyShapeGetVert(cpShape *shape, int idx)
cpPolyShapeGetVert(const cpShape *shape, int idx)
{
cpAssertHard(shape->klass == &polyClass, "Shape is not a poly shape.");
cpAssertHard(0 <= idx && idx < cpPolyShapeGetNumVerts(shape), "Index out of range.");
@ -179,6 +200,13 @@ cpPolyShapeGetVert(cpShape *shape, int idx)
return ((cpPolyShape *)shape)->verts[idx];
}
cpFloat
cpPolyShapeGetRadius(const cpShape *shape)
{
cpAssertHard(shape->klass == &polyClass, "Shape is not a poly shape.");
return ((cpPolyShape *)shape)->r;
}
static void
setUpVerts(cpPolyShape *poly, int numVerts, const cpVect *verts, cpVect offset)
@ -202,21 +230,39 @@ setUpVerts(cpPolyShape *poly, int numVerts, const cpVect *verts, cpVect offset)
poly->planes[i].d = cpvdot(n, a);
}
// TODO: Why did I add this? It duplicates work from above.
for(int i=0; i<numVerts; i++){
poly->planes[i] = cpSplittingPlaneNew(poly->verts[(i - 1 + numVerts)%numVerts], poly->verts[i]);
}
}
cpPolyShape *
cpPolyShapeInit(cpPolyShape *poly, cpBody *body, int numVerts, const cpVect *verts, cpVect offset)
{
return cpPolyShapeInit2(poly, body, numVerts, verts, offset, 0.0f);
}
cpPolyShape *
cpPolyShapeInit2(cpPolyShape *poly, cpBody *body, int numVerts, const cpVect *verts, cpVect offset, cpFloat radius)
{
setUpVerts(poly, numVerts, verts, offset);
cpShapeInit((cpShape *)poly, &polyClass, body);
poly->r = radius;
return poly;
}
cpShape *
cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
cpPolyShapeNew(cpBody *body, int numVerts, const cpVect *verts, cpVect offset)
{
return (cpShape *)cpPolyShapeInit(cpPolyShapeAlloc(), body, numVerts, verts, offset);
return cpPolyShapeNew2(body, numVerts, verts, offset, 0.0f);
}
cpShape *
cpPolyShapeNew2(cpBody *body, int numVerts, const cpVect *verts, cpVect offset, cpFloat radius)
{
return (cpShape *)cpPolyShapeInit2(cpPolyShapeAlloc(), body, numVerts, verts, offset, radius);
}
cpPolyShape *
@ -230,6 +276,12 @@ cpBoxShapeInit(cpPolyShape *poly, cpBody *body, cpFloat width, cpFloat height)
cpPolyShape *
cpBoxShapeInit2(cpPolyShape *poly, cpBody *body, cpBB box)
{
return cpBoxShapeInit3(poly, body, box, 0.0f);
}
cpPolyShape *
cpBoxShapeInit3(cpPolyShape *poly, cpBody *body, cpBB box, cpFloat radius)
{
cpVect verts[] = {
cpv(box.l, box.b),
@ -238,7 +290,7 @@ cpBoxShapeInit2(cpPolyShape *poly, cpBody *body, cpBB box)
cpv(box.r, box.b),
};
return cpPolyShapeInit(poly, body, 4, verts, cpvzero);
return cpPolyShapeInit2(poly, body, 4, verts, cpvzero, radius);
}
cpShape *
@ -253,6 +305,12 @@ cpBoxShapeNew2(cpBody *body, cpBB box)
return (cpShape *)cpBoxShapeInit2(cpPolyShapeAlloc(), body, box);
}
cpShape *
cpBoxShapeNew3(cpBody *body, cpBB box, cpFloat radius)
{
return (cpShape *)cpBoxShapeInit3(cpPolyShapeAlloc(), body, box, radius);
}
// Unsafe API (chipmunk_unsafe.h)
void
@ -262,3 +320,10 @@ cpPolyShapeSetVerts(cpShape *shape, int numVerts, cpVect *verts, cpVect offset)
cpPolyShapeDestroy((cpPolyShape *)shape);
setUpVerts((cpPolyShape *)shape, numVerts, verts, offset);
}
void
cpPolyShapeSetRadius(cpShape *shape, cpFloat radius)
{
cpAssertHard(shape->klass == &polyClass, "Shape is not a poly shape.");
((cpPolyShape *)shape)->r = radius;
}

View File

@ -103,7 +103,7 @@ cpShapeUpdate(cpShape *shape, cpVect pos, cpVect rot)
cpBool
cpShapePointQuery(cpShape *shape, cpVect p){
cpNearestPointQueryInfo info = {NULL, cpvzero, INFINITY};
cpNearestPointQueryInfo info = {NULL, cpvzero, INFINITY, cpvzero};
cpShapeNearestPointQuery(shape, p, &info);
return (info.d < 0.0f);
@ -112,7 +112,7 @@ cpShapePointQuery(cpShape *shape, cpVect p){
cpFloat
cpShapeNearestPointQuery(cpShape *shape, cpVect p, cpNearestPointQueryInfo *info)
{
cpNearestPointQueryInfo blank = {NULL, cpvzero, INFINITY};
cpNearestPointQueryInfo blank = {NULL, cpvzero, INFINITY, cpvzero};
if(info){
(*info) = blank;
} else {
@ -126,7 +126,7 @@ cpShapeNearestPointQuery(cpShape *shape, cpVect p, cpNearestPointQueryInfo *info
cpBool
cpShapeSegmentQuery(cpShape *shape, cpVect a, cpVect b, cpSegmentQueryInfo *info){
cpSegmentQueryInfo blank = {NULL, 0.0f, cpvzero};
cpSegmentQueryInfo blank = {NULL, 1.0f, cpvzero};
if(info){
(*info) = blank;
} else {
@ -169,34 +169,15 @@ cpCicleShapeNearestPointQuery(cpCircleShape *circle, cpVect p, cpNearestPointQue
info->shape = (cpShape *)circle;
info->p = cpvadd(circle->tc, cpvmult(delta, r/d)); // TODO div/0
info->d = d - r;
}
static void
circleSegmentQuery(cpShape *shape, cpVect center, cpFloat r, cpVect a, cpVect b, cpSegmentQueryInfo *info)
{
cpVect da = cpvsub(a, center);
cpVect db = cpvsub(b, center);
cpFloat qa = cpvdot(da, da) - 2.0f*cpvdot(da, db) + cpvdot(db, db);
cpFloat qb = -2.0f*cpvdot(da, da) + 2.0f*cpvdot(da, db);
cpFloat qc = cpvdot(da, da) - r*r;
cpFloat det = qb*qb - 4.0f*qa*qc;
if(det >= 0.0f){
cpFloat t = (-qb - cpfsqrt(det))/(2.0f*qa);
if(0.0f<= t && t <= 1.0f){
info->shape = shape;
info->t = t;
info->n = cpvnormalize(cpvlerp(da, db, t));
}
}
// Use up for the gradient if the distance is very small.
info->g = (d > MAGIC_EPSILON ? cpvmult(delta, 1.0f/d) : cpv(0.0f, 1.0f));
}
static void
cpCircleShapeSegmentQuery(cpCircleShape *circle, cpVect a, cpVect b, cpSegmentQueryInfo *info)
{
circleSegmentQuery((cpShape *)circle, circle->tc, circle->r, a, b, info);
CircleSegmentQuery((cpShape *)circle, circle->tc, circle->r, a, b, info);
}
static const cpShapeClass cpCircleShapeClass = {
@ -270,10 +251,14 @@ cpSegmentShapeNearestPointQuery(cpSegmentShape *seg, cpVect p, cpNearestPointQue
cpVect delta = cpvsub(p, closest);
cpFloat d = cpvlength(delta);
cpFloat r = seg->r;
cpVect g = cpvmult(delta, 1.0f/d);
info->shape = (cpShape *)seg;
info->p = (d ? cpvadd(closest, cpvmult(delta, r/d)) : closest);
info->p = (d ? cpvadd(closest, cpvmult(g, r)) : closest);
info->d = d - r;
// Use the segment's normal if the distance is very small.
info->g = (d > MAGIC_EPSILON ? g : seg->n);
}
static void
@ -304,8 +289,8 @@ cpSegmentShapeSegmentQuery(cpSegmentShape *seg, cpVect a, cpVect b, cpSegmentQue
} else if(r != 0.0f){
cpSegmentQueryInfo info1 = {NULL, 1.0f, cpvzero};
cpSegmentQueryInfo info2 = {NULL, 1.0f, cpvzero};
circleSegmentQuery((cpShape *)seg, seg->ta, seg->r, a, b, &info1);
circleSegmentQuery((cpShape *)seg, seg->tb, seg->r, a, b, &info2);
CircleSegmentQuery((cpShape *)seg, seg->ta, seg->r, a, b, &info1);
CircleSegmentQuery((cpShape *)seg, seg->tb, seg->r, a, b, &info2);
if(info1.t < info2.t){
(*info) = info1;

View File

@ -362,7 +362,7 @@ query_helper(cpSpaceHash *hash, cpSpaceHashBin **bin_ptr, void *obj, cpSpatialIn
if(hand->stamp == hash->stamp || obj == other){
continue;
} else if(other){
func(obj, other, data);
func(obj, other, 0, data);
hand->stamp = hash->stamp;
} else {
// The object for this handle has been removed

View File

@ -31,8 +31,8 @@ struct PointQueryContext {
void *data;
};
static void
PointQuery(struct PointQueryContext *context, cpShape *shape, void *data)
static cpCollisionID
PointQuery(struct PointQueryContext *context, cpShape *shape, cpCollisionID id, void *data)
{
if(
!(shape->group && context->group == shape->group) && (context->layers&shape->layers) &&
@ -40,6 +40,8 @@ PointQuery(struct PointQueryContext *context, cpShape *shape, void *data)
){
context->func(shape, context->data);
}
return id;
}
void
@ -79,8 +81,8 @@ struct NearestPointQueryContext {
cpSpaceNearestPointQueryFunc func;
};
static void
NearestPointQuery(struct NearestPointQueryContext *context, cpShape *shape, void *data)
static cpCollisionID
NearestPointQuery(struct NearestPointQueryContext *context, cpShape *shape, cpCollisionID id, void *data)
{
if(
!(shape->group && context->group == shape->group) && (context->layers&shape->layers)
@ -90,6 +92,8 @@ NearestPointQuery(struct NearestPointQueryContext *context, cpShape *shape, void
if(info.shape && info.d < context->maxDistance) context->func(shape, info.d, info.p, data);
}
return id;
}
void
@ -104,8 +108,8 @@ cpSpaceNearestPointQuery(cpSpace *space, cpVect point, cpFloat maxDistance, cpLa
} cpSpaceUnlock(space, cpTrue);
}
static void
NearestPointQueryNearest(struct NearestPointQueryContext *context, cpShape *shape, cpNearestPointQueryInfo *out)
static cpCollisionID
NearestPointQueryNearest(struct NearestPointQueryContext *context, cpShape *shape, cpCollisionID id, cpNearestPointQueryInfo *out)
{
if(
!(shape->group && context->group == shape->group) && (context->layers&shape->layers) && !shape->sensor
@ -115,12 +119,14 @@ NearestPointQueryNearest(struct NearestPointQueryContext *context, cpShape *shap
if(info.d < out->d) (*out) = info;
}
return id;
}
cpShape *
cpSpaceNearestPointQueryNearest(cpSpace *space, cpVect point, cpFloat maxDistance, cpLayers layers, cpGroup group, cpNearestPointQueryInfo *out)
{
cpNearestPointQueryInfo info = {NULL, cpvzero, maxDistance};
cpNearestPointQueryInfo info = {NULL, cpvzero, maxDistance, cpvzero};
if(out){
(*out) = info;
} else {
@ -228,8 +234,8 @@ struct BBQueryContext {
cpSpaceBBQueryFunc func;
};
static void
BBQuery(struct BBQueryContext *context, cpShape *shape, void *data)
static cpCollisionID
BBQuery(struct BBQueryContext *context, cpShape *shape, cpCollisionID id, void *data)
{
if(
!(shape->group && context->group == shape->group) && (context->layers&shape->layers) &&
@ -237,6 +243,8 @@ BBQuery(struct BBQueryContext *context, cpShape *shape, void *data)
){
context->func(shape, data);
}
return id;
}
void
@ -259,24 +267,24 @@ struct ShapeQueryContext {
};
// Callback from the spatial hash.
static void
ShapeQuery(cpShape *a, cpShape *b, struct ShapeQueryContext *context)
static cpCollisionID
ShapeQuery(cpShape *a, cpShape *b, cpCollisionID id, struct ShapeQueryContext *context)
{
// Reject any of the simple cases
if(
(a->group && a->group == b->group) ||
!(a->layers & b->layers) ||
a == b
) return;
) return id;
cpContact contacts[CP_MAX_CONTACTS_PER_ARBITER];
int numContacts = 0;
// Shape 'a' should have the lower shape type. (required by cpCollideShapes() )
if(a->klass->type <= b->klass->type){
numContacts = cpCollideShapes(a, b, contacts);
numContacts = cpCollideShapes(a, b, &id, contacts);
} else {
numContacts = cpCollideShapes(b, a, contacts);
numContacts = cpCollideShapes(b, a, &id, contacts);
for(int i=0; i<numContacts; i++) contacts[i].n = cpvneg(contacts[i].n);
}
@ -296,6 +304,8 @@ ShapeQuery(cpShape *a, cpShape *b, struct ShapeQueryContext *context)
context->func(b, &set, context->data);
}
}
return id;
}
cpBool

View File

@ -219,19 +219,20 @@ queryReject(cpShape *a, cpShape *b)
}
// Callback from the spatial hash.
void
cpSpaceCollideShapes(cpShape *a, cpShape *b, cpSpace *space)
cpCollisionID
cpSpaceCollideShapes(cpShape *a, cpShape *b, cpCollisionID id, cpSpace *space)
{
// Reject any of the simple cases
if(queryReject(a,b)) return;
if(queryReject(a,b)) return id;
cpCollisionHandler *handler = cpSpaceLookupHandler(space, a->collision_type, b->collision_type);
cpBool sensor = a->sensor || b->sensor;
if(sensor && handler == &cpDefaultCollisionHandler) return;
if(sensor && handler == &cpDefaultCollisionHandler) return id;
// Shape 'a' should have the lower shape type. (required by cpCollideShapes() )
if(a->klass->type > b->klass->type){
// TODO remove me: a < b comparison is for debugging collisions
if(a->klass->type > b->klass->type || (a->klass->type == b->klass->type && a < b)){
cpShape *temp = a;
a = b;
b = temp;
@ -239,8 +240,8 @@ cpSpaceCollideShapes(cpShape *a, cpShape *b, cpSpace *space)
// Narrow-phase collision detection.
cpContact *contacts = cpContactBufferGetArray(space);
int numContacts = cpCollideShapes(a, b, contacts);
if(!numContacts) return; // Shapes are not colliding.
int numContacts = cpCollideShapes(a, b, &id, contacts);
if(!numContacts) return id; // Shapes are not colliding.
cpSpacePushContacts(space, numContacts);
// Get an arbiter from space->arbiterSet for the two shapes.
@ -277,6 +278,7 @@ cpSpaceCollideShapes(cpShape *a, cpShape *b, cpSpace *space)
// Time stamp the arbiter so we know it was used recently.
arb->stamp = space->stamp;
return id;
}
// Hashset filter func to throw away old arbiters.

View File

@ -183,7 +183,7 @@ cpSweep1DQuery(cpSweep1D *sweep, void *obj, cpBB bb, cpSpatialIndexQueryFunc fun
TableCell *table = sweep->table;
for(int i=0, count=sweep->num; i<count; i++){
TableCell cell = table[i];
if(BoundsOverlap(bounds, cell.bounds) && obj != cell.obj) func(obj, cell.obj, data);
if(BoundsOverlap(bounds, cell.bounds) && obj != cell.obj) func(obj, cell.obj, 0, data);
}
}
@ -223,7 +223,7 @@ cpSweep1DReindexQuery(cpSweep1D *sweep, cpSpatialIndexQueryFunc func, void *data
cpFloat max = cell.bounds.max;
for(int j=i+1; table[j].bounds.min < max && j<count; j++){
func(cell.obj, table[j].obj, data);
func(cell.obj, table[j].obj, 0, data);
}
}

View File

@ -1 +1 @@
fa70974de744fb12ec4f753989e6e0a7eb9fc73a
d53bc7d6e68a49984c5971344f59bba8414d142b

View File

@ -32,7 +32,7 @@ ChipmunkTestLayer::ChipmunkTestLayer()
// title
auto label = LabelTTF::create("Multi touch the screen", "Marker Felt", 36);
label->setPosition(Point( VisibleRect::center().x, VisibleRect::top().y - 30));
label->setPosition(cocos2d::Point( VisibleRect::center().x, VisibleRect::top().y - 30));
this->addChild(label, -1);
// reset button
@ -52,7 +52,7 @@ ChipmunkTestLayer::ChipmunkTestLayer()
#endif
addChild(parent, 0, kTagParentNode);
addNewSpriteAtPosition(Point(200,200));
addNewSpriteAtPosition(cocos2d::Point(200,200));
// menu for debug layer
MenuItemFont::setFontSize(18);
@ -60,7 +60,7 @@ ChipmunkTestLayer::ChipmunkTestLayer()
auto menu = Menu::create(item, NULL);
this->addChild(menu);
menu->setPosition(Point(VisibleRect::right().x-100, VisibleRect::top().y-60));
menu->setPosition(cocos2d::Point(VisibleRect::right().x-100, VisibleRect::top().y-60));
scheduleUpdate();
#else
@ -160,7 +160,7 @@ void ChipmunkTestLayer::createResetButton()
auto menu = Menu::create(reset, NULL);
menu->setPosition(Point(VisibleRect::center().x, VisibleRect::bottom().y + 30));
menu->setPosition(cocos2d::Point(VisibleRect::center().x, VisibleRect::bottom().y + 30));
this->addChild(menu, -1);
}
@ -174,7 +174,7 @@ void ChipmunkTestLayer::reset(Ref* sender)
s->release();
}
void ChipmunkTestLayer::addNewSpriteAtPosition(Point pos)
void ChipmunkTestLayer::addNewSpriteAtPosition(cocos2d::Point pos)
{
#if CC_ENABLE_CHIPMUNK_INTEGRATION
int posx, posy;
@ -205,7 +205,7 @@ void ChipmunkTestLayer::addNewSpriteAtPosition(Point pos)
shape->e = 0.5f; shape->u = 0.5f;
cpSpaceAddShape(_space, shape);
auto sprite = PhysicsSprite::createWithTexture(_spriteTexture, Rect(posx, posy, 85, 121));
auto sprite = PhysicsSprite::createWithTexture(_spriteTexture, cocos2d::Rect(posx, posy, 85, 121));
parent->addChild(sprite);
sprite->setCPBody(body);
@ -242,7 +242,7 @@ void ChipmunkTestLayer::onAcceleration(Acceleration* acc, Event* event)
prevX = accelX;
prevY = accelY;
auto v = Point( accelX, accelY);
auto v = cocos2d::Point( accelX, accelY);
v = v * 200;
_space->gravity = cpv(v.x, v.y);
}

View File

@ -21,7 +21,7 @@ public:
void createResetButton();
void reset(Ref* sender);
void addNewSpriteAtPosition(Point p);
void addNewSpriteAtPosition(cocos2d::Point p);
void update(float dt);
void toggleDebugCallback(Ref* sender);
void onTouchesEnded(const std::vector<Touch*>& touches, Event* event);

View File

@ -1040,7 +1040,7 @@ void TestColliderDetector::update(float delta)
float minx = 0, miny = 0, maxx = 0, maxy = 0;
size_t length = vertexList.size();
for (int i = 0; i<length; i++)
for (size_t i = 0; i<length; i++)
{
Point vertex = vertexList.at(i);
if (i == 0)

View File

@ -48,7 +48,7 @@ void CustomImageView::initRenderer()
ImageView::initRenderer();
_label = LabelTTF::create();
CCNodeRGBA::addChild(_label, getZOrder() + 1, -1);
CCNodeRGBA::addChild(_label, getLocalZOrder() + 1, -1);
}
void CustomImageView::setText(const std::string &text)

View File

@ -72,7 +72,7 @@ void CustomParticleWidget::setParticlePlist(const char *plist)
_emitter->removeFromParent();
_emitter = ParticleSystemQuad::create(plist);
}
Node::addChild(_emitter , getZOrder() + 1, -1);
Node::addChild(_emitter , getLocalZOrder() + 1, -1);
_emitterPlist = plist;
}

View File

@ -39,7 +39,7 @@ bool UILayoutTest_Editor::init()
left_button->getSize().height));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -47,7 +47,7 @@ bool UILayoutTest_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -94,7 +94,7 @@ bool UILayoutTest_Color_Editor::init()
left_button->getSize().height));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -102,7 +102,7 @@ bool UILayoutTest_Color_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -149,7 +149,7 @@ bool UILayoutTest_Gradient_Editor::init()
left_button->getSize().height));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -157,7 +157,7 @@ bool UILayoutTest_Gradient_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -204,7 +204,7 @@ bool UILayoutTest_BackGroundImage_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -212,7 +212,7 @@ bool UILayoutTest_BackGroundImage_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -259,7 +259,7 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init()
left_button->getSize().height));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -267,7 +267,7 @@ bool UILayoutTest_BackGroundImage_Scale9_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -314,7 +314,7 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -322,7 +322,7 @@ bool UILayoutTest_Layout_Linear_Vertical_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -369,7 +369,7 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -377,7 +377,7 @@ bool UILayoutTest_Layout_Linear_Horizontal_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -425,7 +425,7 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -433,7 +433,7 @@ bool UILayoutTest_Layout_Relative_Align_Parent_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -480,7 +480,7 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -488,7 +488,7 @@ bool UILayoutTest_Layout_Relative_Location_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);

View File

@ -42,7 +42,7 @@ bool UIListViewTest_Vertical_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -50,7 +50,7 @@ bool UIListViewTest_Vertical_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -98,7 +98,7 @@ bool UIListViewTest_Horizontal_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -106,7 +106,7 @@ bool UIListViewTest_Horizontal_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
return true;

View File

@ -40,7 +40,7 @@ bool UIPageViewTest_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -48,7 +48,7 @@ bool UIPageViewTest_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);

View File

@ -36,7 +36,7 @@ bool UIRichTextTest::init()
button->setTitleText("switch");
button->setPosition(Point(widgetSize.width / 2.0f, widgetSize.height / 2.0f + button->getSize().height * 2.5));
button->addTouchEventListener(this, toucheventselector(UIRichTextTest::touchEvent));
button->setZOrder(10);
button->setLocalZOrder(10);
_widget->addChild(button);
@ -69,7 +69,7 @@ bool UIRichTextTest::init()
_richText->pushBackElement(re6);
_richText->setPosition(Point(widgetSize.width / 2, widgetSize.height / 2));
_richText->setZOrder(10);
_richText->setLocalZOrder(10);
_widget->addChild(_richText);

View File

@ -39,7 +39,7 @@ bool UIScrollViewTest_Vertical_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -47,7 +47,7 @@ bool UIScrollViewTest_Vertical_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -94,7 +94,7 @@ bool UIScrollViewTest_Horizontal_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -102,7 +102,7 @@ bool UIScrollViewTest_Horizontal_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);
@ -149,7 +149,7 @@ bool UIScrollViewTest_Both_Editor::init()
left_button->getSize().height * 0.625));
left_button->setTouchEnabled(true);
left_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::previousCallback));
left_button->setZOrder(_layout->getZOrder() + 1);
left_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(left_button);
Button* right_button = Button::create();
@ -157,7 +157,7 @@ bool UIScrollViewTest_Both_Editor::init()
right_button->setPosition(Point(_layout->getSize().width / 2 + right_button->getSize().width,
right_button->getSize().height * 0.625));
right_button->setTouchEnabled(true);
right_button->setZOrder(_layout->getZOrder() + 1);
right_button->setLocalZOrder(_layout->getLocalZOrder() + 1);
right_button->addTouchEventListener(this, toucheventselector(UIScene_Editor::nextCallback));
_layout->addChild(right_button);

View File

@ -336,7 +336,7 @@ void UITextFieldTest_LineWrap::textFieldEvent(Ref *pSender, TextFiledEventType t
{
TextField* textField = dynamic_cast<TextField*>(pSender);
Size widgetSize = _widget->getSize();
textField->runAction(CCMoveTo::create(0.225,
textField->runAction(CCMoveTo::create(0.225f,
Point(widgetSize.width / 2.0f, widgetSize.height / 2.0f + textField->getContentSize().height / 2)));
textField->setTextHorizontalAlignment(TextHAlignment::LEFT);
textField->setTextVerticalAlignment(TextVAlignment::TOP);
@ -349,7 +349,7 @@ void UITextFieldTest_LineWrap::textFieldEvent(Ref *pSender, TextFiledEventType t
{
TextField* textField = dynamic_cast<TextField*>(pSender);
Size widgetSize = _widget->getSize();
textField->runAction(CCMoveTo::create(0.175, Point(widgetSize.width / 2.0f, widgetSize.height / 2.0f)));
textField->runAction(CCMoveTo::create(0.175f, Point(widgetSize.width / 2.0f, widgetSize.height / 2.0f)));
textField->setTextHorizontalAlignment(TextHAlignment::CENTER);
textField->setTextVerticalAlignment(TextVAlignment::CENTER);

View File

@ -37,7 +37,7 @@ bool UIWidgetAddNodeTest_Editor::init()
// Create the ui widget
Widget* widget = Widget::create();
widget->setPosition(Point(rootSize.width / 2.0f, rootSize.height / 2.0f));
widget->setZOrder(_layout->getZOrder() + 1);
widget->setLocalZOrder(_layout->getLocalZOrder() + 1);
_layout->addChild(widget);
Sprite* sprite = Sprite::create("cocosui/ccicon.png");

View File

@ -199,7 +199,7 @@ void TMoveBy::serialize(const rapidjson::Value &val)
}
else if (key == "IsReverse")
{
_reverse = (bool)(DICTOOL->getIntValue_json(subDict, "value"));
_reverse = DICTOOL->getIntValue_json(subDict, "value") ? true : false;
continue;
}
}
@ -337,7 +337,7 @@ void TRotateBy::serialize(const rapidjson::Value &val)
}
else if (key == "IsReverse")
{
_reverse = (int)(DICTOOL->getIntValue_json(subDict, "value"));
_reverse = (DICTOOL->getIntValue_json(subDict, "value")) ? true : false;
continue;
}
}
@ -483,7 +483,7 @@ void TScaleBy::serialize(const rapidjson::Value &val)
}
else if (key == "IsReverse")
{
_reverse = (bool)(DICTOOL->getIntValue_json(subDict, "value"));
_reverse = (DICTOOL->getIntValue_json(subDict, "value")) ? true : false;
continue;
}
}
@ -629,7 +629,7 @@ void TSkewBy::serialize(const rapidjson::Value &val)
}
else if (key == "IsReverse")
{
_reverse = (bool)(DICTOOL->getIntValue_json(subDict, "value"));
_reverse = DICTOOL->getIntValue_json(subDict, "value") ? true : false;
}
}
}

View File

@ -255,7 +255,7 @@ void NodeVisible::serialize(const rapidjson::Value &val)
}
else if (key == "Visible")
{
_visible = DICTOOL->getIntValue_json(subDict, "value");
_visible = DICTOOL->getIntValue_json(subDict, "value") ? true : false;
continue;
}
}

View File

@ -1547,7 +1547,11 @@ TTFFontShadowAndStroke::TTFFontShadowAndStroke()
strokeShaodwTextDef._fontFillColor = tintColorBlue;
// shadow + stroke label
auto fontStrokeAndShadow = LabelTTF::createWithFontDefinition("Stroke & Shadow Blue Text", strokeShaodwTextDef);
#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
auto fontStrokeAndShadow = LabelTTF::createWithFontDefinition("Stroke && Shadow Blue Text", strokeShaodwTextDef);
#else
auto fontStrokeAndShadow = LabelTTF::createWithFontDefinition("Stroke &Shadow Blue Text", strokeShaodwTextDef);
#endif
// add label to the scene
this->addChild(fontStrokeAndShadow);

View File

@ -845,7 +845,7 @@ void PhysicsDemoJoints::onEnter()
_scene->getPhysicsWorld()->addJoint(PhysicsJointPin::construct(sp1->getPhysicsBody(), box, sp1->getPosition()));
_scene->getPhysicsWorld()->addJoint(PhysicsJointPin::construct(sp2->getPhysicsBody(), box, sp2->getPosition()));
PhysicsJointRotaryLimit* joint = PhysicsJointRotaryLimit::construct(sp1->getPhysicsBody(), sp2->getPhysicsBody(), 0.0f, M_PI_2);
PhysicsJointRotaryLimit* joint = PhysicsJointRotaryLimit::construct(sp1->getPhysicsBody(), sp2->getPhysicsBody(), 0.0f,(float) M_PI_2);
_scene->getPhysicsWorld()->addJoint(joint);
this->addChild(sp1);
@ -861,7 +861,7 @@ void PhysicsDemoJoints::onEnter()
_scene->getPhysicsWorld()->addJoint(PhysicsJointPin::construct(sp1->getPhysicsBody(), box, sp1->getPosition()));
_scene->getPhysicsWorld()->addJoint(PhysicsJointPin::construct(sp2->getPhysicsBody(), box, sp2->getPosition()));
PhysicsJointRatchet* joint = PhysicsJointRatchet::construct(sp1->getPhysicsBody(), sp2->getPhysicsBody(), 0.0f, M_PI_2);
PhysicsJointRatchet* joint = PhysicsJointRatchet::construct(sp1->getPhysicsBody(), sp2->getPhysicsBody(), 0.0f, (float)M_PI_2);
_scene->getPhysicsWorld()->addJoint(joint);
this->addChild(sp1);
@ -893,7 +893,7 @@ void PhysicsDemoJoints::onEnter()
_scene->getPhysicsWorld()->addJoint(PhysicsJointPin::construct(sp1->getPhysicsBody(), box, sp1->getPosition()));
_scene->getPhysicsWorld()->addJoint(PhysicsJointPin::construct(sp2->getPhysicsBody(), box, sp2->getPosition()));
PhysicsJointMotor* joint = PhysicsJointMotor::construct(sp1->getPhysicsBody(), sp2->getPhysicsBody(), M_PI_2);
PhysicsJointMotor* joint = PhysicsJointMotor::construct(sp1->getPhysicsBody(), sp2->getPhysicsBody(), (float)M_PI_2);
_scene->getPhysicsWorld()->addJoint(joint);
this->addChild(sp1);
@ -1445,7 +1445,7 @@ void PhysicsContactTest::resetTest()
label->setPosition(Point(s.width/2, s.height-170));
auto wall = Node::create();
wall->setPhysicsBody(PhysicsBody::createEdgeBox(VisibleRect::getVisibleRect().size, PhysicsMaterial(0.1, 1, 0.0)));
wall->setPhysicsBody(PhysicsBody::createEdgeBox(VisibleRect::getVisibleRect().size, PhysicsMaterial(0.1f, 1, 0.0f)));
wall->setPosition(VisibleRect::center());
root->addChild(wall);
@ -1463,7 +1463,7 @@ void PhysicsContactTest::resetTest()
position.y = position.y * CCRANDOM_0_1();
position = VisibleRect::leftBottom() + position + Point(size.width/2, size.height/2);
Vect velocity((CCRANDOM_0_1() - 0.5)*200, (CCRANDOM_0_1() - 0.5)*200);
auto box = makeBox(position, size, 1, PhysicsMaterial(0.1, 1, 0.0));
auto box = makeBox(position, size, 1, PhysicsMaterial(0.1f, 1, 0.0f));
box->getPhysicsBody()->setVelocity(velocity);
box->getPhysicsBody()->setCategoryBitmask(0x01); // 0001
box->getPhysicsBody()->setContactTestBitmask(0x04); // 0100
@ -1481,7 +1481,7 @@ void PhysicsContactTest::resetTest()
position.y = position.y * CCRANDOM_0_1();
position = VisibleRect::leftBottom() + position + Point(size.width/2, size.height/2);
Vect velocity((CCRANDOM_0_1() - 0.5)*200, (CCRANDOM_0_1() - 0.5)*200);
auto box = makeBox(position, size, 2, PhysicsMaterial(0.1, 1, 0.0));
auto box = makeBox(position, size, 2, PhysicsMaterial(0.1f, 1, 0.0f));
box->getPhysicsBody()->setVelocity(velocity);
box->getPhysicsBody()->setCategoryBitmask(0x02); // 0010
box->getPhysicsBody()->setContactTestBitmask(0x08); // 1000
@ -1499,7 +1499,7 @@ void PhysicsContactTest::resetTest()
position.y = position.y * CCRANDOM_0_1();
position = VisibleRect::leftBottom() + position + Point(size.width/2, size.height/2);
Vect velocity((CCRANDOM_0_1() - 0.5)*300, (CCRANDOM_0_1() - 0.5)*300);
auto triangle = makeTriangle(position, size, 1, PhysicsMaterial(0.1, 1, 0.0));
auto triangle = makeTriangle(position, size, 1, PhysicsMaterial(0.1f, 1, 0.0f));
triangle->getPhysicsBody()->setVelocity(velocity);
triangle->getPhysicsBody()->setCategoryBitmask(0x04); // 0100
triangle->getPhysicsBody()->setContactTestBitmask(0x01); // 0001
@ -1517,7 +1517,7 @@ void PhysicsContactTest::resetTest()
position.y = position.y * CCRANDOM_0_1();
position = VisibleRect::leftBottom() + position + Point(size.width/2, size.height/2);
Vect velocity((CCRANDOM_0_1() - 0.5)*300, (CCRANDOM_0_1() - 0.5)*300);
auto triangle = makeTriangle(position, size, 2, PhysicsMaterial(0.1, 1, 0.0));
auto triangle = makeTriangle(position, size, 2, PhysicsMaterial(0.1f, 1, 0.0f));
triangle->getPhysicsBody()->setVelocity(velocity);
triangle->getPhysicsBody()->setCategoryBitmask(0x08); // 1000
triangle->getPhysicsBody()->setContactTestBitmask(0x02); // 0010
@ -1566,7 +1566,7 @@ void PhysicsPositionRotationTest::onEnter()
// anchor test
auto anchorNode = Sprite::create("Images/YellowSquare.png");
anchorNode->setAnchorPoint(Point(0.1, 0.9));
anchorNode->setAnchorPoint(Point(0.1f, 0.9f));
anchorNode->setPosition(100, 100);
anchorNode->setScale(0.25);
anchorNode->setPhysicsBody(PhysicsBody::createBox(anchorNode->getContentSize()*anchorNode->getScale()));

View File

@ -314,9 +314,9 @@ RenderTextureZbuffer::RenderTextureZbuffer()
label3->setPosition(Point(size.width / 2, size.height * 0.75f));
this->addChild(label3);
label->setVertexZ(50);
label2->setVertexZ(0);
label3->setVertexZ(-50);
label->setPositionZ(50);
label2->setPositionZ(0);
label3->setPositionZ(-50);
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Images/bugs/circle.plist");
mgr = SpriteBatchNode::create("Images/bugs/circle.png", 9);
@ -341,15 +341,15 @@ RenderTextureZbuffer::RenderTextureZbuffer()
mgr->addChild(sp8, 2);
mgr->addChild(sp9, 1);
sp1->setVertexZ(400);
sp2->setVertexZ(300);
sp3->setVertexZ(200);
sp4->setVertexZ(100);
sp5->setVertexZ(0);
sp6->setVertexZ(-100);
sp7->setVertexZ(-200);
sp8->setVertexZ(-300);
sp9->setVertexZ(-400);
sp1->setPositionZ(400);
sp2->setPositionZ(300);
sp3->setPositionZ(200);
sp4->setPositionZ(100);
sp5->setPositionZ(0);
sp6->setPositionZ(-100);
sp7->setPositionZ(-200);
sp8->setPositionZ(-300);
sp9->setPositionZ(-400);
sp9->setScale(2);
sp9->setColor(Color3B::YELLOW);

View File

@ -1 +1 @@
4bb0b2a6151e4910ea662bedd91a5be655ec05d1
4d17613c96e30631ec5da21b2629fa3d0fc39f2d

View File

@ -38,6 +38,7 @@ static std::function<Layer*()> createFunctions[] =
{
CL(TexturePVRv3Premult),
CL(TextureMipMap),
CL(TextureMemoryAlloc),
CL(TextureAlias),
CL(TexturePVRMipMap),

View File

@ -285,7 +285,7 @@ TMXOrthoTest::TMXOrthoTest()
Size CC_UNUSED s = map->getContentSize();
CCLOG("ContentSize: %f, %f", s.width,s.height);
auto scale = ScaleBy::create(10, 0.1);
auto scale = ScaleBy::create(10, 0.1f);
auto back = scale->reverse();
auto seq = Sequence::create(scale, back, NULL);
auto repeat = RepeatForever::create(seq);
@ -1086,7 +1086,7 @@ void TMXIsoVertexZ::repositionSprite(float dt)
auto p = _tamara->getPosition();
p = CC_POINT_POINTS_TO_PIXELS(p);
float newZ = -(p.y+32) /16;
_tamara->setVertexZ( newZ );
_tamara->setPositionZ( newZ );
}
void TMXIsoVertexZ::onEnter()
@ -1132,7 +1132,7 @@ TMXOrthoVertexZ::TMXOrthoVertexZ()
// can use any Sprite and it will work OK.
auto layer = map->getLayer("trees");
_tamara = layer->getTileAt(Point(0,11));
CCLOG("%p vertexZ: %f", _tamara, _tamara->getVertexZ());
CCLOG("%p vertexZ: %f", _tamara, _tamara->getPositionZ());
_tamara->retain();
auto move = MoveBy::create(10, Point(400,450) * (1/CC_CONTENT_SCALE_FACTOR()));
@ -1155,7 +1155,7 @@ void TMXOrthoVertexZ::repositionSprite(float dt)
// map size: 12x12
auto p = _tamara->getPosition();
p = CC_POINT_POINTS_TO_PIXELS(p);
_tamara->setVertexZ( -( (p.y+81) /81) );
_tamara->setPositionZ( -( (p.y+81) /81) );
}
void TMXOrthoVertexZ::onEnter()

View File

@ -24,6 +24,8 @@
#include "VisibleRect.h"
USING_NS_CC;
Rect VisibleRect::s_visibleRect;
void VisibleRect::lazyInit()

View File

@ -2,25 +2,24 @@
#define __VISIBLERECT_H__
#include "cocos2d.h"
USING_NS_CC;
class VisibleRect
{
public:
static Rect getVisibleRect();
static cocos2d::Rect getVisibleRect();
static Point left();
static Point right();
static Point top();
static Point bottom();
static Point center();
static Point leftTop();
static Point rightTop();
static Point leftBottom();
static Point rightBottom();
static cocos2d::Point left();
static cocos2d::Point right();
static cocos2d::Point top();
static cocos2d::Point bottom();
static cocos2d::Point center();
static cocos2d::Point leftTop();
static cocos2d::Point rightTop();
static cocos2d::Point leftBottom();
static cocos2d::Point rightBottom();
private:
static void lazyInit();
static Rect s_visibleRect;
static cocos2d::Rect s_visibleRect;
};
#endif /* __VISIBLERECT_H__ */

View File

@ -185,8 +185,8 @@ void ZwoptexGenericTest::flipSprites(float dt)
char str2[32] = {0};
sprintf(str1, "grossini_dance_%02d.png", spriteFrameIndex);
sprintf(str2, "grossini_dance_generic_%02d.png", spriteFrameIndex);
sprite1->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(str1));
sprite2->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(str2));
sprite1->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(str1));
sprite2->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(str2));
}
ZwoptexGenericTest::~ZwoptexGenericTest()

View File

@ -23,6 +23,8 @@ ELAPSEDSECS=`date +%s`
COCOS_BRANCH="update_lua_bindings_$ELAPSEDSECS"
COCOS_ROBOT_REMOTE="https://${GH_USER}:${GH_PASSWORD}@github.com/${GH_USER}/cocos2d-x.git"
PULL_REQUEST_REPO="https://api.github.com/repos/cocos2d/cocos2d-x/pulls"
FETCH_REMOTE_BRANCH="develop"
COMMIT_PATH="cocos/scripting/lua-bindings/auto"
# Exit on error
set -e
@ -88,12 +90,14 @@ pushd "$PROJECT_ROOT"
git status
echo
echo Comparing with HEAD ...
echo Comparing with origin HEAD ...
echo
git fetch origin ${FETCH_REMOTE_BRANCH}
# Don't exit on non-zero return value
set +e
git diff --stat --exit-code
git diff FETCH_HEAD --stat --exit-code ${COMMIT_PATH}
DIFF_RETVAL=$?
if [ $DIFF_RETVAL -eq 0 ]

View File

@ -6,6 +6,8 @@ PROJECT_ROOT="$DIR"/../..
COMMITTAG="[AUTO][ci skip]: updating cocos2dx_files.json"
PUSH_REPO="https://api.github.com/repos/cocos2d/cocos2d-x/pulls"
OUTPUT_FILE_PATH="${PROJECT_ROOT}/templates/cocos2dx_files.json"
FETCH_REMOTE_BRANCH="develop"
COMMIT_PATH="templates/cocos2dx_files.json"
# Exit on error
set -e
@ -51,12 +53,14 @@ pushd "$PROJECT_ROOT"
git status
echo
echo Comparing with HEAD ...
echo Comparing with origin HEAD ...
echo
git fetch origin ${FETCH_REMOTE_BRANCH}
# Don't exit on non-zero return value
set +e
git diff --stat --exit-code
git diff FETCH_HEAD --stat --exit-code ${COMMIT_PATH}
DIFF_RETVAL=$?
if [ $DIFF_RETVAL -eq 0 ]