mirror of https://github.com/axmolengine/axmol.git
Scale9Sprite refactor (#16891)
* Squashed commit of the following: commit 026eee59c9ece7fc59d71fead41104f375f72eb5 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Nov 22 21:45:12 2016 -0800 yay! everything works! commit a645c99d44f0d7674e6238afae7628d8d2a030b1 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Nov 22 14:55:31 2016 -0800 more fixes in Scale9Sprite commit 3a688f4ea70c0abe311232c65ed14a7e9acc7611 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 21 23:06:45 2016 -0800 rotated sprites commit 45e2085df3aa4b52236c817f7db7c1f6602c1e95 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 21 17:10:44 2016 -0800 android patch 9: fixes is not 100% backward compatible since the previous version had some artifacts. fixed the artifacts. now it renders ok commit 4655d894387fa40a7e63b074a36bfed20e41d5f9 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 21 16:31:29 2016 -0800 sprite: correct size for "fake scale9" commit cb98aba27cc1c82a986268d5b74afb55b6cca2f3 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Nov 18 21:55:51 2016 -0800 sprite: adds setStrechEnabled for backward compatibility and other fixes commit c0fe67aac54cd62e3846810d56f87133f3a7343b Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Nov 18 18:49:42 2016 -0800 implemts missing functions in scale9sprite commit e471ef318725ccabc9eca2c062e285e9ca4f9a81 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Nov 18 18:42:30 2016 -0800 "batched" works commit 33124bfb14d1f275d4b0ffca8989975625a8a76d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 16 18:59:38 2016 -0800 more fixes commit 149f8206269843af63a1739885c00ed8d94c239c Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 16 18:37:12 2016 -0800 scale 9 rotated not fixed yet. but making progress commit 27f98275d94ce00c8d5ff0b6f74b5c22723cc3c3 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 16 15:32:57 2016 -0800 sprite: streching works ok with normal sprites commit 2519498cac8b77a32dee5bdf1805be56fbda5ed6 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 16 12:12:28 2016 -0800 somes fixes... still not working commit 43580d0b4aa976b0200717611a286bf1035c472d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Nov 15 23:15:22 2016 -0800 more bug fixes related to untrimmed setCenterRect... ...in SCale9Sprite commit 407247616e506afaa0415c58ad7fce38efed0cd9 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Nov 15 22:13:38 2016 -0800 spritecale9: untrimmed vs. trimmed capInsets WIP. there still a few bugs commit 3d845b2af3500be287fabb04bb6ba0ec04dbb401 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 14 23:11:17 2016 -0800 started progressbar commit 0a44b00daf723869b7105689890f29cd53a62608 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 14 17:43:23 2016 -0800 adds EditBox test commit 330304bd9b2e762de95c2f27f1ae3ceee83b2fbf Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 9 16:57:08 2016 -0800 adds elastic to scroll view commit a06a35f8691ff56a143953c44acd947b519150b6 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 9 15:58:29 2016 -0800 yay! scrollview works commit 37748a885c62eca8c00d2c9c11ee103f1d95e71c Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 9 15:33:58 2016 -0800 yet more scrollview fixes commit a6e563b497adef7b141ac7c92c844d479b244c59 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 9 14:48:28 2016 -0800 initial scroll view commit 4243edd7548e5533ca03c26d5042f8dc5517445a Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Nov 8 17:50:15 2016 -0800 sanity check in frames. missing files commit 159d88603ad22f3c01761b60bacec98d52b9041d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 7 19:21:00 2016 -0800 three buttons working commit 6764cfc7937a1a81d6993d5e32a21f17457b8e0d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 7 18:50:22 2016 -0800 missing files commit 11c1fa3812e706a7d34137fe2626f05ab73ee3e6 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 7 18:49:59 2016 -0800 button works! commit 26b6de4c28fc973e332dd51fcd763a6249c0b4c2 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 7 18:19:47 2016 -0800 Scale9: more fixes. complies with odd Rect::ZERO behavior commit ce561268096afe322f25034eeab3508a60027afd Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Nov 7 11:50:42 2016 -0800 label: setTitleLabel commit 51b5536cd2af36896002621f75c7310960c3f5e7 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 2 17:41:08 2016 -0700 UIButton kind of working commit 7562a49a761ef70c383a99d2addefc63d77e279f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 2 11:11:42 2016 -0700 missing resoruces commit a9890dee5da0104bff6872cc04e8786a6c0a9018 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 2 10:54:55 2016 -0700 setCenterRect to .cpp file commit c9c4bb55ed3fc55709eca46c43d1bfe5301c317f Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Nov 2 00:19:51 2016 -0700 removed unused paramter commit e47732934cca79c08e6fe96e46ebdf075508e568 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Oct 28 18:19:31 2016 -0700 flipping works! commit c9769bacd321aeddf84e1772dd270f12194d2f04 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Oct 28 17:57:53 2016 -0700 spirte flip fixes... not finished yet commit 1cbdc8e12cc6d0d2728c06dfabaada001784a178 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Oct 28 09:53:16 2016 -0700 centerRect changes commit aeb1b14c00331dabba640f52d79ab0e255fa3407 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Oct 28 09:10:41 2016 -0700 changes from v3 commit e7a61c4a20d786c2bc1d6f57e33bf3ac95cb6f21 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 26 17:01:15 2016 -0700 sprite: rotated slice 9 works as expected commit 91049389426051deb49a9d951364bf60abaf4532 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 26 15:39:54 2016 -0700 more bug fixes in scale9sprite support commit 9feb12449078441c439df16dc7bcfb4506c7a226 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 26 13:22:52 2016 -0700 Android's Patch 9 works as expected commit 1cf46afe3e7f7f5f714d30779caefc25a9bb1b3b Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 26 10:18:47 2016 -0700 Sprite: uses capInsets instead of centerRect just to share the same API as Scale9Sprite commit e944fa0248a7eb58012aacb229de1a9b814e0aef Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Oct 25 18:59:42 2016 -0700 scale9sprite support fixes commit b08765740d480b6ae1491800161b40d88f458767 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Oct 25 17:38:47 2016 -0700 more scale9sprite fixes commit 388a34d93de5e6007a2cecea959c929f26427cab Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Oct 25 17:20:01 2016 -0700 UI::Scale9Sprite refactoring subclass of Sprite... much cleaner! commit c84ec8ee654f74d4b38be2d0a3d7ffe6adbc6faf Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Oct 24 20:58:36 2016 -0700 supports tiled sprites commit d2b18eb47a647b29319488bd53edac9f304acb84 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Oct 24 19:21:57 2016 -0700 testing tiled sprite commit b4832ab2facc01cbb624db587ede01fe7acf23e8 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Oct 24 16:53:19 2016 -0700 using correct top-left coordinates for setCenterRect commit 29d8de86a71cc597b2338f59f7951a28ee0c93b2 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Oct 24 16:46:13 2016 -0700 fixes from scale_sprite9 branch commit ccbe1063bea7db75397ecaf9046aac3dd977a621 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 20 19:01:50 2016 -0700 updated example commit 24f7f85d4eba80f8e543810dcbc1a02447900bdc Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 20 18:47:28 2016 -0700 more fixes in nine slice commit df3358fae68f2d81baf3a8cbe033a4c400ea50da Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 20 18:22:14 2016 -0700 anchor point fixes commit 4ac7409bc72425abb0dc747b956ec346fbd1b2fa Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 20 17:01:48 2016 -0700 support for slice-9 from creator commit a3221375d3a9defc2e03df0b1c2da1b36dfdd491 Merge: 73e5389 d7490d9 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 20 14:13:38 2016 -0700 Merge branch 'sprite_scale9' into creator_cpp_support commit d7490d94896ad0ce8705dc0695252cee34329b5e Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 13 14:34:52 2016 -0700 Adds slice9 support for Sprite. how to use it: // points coords sprite->setCenterRect(Rect(x,y,w,h)); // normalized coords sprite->setCenterRectNormalized(Rect(x,y,w,h)); starts scale9sprite in sprite more slice 9 changes sprite 9 slice works? kind of works correct anchor point slice 9 works, at least with non-rotated atlases streched works ok better Y invert code. cleaner, compatible with the previous code yay, scaling workings... need a better api now sets scale correctly yay! works as expected! more fixes and tests better test for box setContentSize() changes size in non-9-slice mode sprites as well setCenterRect() -> setCenterRectNormalized() yet another test adds setPositionNormalized() adds setCenterRect() tests remove devel team from xcode tests: add one more tests fun test! improved test yet another test for slice 9 commit 73e5389ef719880096067d0f7d0bffd6e1f3cfd1 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Sun Oct 9 18:54:22 2016 -0700 kind of ProgressBar support commit 4db5e9e7369e93ceba1d9512ab88c26b843c43d5 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Fri Oct 7 16:23:54 2016 -0700 new generatred ui files commit 75aa06f3d39df8c6aa898d5e6810b3cd8015c07b Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Thu Oct 6 10:44:59 2016 -0700 bette canvas support commit 89beacac478fc7f58ef930963b6393f3da4a743c Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 5 21:47:11 2016 -0700 sprites tests commit 5fe930ad50c2c1b6d868982709c7b659176f9889 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 5 18:35:44 2016 -0700 more label tests commit d3f615a097d080d78f2ebd95f3e2388da45f92db Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Wed Oct 5 18:08:24 2016 -0700 label tests commit 2a4018922ce8d36117f7092fc324e37cf75fdeab Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Oct 4 21:52:56 2016 -0700 label fixes commit 41fafbd023de63e376d014311605f2b156add307 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Oct 4 19:14:58 2016 -0700 updated test commit 06919fc28fffbc5a20cd14bdcc2ad2ff997e0da1 Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Oct 4 18:50:45 2016 -0700 creator tests: works commit 6e362e7cc7f68dc216b569a7f7f90aaa110c0e4a Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Tue Sep 27 23:15:56 2016 -0700 autogen: new data commit e78078b2ad84b4e364827a66f1c459de7384a91d Author: Ricardo Quesada <ricardoquesada@gmail.com> Date: Mon Sep 26 18:18:57 2016 -0700 fix: initial test for CPP support for Creator * adds more documentation * adds more documentation
This commit is contained in:
parent
cc3da8e5d8
commit
e63a2d0dc2
|
@ -49,6 +49,7 @@
|
|||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
enableAddressSanitizer = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
|
|
|
@ -316,6 +316,7 @@ Sprite::Sprite(void)
|
|||
, _quads(nullptr)
|
||||
, _strechFactor(Vec2::ONE)
|
||||
, _originalContentSize(Size::ZERO)
|
||||
, _strechEnabled(true)
|
||||
{
|
||||
#if CC_SPRITE_DEBUG_DRAW
|
||||
_debugDrawNode = DrawNode::create();
|
||||
|
@ -425,20 +426,87 @@ void Sprite::setTextureRect(const Rect& rect, bool rotated, const Size& untrimme
|
|||
|
||||
void Sprite::updatePoly()
|
||||
{
|
||||
// There are 3 cases:
|
||||
//
|
||||
// A) a non 9-sliced, non streched
|
||||
// contentsize doesn't not affect the streching, since there is no streching
|
||||
// this was the original behavior, and we keep it for backwards compatibility reasons
|
||||
// When non-streching is enabled, we have to change the offset in order to "fill the empty" space at the
|
||||
// left-top of the texture
|
||||
// B) non 9-sliced, streched
|
||||
// the texture is streched to the content size
|
||||
// C) 9-sliced, streched
|
||||
// the sprite is 9-sliced and streched.
|
||||
if (_numberOfSlices == 1) {
|
||||
setTextureCoords(_rect, &_quad);
|
||||
const Rect copyRect(0, 0, _rect.size.width * _strechFactor.x, _rect.size.height * _strechFactor.y);
|
||||
setVertexCoords(copyRect, _rect.size, &_quad);
|
||||
Rect copyRect;
|
||||
if (_strechEnabled) {
|
||||
// case B)
|
||||
copyRect = Rect(0, 0, _rect.size.width * _strechFactor.x, _rect.size.height * _strechFactor.y);
|
||||
} else {
|
||||
// case A)
|
||||
// modify origin to put the sprite in the correct offset
|
||||
copyRect = Rect((_contentSize.width - _originalContentSize.width) / 2.0f,
|
||||
(_contentSize.height - _originalContentSize.height) / 2.0f,
|
||||
_rect.size.width,
|
||||
_rect.size.height);
|
||||
}
|
||||
setVertexCoords(copyRect, &_quad);
|
||||
_polyInfo.setQuad(&_quad);
|
||||
} else {
|
||||
// case C)
|
||||
|
||||
// in theory it can support 3 slices as well, but let's stick to 9 only
|
||||
CCASSERT(_numberOfSlices == 9, "Invalid number of slices");
|
||||
|
||||
|
||||
// How the texture is split
|
||||
//
|
||||
// u,v: are the texture coordinates
|
||||
// w,h: are the width and heights
|
||||
//
|
||||
// w0 w1 w2
|
||||
// v2 +----+------+--+
|
||||
// | | | |
|
||||
// | | | |
|
||||
// | 6 | 7 | 8| h2
|
||||
// | | | |
|
||||
// v1 +----+------+--|
|
||||
// | | | |
|
||||
// | 3 | 4 | 5| h1
|
||||
// v0 +----+------+--|
|
||||
// | | | |
|
||||
// | 0 | 1 | 2| h0
|
||||
// | | | |
|
||||
// +----+------+--+
|
||||
// u0 u1 u2
|
||||
//
|
||||
//
|
||||
// and when the texture is rotated, it will get transformed.
|
||||
// not only the rects have a different position, but also u,v
|
||||
// points to the bottom-left and not top-right of the texture
|
||||
// so some swaping/origin/reordering needs to be done in order
|
||||
// to support rotated slice-9 correctly
|
||||
//
|
||||
// w0 w1 w2
|
||||
// v2 +------+----+--------+
|
||||
// | | | |
|
||||
// | 0 | 3 | 6 | h2
|
||||
// v1 +------+----+--------+
|
||||
// | | | |
|
||||
// | 1 | 4 | 7 | h1
|
||||
// | | | |
|
||||
// v0 +------+----+--------+
|
||||
// | 2 | 5 | 8 | h0
|
||||
// +------+----+--------+
|
||||
// u0 u1 u2
|
||||
|
||||
|
||||
// center rect
|
||||
const float cx1 = _centerRectNormalized.origin.x;
|
||||
const float cy1 = _centerRectNormalized.origin.y;
|
||||
const float cx2 = _centerRectNormalized.origin.x + _centerRectNormalized.size.width;
|
||||
const float cy2 = _centerRectNormalized.origin.y + _centerRectNormalized.size.height;
|
||||
float cx1 = _centerRectNormalized.origin.x;
|
||||
float cy1 = _centerRectNormalized.origin.y;
|
||||
float cx2 = _centerRectNormalized.origin.x + _centerRectNormalized.size.width;
|
||||
float cy2 = _centerRectNormalized.origin.y + _centerRectNormalized.size.height;
|
||||
|
||||
// "O"riginal rect
|
||||
const float oox = _rect.origin.x;
|
||||
|
@ -446,7 +514,20 @@ void Sprite::updatePoly()
|
|||
const float osw = _rect.size.width;
|
||||
const float osh = _rect.size.height;
|
||||
|
||||
if (_rectRotated) {
|
||||
std::swap(cx1, cy1);
|
||||
std::swap(cx2, cy2);
|
||||
|
||||
// when the texture is rotated, then the centerRect starts from the "bottom" (left)
|
||||
// but when it is not rotated, it starts from the top, so invert it
|
||||
cy2 = 1 - cy2;
|
||||
cy1 = 1 - cy1;
|
||||
std::swap(cy1, cy2);
|
||||
}
|
||||
|
||||
//
|
||||
// textCoords Data: Y must be inverted.
|
||||
//
|
||||
const float u0 = oox + osw * 0;
|
||||
const float u1 = oox + osw * cx1;
|
||||
const float u2 = oox + osw * cx2;
|
||||
|
@ -454,21 +535,56 @@ void Sprite::updatePoly()
|
|||
const float v1 = ooy + osh * (1 - cy2);
|
||||
const float v2 = ooy + osh * 0;
|
||||
|
||||
const Rect texRects[9] = {
|
||||
Rect(u0, v0, osw * cx1, osh * cy1), // bottom-left
|
||||
Rect(u1, v0, osw * (cx2-cx1), osh * cy1), // bottom
|
||||
Rect(u2, v0, osw * (1-cx2), osh * cy1), // bottom-right
|
||||
const float w0 = osw * cx1;
|
||||
const float w1 = osw * (cx2-cx1);
|
||||
const float w2 = osw * (1-cx2);
|
||||
const float h0 = osh * cy1;
|
||||
const float h1 = osh * (cy2-cy1);
|
||||
const float h2 = osh * (1-cy2);
|
||||
|
||||
Rect(u0, v1, osw * cx1, osh * (cy2-cy1)), // left
|
||||
Rect(u1, v1, osw * (cx2-cx1), osh * (cy2-cy1)), // center
|
||||
Rect(u2, v1, osw * (1-cx2), osh * (cy2-cy1)), // right
|
||||
const Rect texRects_normal[9] = {
|
||||
Rect(u0, v0, w0, h0), // bottom-left
|
||||
Rect(u1, v0, w1, h0), // bottom
|
||||
Rect(u2, v0, w2, h0), // bottom-right
|
||||
|
||||
Rect(u0, v2, osw * cx1, osh * (1-cy2)), // top-left
|
||||
Rect(u1, v2, osw * (cx2-cx1), osh * (1-cy2)), // top
|
||||
Rect(u2, v2, osw * (1-cx2), osh * (1-cy2)), // top-right
|
||||
Rect(u0, v1, w0, h1), // left
|
||||
Rect(u1, v1, w1, h1), // center
|
||||
Rect(u2, v1, w2, h1), // right
|
||||
|
||||
Rect(u0, v2, w0, h2), // top-left
|
||||
Rect(u1, v2, w1, h2), // top
|
||||
Rect(u2, v2, w2, h2), // top-right
|
||||
};
|
||||
|
||||
// swap width and height because setTextureCoords()
|
||||
// will expects the hight and width to be swapped
|
||||
const Rect texRects_rotated[9] = {
|
||||
Rect(u0, v2, h2, w0), // top-left
|
||||
Rect(u0, v1, h1, w0), // left
|
||||
Rect(u0, v0, h0, w0), // bottom-left
|
||||
|
||||
Rect(u1, v2, h2, w1), // top
|
||||
Rect(u1, v1, h1, w1), // center
|
||||
Rect(u1, v0, h0, w1), // bottom
|
||||
|
||||
Rect(u2, v2, h2, w2), // top-right
|
||||
Rect(u2, v1, h1, w2), // right
|
||||
Rect(u2, v0, h0, w2), // bottom-right
|
||||
};
|
||||
|
||||
const Rect* texRects = _rectRotated ? texRects_rotated : texRects_normal;
|
||||
|
||||
//
|
||||
// vertex Data.
|
||||
//
|
||||
|
||||
// reset center rect since it is altered when when the texture
|
||||
// is rotated
|
||||
cx1 = _centerRectNormalized.origin.x;
|
||||
cy1 = _centerRectNormalized.origin.y;
|
||||
cx2 = _centerRectNormalized.origin.x + _centerRectNormalized.size.width;
|
||||
cy2 = _centerRectNormalized.origin.y + _centerRectNormalized.size.height;
|
||||
|
||||
|
||||
// sizes
|
||||
float x0_s = osw * cx1;
|
||||
|
@ -478,10 +594,8 @@ void Sprite::updatePoly()
|
|||
float y1_s = osh * (cy2-cy1) * _strechFactor.y;
|
||||
float y2_s = osh * (1-cy2);
|
||||
|
||||
// It is easier to call "updateXY", but it will be slower.
|
||||
// so the flipping is calculated here at the cost of adding
|
||||
// just a little bit more of complexity.
|
||||
|
||||
// is it flipped?
|
||||
// swap sizes to calculate offset correctly
|
||||
if (_flippedX)
|
||||
std::swap(x0_s, x2_s);
|
||||
|
@ -520,21 +634,9 @@ void Sprite::updatePoly()
|
|||
Rect(x2, y2, x2_s, y2_s), // top-right
|
||||
};
|
||||
|
||||
static const int normalIdx[] = {
|
||||
0, 1, 2,
|
||||
3, 4, 5,
|
||||
6, 7 ,8
|
||||
};
|
||||
static const int rotatedIdx[] = {
|
||||
6, 3, 0,
|
||||
7, 4, 1,
|
||||
8, 5, 2};
|
||||
const int* idx = _rectRotated ? rotatedIdx : normalIdx;
|
||||
|
||||
for (int i=0; i<_numberOfSlices; ++i) {
|
||||
int texIdx = idx[i];
|
||||
setTextureCoords(texRects[texIdx], &_quads[i]);
|
||||
setVertexCoords(verticesRects[i], _rect.size, &_quads[i]);
|
||||
setTextureCoords(texRects[i], &_quads[i]);
|
||||
setVertexCoords(verticesRects[i], &_quads[i]);
|
||||
}
|
||||
_polyInfo.setQuads(_quads, _numberOfSlices);
|
||||
}
|
||||
|
@ -581,6 +683,7 @@ void Sprite::setCenterRect(const cocos2d::Rect &rectInPoints)
|
|||
if (!_originalContentSize.equals(Size::ZERO))
|
||||
{
|
||||
Rect rect = rectInPoints;
|
||||
|
||||
const float x = rect.origin.x / _rect.size.width;
|
||||
const float y = rect.origin.y / _rect.size.height;
|
||||
const float w = rect.size.width / _rect.size.width;
|
||||
|
@ -628,37 +731,52 @@ void Sprite::setTextureCoords(const Rect& rectInPoints, V3F_C4B_T2F_Quad* outQua
|
|||
return;
|
||||
}
|
||||
|
||||
auto rectInPixels = CC_RECT_POINTS_TO_PIXELS(rectInPoints);
|
||||
const auto rectInPixels = CC_RECT_POINTS_TO_PIXELS(rectInPoints);
|
||||
|
||||
float atlasWidth = (float)tex->getPixelsWide();
|
||||
float atlasHeight = (float)tex->getPixelsHigh();
|
||||
const float atlasWidth = (float)tex->getPixelsWide();
|
||||
const float atlasHeight = (float)tex->getPixelsHigh();
|
||||
|
||||
float left, right, top, bottom;
|
||||
float rw = rectInPixels.size.width;
|
||||
float rh = rectInPixels.size.height;
|
||||
|
||||
// if the rect is rotated, it means that the frame is rotated 90 degrees (clockwise) and:
|
||||
// - rectInpoints: origin will be the bottom-left of the frame (and not the top-right)
|
||||
// - size: represents the unrotated texture size
|
||||
//
|
||||
// so what we have to do is:
|
||||
// - swap texture width and height
|
||||
// - take into account the origin
|
||||
// - flip X instead of Y when flipY is enabled
|
||||
// - flip Y instead of X when flipX is enabled
|
||||
|
||||
if (_rectRotated)
|
||||
{
|
||||
std::swap(rw, rh);
|
||||
|
||||
#if CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
|
||||
left = (2*rectInPixels.origin.x+1) / (2*atlasWidth);
|
||||
right = left+(rectInPixels.size.height*2-2) / (2*atlasWidth);
|
||||
top = (2*rectInPixels.origin.y+1) / (2*atlasHeight);
|
||||
bottom = top+(rectInPixels.size.width*2-2) / (2*atlasHeight);
|
||||
float left = (2*rectInPixels.origin.x+1) / (2*atlasWidth);
|
||||
float right = left+(rw*2-2) / (2*atlasWidth);
|
||||
float top = (2*rectInPixels.origin.y+1) / (2*atlasHeight);
|
||||
float bottom = top+(rh*2-2) / (2*atlasHeight);
|
||||
#else
|
||||
left = rectInPixels.origin.x / atlasWidth;
|
||||
right = (rectInPixels.origin.x + rectInPixels.size.height) / atlasWidth;
|
||||
top = rectInPixels.origin.y / atlasHeight;
|
||||
bottom = (rectInPixels.origin.y + rectInPixels.size.width) / atlasHeight;
|
||||
float left = rectInPixels.origin.x / atlasWidth;
|
||||
float right = (rectInPixels.origin.x + rw) / atlasWidth;
|
||||
float top = rectInPixels.origin.y / atlasHeight;
|
||||
float bottom = (rectInPixels.origin.y + rh) / atlasHeight;
|
||||
#endif // CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
|
||||
|
||||
if (_flippedX)
|
||||
{
|
||||
std::swap(top, bottom);
|
||||
}
|
||||
|
||||
if (_flippedY)
|
||||
if ((_flippedX && !_rectRotated) || (_flippedY && _rectRotated))
|
||||
{
|
||||
std::swap(left, right);
|
||||
}
|
||||
|
||||
if ((_flippedY && !_rectRotated) || (_flippedX && _rectRotated))
|
||||
{
|
||||
std::swap(top, bottom);
|
||||
}
|
||||
|
||||
if (_rectRotated)
|
||||
{
|
||||
outQuad->bl.texCoords.u = left;
|
||||
outQuad->bl.texCoords.v = top;
|
||||
outQuad->br.texCoords.u = left;
|
||||
|
@ -670,28 +788,6 @@ void Sprite::setTextureCoords(const Rect& rectInPoints, V3F_C4B_T2F_Quad* outQua
|
|||
}
|
||||
else
|
||||
{
|
||||
#if CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
|
||||
left = (2*rectInPixels.origin.x+1) / (2*atlasWidth);
|
||||
right = left + (rectInPixels.size.width*2-2) / (2*atlasWidth);
|
||||
top = (2*rectInPixels.origin.y+1) / (2*atlasHeight);
|
||||
bottom = top + (rectInPixels.size.height*2-2) / (2*atlasHeight);
|
||||
#else
|
||||
left = rectInPixels.origin.x / atlasWidth;
|
||||
right = (rectInPixels.origin.x + rectInPixels.size.width) / atlasWidth;
|
||||
top = rectInPixels.origin.y / atlasHeight;
|
||||
bottom = (rectInPixels.origin.y + rectInPixels.size.height) / atlasHeight;
|
||||
#endif // ! CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL
|
||||
|
||||
if(_flippedX)
|
||||
{
|
||||
std::swap(left, right);
|
||||
}
|
||||
|
||||
if(_flippedY)
|
||||
{
|
||||
std::swap(top, bottom);
|
||||
}
|
||||
|
||||
outQuad->bl.texCoords.u = left;
|
||||
outQuad->bl.texCoords.v = bottom;
|
||||
outQuad->br.texCoords.u = right;
|
||||
|
@ -703,10 +799,8 @@ void Sprite::setTextureCoords(const Rect& rectInPoints, V3F_C4B_T2F_Quad* outQua
|
|||
}
|
||||
}
|
||||
|
||||
void Sprite::setVertexCoords(const Rect& rect, const Size& imageSize, V3F_C4B_T2F_Quad* outQuad)
|
||||
void Sprite::setVertexCoords(const Rect& rect, V3F_C4B_T2F_Quad* outQuad)
|
||||
{
|
||||
// container size is the Size that contains the "unsliced" sprite
|
||||
|
||||
float relativeOffsetX = _unflippedOffsetPositionFromCenter.x;
|
||||
float relativeOffsetY = _unflippedOffsetPositionFromCenter.y;
|
||||
|
||||
|
@ -720,8 +814,15 @@ void Sprite::setVertexCoords(const Rect& rect, const Size& imageSize, V3F_C4B_T2
|
|||
relativeOffsetY = -relativeOffsetY;
|
||||
}
|
||||
|
||||
_offsetPosition.x = relativeOffsetX + (_originalContentSize.width - imageSize.width) / 2;
|
||||
_offsetPosition.y = relativeOffsetY + (_originalContentSize.height - imageSize.height) / 2;
|
||||
_offsetPosition.x = relativeOffsetX + (_originalContentSize.width - _rect.size.width) / 2;
|
||||
_offsetPosition.y = relativeOffsetY + (_originalContentSize.height - _rect.size.height) / 2;
|
||||
|
||||
// FIXME: Streching should be applied to the "offset" as well
|
||||
// but probably it should be calculated in the caller function. It will be tidier
|
||||
if (_numberOfSlices == 1) {
|
||||
_offsetPosition.x *= _strechFactor.x;
|
||||
_offsetPosition.y *= _strechFactor.y;
|
||||
}
|
||||
|
||||
// rendering using batch node
|
||||
if (_batchNode)
|
||||
|
@ -1152,17 +1253,35 @@ void Sprite::setContentSize(const Size& size)
|
|||
updatePoly();
|
||||
}
|
||||
|
||||
void Sprite::setStrechEnabled(bool enabled)
|
||||
{
|
||||
if (_strechEnabled != enabled) {
|
||||
_strechEnabled = enabled;
|
||||
|
||||
// disabled centerrect / number of slices if disabled
|
||||
if (!enabled)
|
||||
setCenterRectNormalized(Rect(0,0,1,1));
|
||||
|
||||
updateStretchFactor();
|
||||
updatePoly();
|
||||
}
|
||||
}
|
||||
|
||||
bool Sprite::isStrechEnabled() const
|
||||
{
|
||||
return _strechEnabled;
|
||||
}
|
||||
|
||||
void Sprite::updateStretchFactor()
|
||||
{
|
||||
const Size size = getContentSize();
|
||||
const float adjustedWidth = size.width - (_originalContentSize.width - _rect.size.width);
|
||||
const float adjustedHeight = size.height - (_originalContentSize.height - _rect.size.height);
|
||||
|
||||
if (_numberOfSlices == 1)
|
||||
{
|
||||
const float x_factor = adjustedWidth / _rect.size.width;
|
||||
const float y_factor = adjustedHeight / _rect.size.height;
|
||||
|
||||
// If strech is disabled, calculate the strech anyway
|
||||
// since it is needed to calculate the offset
|
||||
const float x_factor = size.width / _originalContentSize.width;
|
||||
const float y_factor = size.height / _originalContentSize.height;
|
||||
_strechFactor = Vec2(x_factor, y_factor);
|
||||
}
|
||||
else
|
||||
|
@ -1175,6 +1294,10 @@ void Sprite::updateStretchFactor()
|
|||
const float y2 = _rect.size.height * _centerRectNormalized.size.height;
|
||||
const float y3 = _rect.size.height * (1 - _centerRectNormalized.origin.y - _centerRectNormalized.size.height);
|
||||
|
||||
// adjustedSize = the new _rect size
|
||||
const float adjustedWidth = size.width - (_originalContentSize.width - _rect.size.width);
|
||||
const float adjustedHeight = size.height - (_originalContentSize.height - _rect.size.height);
|
||||
|
||||
const float x_factor = (adjustedWidth - x1 - x3) / x2;
|
||||
const float y_factor = (adjustedHeight - y1 - y3) / y2;
|
||||
|
||||
|
@ -1188,13 +1311,10 @@ void Sprite::setFlippedX(bool flippedX)
|
|||
{
|
||||
_flippedX = flippedX;
|
||||
|
||||
for (ssize_t i = 0; i < _polyInfo.triangles.vertCount; i++) {
|
||||
auto& v = _polyInfo.triangles.verts[i].vertices;
|
||||
v.x = _contentSize.width - v.x;
|
||||
}
|
||||
|
||||
if (_textureAtlas) {
|
||||
if (_batchNode) {
|
||||
setDirty(true);
|
||||
} else {
|
||||
updatePoly();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1210,13 +1330,10 @@ void Sprite::setFlippedY(bool flippedY)
|
|||
{
|
||||
_flippedY = flippedY;
|
||||
|
||||
for (ssize_t i = 0; i < _polyInfo.triangles.vertCount; i++) {
|
||||
auto& v = _polyInfo.triangles.verts[i].vertices;
|
||||
v.y = _contentSize.height - v.y;
|
||||
}
|
||||
|
||||
if (_textureAtlas) {
|
||||
if (_batchNode) {
|
||||
setDirty(true);
|
||||
} else {
|
||||
updatePoly();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -451,6 +451,13 @@ public:
|
|||
* @param PolygonInfo the polygon information object
|
||||
*/
|
||||
void setPolygonInfo(const PolygonInfo& info);
|
||||
|
||||
/** whether or not contentSize streches the sprite's texture */
|
||||
void setStrechEnabled(bool enabled);
|
||||
|
||||
/** returns whether or not contentSize streches the sprite's texture */
|
||||
bool isStrechEnabled() const;
|
||||
|
||||
//
|
||||
// Overrides
|
||||
//
|
||||
|
@ -623,7 +630,7 @@ protected:
|
|||
void updateColor() override;
|
||||
virtual void setTextureCoords(const Rect& rect);
|
||||
virtual void setTextureCoords(const Rect& rect, V3F_C4B_T2F_Quad* outQuad);
|
||||
virtual void setVertexCoords(const Rect& rect, const Size& imageSize, V3F_C4B_T2F_Quad* outQuad);
|
||||
virtual void setVertexCoords(const Rect& rect, V3F_C4B_T2F_Quad* outQuad);
|
||||
virtual void updateBlendFunc();
|
||||
virtual void setReorderChildDirtyRecursively();
|
||||
virtual void setDirtyRecursively(bool value);
|
||||
|
@ -688,6 +695,8 @@ protected:
|
|||
std::string _fileName;
|
||||
int _fileType;
|
||||
|
||||
bool _strechEnabled;
|
||||
|
||||
private:
|
||||
CC_DISALLOW_COPY_AND_ASSIGN(Sprite);
|
||||
};
|
||||
|
|
|
@ -28,6 +28,7 @@ THE SOFTWARE.
|
|||
#include "renderer/CCTextureCache.h"
|
||||
#include "2d/CCSpriteFrame.h"
|
||||
#include "base/CCDirector.h"
|
||||
#include "platform/CCFileUtils.h"
|
||||
|
||||
NS_CC_BEGIN
|
||||
|
||||
|
@ -54,19 +55,24 @@ SpriteFrame* SpriteFrame::createWithTexture(Texture2D *texture, const Rect& rect
|
|||
SpriteFrame* SpriteFrame::createWithTexture(Texture2D* texture, const Rect& rect, bool rotated, const Vec2& offset, const Size& originalSize)
|
||||
{
|
||||
SpriteFrame *spriteFrame = new (std::nothrow) SpriteFrame();
|
||||
spriteFrame->initWithTexture(texture, rect, rotated, offset, originalSize);
|
||||
if (spriteFrame && spriteFrame->initWithTexture(texture, rect, rotated, offset, originalSize)) {
|
||||
spriteFrame->autorelease();
|
||||
|
||||
return spriteFrame;
|
||||
}
|
||||
|
||||
delete spriteFrame;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SpriteFrame* SpriteFrame::create(const std::string& filename, const Rect& rect, bool rotated, const Vec2& offset, const Size& originalSize)
|
||||
{
|
||||
SpriteFrame *spriteFrame = new (std::nothrow) SpriteFrame();
|
||||
spriteFrame->initWithTextureFilename(filename, rect, rotated, offset, originalSize);
|
||||
if (spriteFrame && spriteFrame->initWithTextureFilename(filename, rect, rotated, offset, originalSize)) {
|
||||
spriteFrame->autorelease();
|
||||
|
||||
return spriteFrame;
|
||||
}
|
||||
delete spriteFrame;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SpriteFrame::SpriteFrame()
|
||||
|
@ -111,6 +117,7 @@ bool SpriteFrame::initWithTexture(Texture2D* texture, const Rect& rect, bool rot
|
|||
|
||||
bool SpriteFrame::initWithTextureFilename(const std::string& filename, const Rect& rect, bool rotated, const Vec2& offset, const Size& originalSize)
|
||||
{
|
||||
if (FileUtils::getInstance()->isFileExist(filename)) {
|
||||
_texture = nullptr;
|
||||
_textureFilename = filename;
|
||||
_rectInPixels = rect;
|
||||
|
@ -122,8 +129,9 @@ bool SpriteFrame::initWithTextureFilename(const std::string& filename, const Rec
|
|||
_rotated = rotated;
|
||||
_anchorPoint = Vec2(NAN, NAN);
|
||||
_centerRect = Rect(NAN, NAN, NAN, NAN);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
SpriteFrame::~SpriteFrame()
|
||||
|
|
|
@ -446,6 +446,7 @@ bool SpriteFrameCache::isSpriteFramesWithFileLoaded(const std::string& plist) co
|
|||
|
||||
void SpriteFrameCache::addSpriteFrame(SpriteFrame* frame, const std::string& frameName)
|
||||
{
|
||||
CCASSERT(frame, "frame should not be nil");
|
||||
_spriteFrames.insert(frameName, frame);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ ui::Scale9Sprite* Scale9SpriteLoader::createNode(cocos2d::Node* /*pParent*/, coc
|
|||
|
||||
void Scale9SpriteLoader::onHandlePropTypeSpriteFrame(Node * pNode, Node * pParent, const char * pPropertyName, SpriteFrame * pSpriteFrame, CCBReader * ccbReader) {
|
||||
if(strcmp(pPropertyName, PROPERTY_SPRITEFRAME) == 0) {
|
||||
((cocos2d::ui::Scale9Sprite *)pNode)->setSpriteFrame(pSpriteFrame);
|
||||
static_cast<cocos2d::ui::Scale9Sprite*>(pNode)->setSpriteFrame(pSpriteFrame);
|
||||
} else {
|
||||
NodeLoader::onHandlePropTypeSpriteFrame(pNode, pParent, pPropertyName, pSpriteFrame, ccbReader);
|
||||
}
|
||||
|
|
|
@ -158,6 +158,25 @@ void Button::createTitleRenderer()
|
|||
addProtectedChild(_titleRenderer, TITLE_RENDERER_Z, -1);
|
||||
}
|
||||
|
||||
/** replaces the current Label node with a new one */
|
||||
void Button::setTitleLabel(Label* label)
|
||||
{
|
||||
if (_titleRenderer != label) {
|
||||
CC_SAFE_RELEASE(_titleRenderer);
|
||||
_titleRenderer = label;
|
||||
CC_SAFE_RETAIN(_titleRenderer);
|
||||
|
||||
addProtectedChild(_titleRenderer, TITLE_RENDERER_Z, -1);
|
||||
updateTitleLocation();
|
||||
}
|
||||
}
|
||||
|
||||
/** returns the current Label being used */
|
||||
Label* Button::getTitleLabel() const
|
||||
{
|
||||
return _titleRenderer;
|
||||
}
|
||||
|
||||
void Button::setScale9Enabled(bool able)
|
||||
{
|
||||
if (_scale9Enabled == able)
|
||||
|
@ -453,7 +472,7 @@ void Button::onPressStateChangedToNormal()
|
|||
_buttonNormalRenderer->setScale(1.0);
|
||||
_buttonClickedRenderer->setScale(1.0);
|
||||
|
||||
if(nullptr != _titleRenderer)
|
||||
if (nullptr != _titleRenderer)
|
||||
{
|
||||
_titleRenderer->stopAllActions();
|
||||
if (_unifySize)
|
||||
|
@ -474,7 +493,7 @@ void Button::onPressStateChangedToNormal()
|
|||
_buttonNormalRenderer->stopAllActions();
|
||||
_buttonNormalRenderer->setScale(1.0);
|
||||
|
||||
if(nullptr != _titleRenderer)
|
||||
if (nullptr != _titleRenderer)
|
||||
{
|
||||
_titleRenderer->stopAllActions();
|
||||
_titleRenderer->setScaleX(1.0f);
|
||||
|
@ -507,7 +526,7 @@ void Button::onPressStateChangedToPressed()
|
|||
_buttonNormalRenderer->setScale(1.0f + _zoomScale,
|
||||
1.0f + _zoomScale);
|
||||
|
||||
if(nullptr != _titleRenderer)
|
||||
if (nullptr != _titleRenderer)
|
||||
{
|
||||
_titleRenderer->stopAllActions();
|
||||
Action *zoomTitleAction = ScaleTo::create(ZOOM_ACTION_TIME_STEP,
|
||||
|
@ -525,7 +544,7 @@ void Button::onPressStateChangedToPressed()
|
|||
_buttonNormalRenderer->stopAllActions();
|
||||
_buttonNormalRenderer->setScale(1.0f +_zoomScale, 1.0f + _zoomScale);
|
||||
|
||||
if(nullptr != _titleRenderer)
|
||||
if (nullptr != _titleRenderer)
|
||||
{
|
||||
_titleRenderer->stopAllActions();
|
||||
_titleRenderer->setScaleX(1.0f + _zoomScale);
|
||||
|
@ -586,7 +605,7 @@ void Button::updateContentSize()
|
|||
void Button::onSizeChanged()
|
||||
{
|
||||
Widget::onSizeChanged();
|
||||
if(nullptr != _titleRenderer)
|
||||
if (nullptr != _titleRenderer)
|
||||
{
|
||||
updateTitleLocation();
|
||||
}
|
||||
|
|
|
@ -263,6 +263,13 @@ public:
|
|||
*/
|
||||
void setTitleAlignment(TextHAlignment hAlignment, TextVAlignment vAlignment);
|
||||
|
||||
/** replaces the current Label node with a new one */
|
||||
void setTitleLabel(Label* label);
|
||||
|
||||
/** returns the current Label being used */
|
||||
Label* getTitleLabel() const;
|
||||
|
||||
|
||||
/** @brief When user pressed the button, the button will zoom to a scale.
|
||||
* The final scale of the button equals (button original scale + _zoomScale)
|
||||
* @since v3.3
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -25,7 +25,7 @@
|
|||
#ifndef __cocos2d_libs__UIScale9Sprite__
|
||||
#define __cocos2d_libs__UIScale9Sprite__
|
||||
|
||||
#include "2d/CCNode.h"
|
||||
#include "2d/CCSprite.h"
|
||||
#include "2d/CCSpriteFrame.h"
|
||||
#include "2d/CCSpriteBatchNode.h"
|
||||
#include "platform/CCPlatformMacros.h"
|
||||
|
@ -38,6 +38,7 @@
|
|||
*/
|
||||
NS_CC_BEGIN
|
||||
class DrawNode;
|
||||
class Texture2D;
|
||||
|
||||
namespace ui {
|
||||
|
||||
|
@ -53,7 +54,7 @@ namespace ui {
|
|||
* Then you could call any methods of Sprite class with the return pointers.
|
||||
*
|
||||
*/
|
||||
class CC_GUI_DLL Scale9Sprite : public Node , public cocos2d::BlendProtocol
|
||||
class CC_GUI_DLL Scale9Sprite : public Sprite
|
||||
{
|
||||
public:
|
||||
/**
|
||||
|
@ -189,6 +190,12 @@ namespace ui {
|
|||
*/
|
||||
static Scale9Sprite* createWithSpriteFrameName(const std::string& spriteFrameName, const Rect& capInsets);
|
||||
|
||||
// overriden methods that takes different parameters
|
||||
using Sprite::initWithFile;
|
||||
using Sprite::initWithSpriteFrame;
|
||||
using Sprite::initWithSpriteFrameName;
|
||||
using Sprite::setSpriteFrame;
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with a texture file, a delimitation zone and
|
||||
* with the specified cap insets.
|
||||
|
@ -205,21 +212,6 @@ namespace ui {
|
|||
*/
|
||||
virtual bool initWithFile(const std::string& file, const Rect& rect, const Rect& capInsets);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with a texture file and a delimitation zone. The
|
||||
* texture will be broken down into a 3×3 grid of equal blocks.
|
||||
* Once the sprite is created, you can then call its "setContentSize:" method
|
||||
* to resize the sprite will all it's 9-slice goodness intract.
|
||||
* It respects the anchorPoint too.
|
||||
*
|
||||
* @param file The name of the texture file.
|
||||
* @param rect The rectangle that describes the sub-part of the texture that
|
||||
* is the whole image. If the shape is the whole texture, set this to the
|
||||
* texture's full rect.
|
||||
* @return True if initializes success, false otherwise.
|
||||
*/
|
||||
virtual bool initWithFile(const std::string& file, const Rect& rect);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with a texture file and with the specified cap
|
||||
* insets.
|
||||
|
@ -233,18 +225,6 @@ namespace ui {
|
|||
*/
|
||||
virtual bool initWithFile(const Rect& capInsets, const std::string& file);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with a texture file. The whole texture will be
|
||||
* broken down into a 3×3 grid of equal blocks.
|
||||
* Once the sprite is created, you can then call its "setContentSize:" method
|
||||
* to resize the sprite will all it's 9-slice goodness intract.
|
||||
* It respects the anchorPoint too.
|
||||
*
|
||||
* @param file The name of the texture file.
|
||||
* @return True if initializes success, false otherwise.
|
||||
*/
|
||||
virtual bool initWithFile(const std::string& file);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with an sprite frame and with the specified
|
||||
* cap insets.
|
||||
|
@ -258,17 +238,6 @@ namespace ui {
|
|||
*/
|
||||
virtual bool initWithSpriteFrame(SpriteFrame* spriteFrame, const Rect& capInsets);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with an sprite frame.
|
||||
* Once the sprite is created, you can then call its "setContentSize:" method
|
||||
* to resize the sprite will all it's 9-slice goodness intract.
|
||||
* It respects the anchorPoint too.
|
||||
*
|
||||
* @param spriteFrame The sprite frame object.
|
||||
* @return True if initializes success, false otherwise.
|
||||
*/
|
||||
virtual bool initWithSpriteFrame(SpriteFrame* spriteFrame);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with an sprite frame name and with the specified
|
||||
* cap insets.
|
||||
|
@ -282,17 +251,6 @@ namespace ui {
|
|||
*/
|
||||
virtual bool initWithSpriteFrameName(const std::string& spriteFrameName, const Rect& capInsets);
|
||||
|
||||
/**
|
||||
* Initializes a 9-slice sprite with an sprite frame name.
|
||||
* Once the sprite is created, you can then call its "setContentSize:" method
|
||||
* to resize the sprite will all it's 9-slice goodness intract.
|
||||
* It respects the anchorPoint too.
|
||||
*
|
||||
* @param spriteFrameName The sprite frame name.
|
||||
* @return True if initializes success, false otherwise.
|
||||
*/
|
||||
virtual bool initWithSpriteFrameName(const std::string& spriteFrameName);
|
||||
|
||||
//override function
|
||||
virtual bool init() override;
|
||||
|
||||
|
@ -375,24 +333,6 @@ namespace ui {
|
|||
*/
|
||||
CC_DEPRECATED(v3) virtual bool initWithBatchNode(SpriteBatchNode* batchnode, const Rect& rect, const Rect& capInsets);
|
||||
|
||||
/**
|
||||
* Sets the source blending function.
|
||||
*
|
||||
* @param blendFunc A structure with source and destination factor to specify pixel arithmetic. e.g. {GL_ONE, GL_ONE}, {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}.
|
||||
* @js NA
|
||||
* @lua NA
|
||||
*/
|
||||
virtual void setBlendFunc(const BlendFunc &blendFunc) override;
|
||||
|
||||
/**
|
||||
* Returns the blending function that is currently being used.
|
||||
*
|
||||
* @return A BlendFunc structure with source and destination factor which specified pixel arithmetic.
|
||||
* @js NA
|
||||
* @lua NA
|
||||
*/
|
||||
virtual const BlendFunc &getBlendFunc() const override;
|
||||
|
||||
/**
|
||||
* Creates and returns a new sprite object with the specified cap insets.
|
||||
* You use this method to add cap insets to a sprite or to change the existing
|
||||
|
@ -461,11 +401,7 @@ namespace ui {
|
|||
* @param spriteFrame A sprite frame pointer.
|
||||
* @param capInsets The values to use for the cap insets.
|
||||
*/
|
||||
virtual void setSpriteFrame(SpriteFrame * spriteFrame, const Rect& capInsets = Rect::ZERO);
|
||||
|
||||
// overrides
|
||||
virtual void setContentSize(const Size & size) override;
|
||||
virtual void setAnchorPoint(const Vec2& anchorPoint) override;
|
||||
virtual void setSpriteFrame(SpriteFrame * spriteFrame, const Rect& capInsets);
|
||||
|
||||
/**
|
||||
* Change the state of 9-slice sprite.
|
||||
|
@ -480,7 +416,7 @@ namespace ui {
|
|||
* @return @see `State`
|
||||
* @since v3.7
|
||||
*/
|
||||
State getState()const;
|
||||
State getState() const;
|
||||
|
||||
/**
|
||||
* @brief Query the sprite's original size.
|
||||
|
@ -503,20 +439,6 @@ namespace ui {
|
|||
*/
|
||||
Size getPreferredSize() const;
|
||||
|
||||
/**
|
||||
* @brief Change the cap inset size.
|
||||
*
|
||||
* @param rect A delimitation zone.
|
||||
*/
|
||||
void setCapInsets(const Rect& rect);
|
||||
|
||||
/**
|
||||
* @brief Query the Scale9Sprite's preferred size.
|
||||
*
|
||||
* @return Scale9Sprite's cap inset.
|
||||
*/
|
||||
Rect getCapInsets()const;
|
||||
|
||||
/**
|
||||
* @brief Change the left sprite's cap inset.
|
||||
*
|
||||
|
@ -529,7 +451,7 @@ namespace ui {
|
|||
*
|
||||
* @return The left sprite's cap inset.
|
||||
*/
|
||||
float getInsetLeft()const;
|
||||
float getInsetLeft() const;
|
||||
|
||||
/**
|
||||
* @brief Change the top sprite's cap inset.
|
||||
|
@ -543,7 +465,7 @@ namespace ui {
|
|||
*
|
||||
* @return The top sprite's cap inset.
|
||||
*/
|
||||
float getInsetTop()const;
|
||||
float getInsetTop() const;
|
||||
|
||||
/**
|
||||
* @brief Change the right sprite's cap inset.
|
||||
|
@ -557,7 +479,7 @@ namespace ui {
|
|||
*
|
||||
* @return The right sprite's cap inset.
|
||||
*/
|
||||
float getInsetRight()const;
|
||||
float getInsetRight() const;
|
||||
|
||||
/**
|
||||
* @brief Change the bottom sprite's cap inset.
|
||||
|
@ -572,7 +494,7 @@ namespace ui {
|
|||
*
|
||||
* @return The bottom sprite's cap inset.
|
||||
*/
|
||||
float getInsetBottom()const;
|
||||
float getInsetBottom() const;
|
||||
|
||||
/**
|
||||
* @brief Toggle 9-slice feature.
|
||||
|
@ -590,77 +512,17 @@ namespace ui {
|
|||
* @return True if 9-slice is enabled, false otherwise.
|
||||
* @js NA
|
||||
*/
|
||||
bool isScale9Enabled()const;
|
||||
bool isScale9Enabled() const;
|
||||
|
||||
/// @} end of Children and Parent
|
||||
|
||||
virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
|
||||
virtual void visit(Renderer *renderer, const Mat4 &parentTransform, uint32_t parentFlags) override;
|
||||
|
||||
virtual void updateDisplayedOpacity(GLubyte parentOpacity) override;
|
||||
virtual void updateDisplayedColor(const Color3B& parentColor) override;
|
||||
virtual void disableCascadeColor() override;
|
||||
virtual void disableCascadeOpacity() override;
|
||||
virtual void setGLProgram(GLProgram *glprogram) override;
|
||||
virtual void setGLProgramState(GLProgramState *glProgramState) override;
|
||||
|
||||
/**
|
||||
* @brief Get the original no 9-sliced sprite
|
||||
*
|
||||
* @return A sprite instance.
|
||||
*/
|
||||
Sprite* getSprite()const;
|
||||
Sprite* getSprite();
|
||||
|
||||
/**
|
||||
* Sets whether the widget should be flipped horizontally or not.
|
||||
*
|
||||
* @param flippedX true if the widget should be flipped horizontally, false otherwise.
|
||||
*/
|
||||
virtual void setFlippedX(bool flippedX);
|
||||
|
||||
/**
|
||||
* Returns the flag which indicates whether the widget is flipped horizontally or not.
|
||||
*
|
||||
* It only flips the texture of the widget, and not the texture of the widget's children.
|
||||
* Also, flipping the texture doesn't alter the anchorPoint.
|
||||
* If you want to flip the anchorPoint too, and/or to flip the children too use:
|
||||
* widget->setScaleX(sprite->getScaleX() * -1);
|
||||
*
|
||||
* @return true if the widget is flipped horizontally, false otherwise.
|
||||
*/
|
||||
virtual bool isFlippedX()const;
|
||||
|
||||
/**
|
||||
* Sets whether the widget should be flipped vertically or not.
|
||||
*
|
||||
* @param flippedY true if the widget should be flipped vertically, false otherwise.
|
||||
*/
|
||||
virtual void setFlippedY(bool flippedY);
|
||||
|
||||
/**
|
||||
* Return the flag which indicates whether the widget is flipped vertically or not.
|
||||
*
|
||||
* It only flips the texture of the widget, and not the texture of the widget's children.
|
||||
* Also, flipping the texture doesn't alter the anchorPoint.
|
||||
* If you want to flip the anchorPoint too, and/or to flip the children too use:
|
||||
* widget->setScaleY(widget->getScaleY() * -1);
|
||||
*
|
||||
* @return true if the widget is flipped vertically, false otherwise.
|
||||
*/
|
||||
virtual bool isFlippedY()const;
|
||||
|
||||
//override the setScale function of Node
|
||||
virtual void setScaleX(float scaleX) override;
|
||||
virtual void setScaleY(float scaleY) override;
|
||||
virtual void setScale(float scale) override;
|
||||
virtual void setScale(float scaleX, float scaleY) override;
|
||||
using Node::setScaleZ;
|
||||
virtual float getScaleX() const override;
|
||||
virtual float getScaleY() const override;
|
||||
virtual float getScale() const override;
|
||||
using Node::getScaleZ;
|
||||
virtual void setCameraMask(unsigned short mask, bool applyChildren = true) override;
|
||||
virtual void setGlobalZOrder(float globalZOrder) override;
|
||||
|
||||
/**
|
||||
* Set the slice sprite rendering type.
|
||||
|
@ -673,66 +535,34 @@ namespace ui {
|
|||
/**
|
||||
* Return the slice sprite rendering type.
|
||||
*/
|
||||
RenderingType getRenderingType()const;
|
||||
RenderingType getRenderingType() const;
|
||||
|
||||
/**
|
||||
* Set the Cap Insets in Points using the untrimmed size as reference
|
||||
*/
|
||||
void setCapInsets(const Rect& insets);
|
||||
/**
|
||||
* Returns the Cap Insets
|
||||
*/
|
||||
Rect getCapInsets() const;
|
||||
|
||||
void resetRender();
|
||||
|
||||
protected:
|
||||
void updateCapInset();
|
||||
void createSlicedSprites();
|
||||
void cleanupSlicedSprites();
|
||||
void adjustNoneScale9ImagePosition();
|
||||
void configureSimpleModeRendering();
|
||||
void applyBlendFunc();
|
||||
void updateBlendFunc(Texture2D *texture);
|
||||
std::vector<Vec2> calculateUV(Texture2D *tex, const Rect& capInsets,
|
||||
const Size& originalSize, const Vec4& offsets);
|
||||
std::vector<Vec2> calculateVertices(const Rect& capInsets, const Size& originalSize, const Vec4& offsets);
|
||||
TrianglesCommand::Triangles calculateTriangles(const std::vector<Vec2>& uv,
|
||||
const std::vector<Vec2>& vertices);
|
||||
void setupSlice9(Texture2D* texture, const Rect& capInsets);
|
||||
|
||||
Rect _spriteRect;
|
||||
bool _spriteFrameRotated;
|
||||
Rect _capInsetsInternal;
|
||||
bool _isPatch9;
|
||||
|
||||
Sprite* _scale9Image; //the original sprite
|
||||
Rect _previousCenterRectNormalized;
|
||||
|
||||
bool _scale9Enabled;
|
||||
BlendFunc _blendFunc;
|
||||
|
||||
/** Original sprite's size. */
|
||||
Size _originalSize;
|
||||
Vec2 _offset;
|
||||
/** Preferred sprite's size. By default the preferred size is the original size. */
|
||||
|
||||
//if the preferredSize component is given as -1, it is ignored
|
||||
Size _preferredSize;
|
||||
|
||||
/** Sets the left side inset */
|
||||
float _insetLeft;
|
||||
/** Sets the top side inset */
|
||||
float _insetTop;
|
||||
/** Sets the right side inset */
|
||||
float _insetRight;
|
||||
/** Sets the bottom side inset */
|
||||
float _insetTop;
|
||||
float _insetBottom;
|
||||
|
||||
bool _flippedX;
|
||||
bool _flippedY;
|
||||
bool _isPatch9;
|
||||
State _brightState;
|
||||
Vec2 _nonSliceSpriteAnchor;
|
||||
|
||||
V3F_C4B_T2F* _sliceVertices;
|
||||
unsigned short* _sliceIndices;
|
||||
bool _sliceSpriteDirty;
|
||||
RenderingType _renderingType;
|
||||
|
||||
#if CC_SPRITE_DEBUG_DRAW
|
||||
DrawNode *_debugDrawNode;
|
||||
#endif //CC_SPRITE_DEBUG_DRAW
|
||||
bool _insideBounds; /// whether or not the sprite was inside bounds the previous frame
|
||||
TrianglesCommand _trianglesCommand; ///
|
||||
Scale9Sprite::State _brightState;
|
||||
Scale9Sprite::RenderingType _renderingType;
|
||||
};
|
||||
|
||||
}} //end of namespace
|
||||
|
|
|
@ -944,14 +944,14 @@ bool UIS9NinePatchTest::init()
|
|||
playerSprite->setPosition(x, y);
|
||||
playerSprite->setContentSize(preferedSize);
|
||||
auto capInsets = playerSprite->getCapInsets();
|
||||
CCLOG("player sprite capInset = %f, %f %f, %f", capInsets.origin.x,
|
||||
CCLOG("player sprite capInset = %g, %g %g, %g", capInsets.origin.x,
|
||||
capInsets.origin.y, capInsets.size.width, capInsets.size.height);
|
||||
this->addChild(playerSprite);
|
||||
|
||||
auto animationBtnSprite = ui::Scale9Sprite::createWithSpriteFrameName("animationbuttonpressed.png");
|
||||
animationBtnSprite->setPosition(x-100, y-100);
|
||||
capInsets = animationBtnSprite->getCapInsets();
|
||||
CCLOG("animationBtnSprite capInset = %f, %f %f, %f", capInsets.origin.x,
|
||||
CCLOG("animationBtnSprite capInset = %g, %g %g, %g", capInsets.origin.x,
|
||||
capInsets.origin.y, capInsets.size.width, capInsets.size.height);
|
||||
this->addChild(animationBtnSprite);
|
||||
|
||||
|
@ -960,7 +960,7 @@ bool UIS9NinePatchTest::init()
|
|||
monsterSprite->setPosition(x+100, y-100);
|
||||
capInsets = monsterSprite->getCapInsets();
|
||||
monsterSprite->setContentSize(preferedSize);
|
||||
CCLOG("monsterSprite capInset = %f, %f %f, %f", capInsets.origin.x,
|
||||
CCLOG("monsterSprite capInset = %g, %g %g, %g", capInsets.origin.x,
|
||||
capInsets.origin.y, capInsets.size.width, capInsets.size.height);
|
||||
this->addChild(monsterSprite);
|
||||
|
||||
|
|
Loading…
Reference in New Issue