2019-11-23 20:27:39 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2009 Sindesso Pty Ltd http://www.sindesso.com/
|
|
|
|
Copyright (c) 2010-2012 cocos2d-x.org
|
|
|
|
Copyright (c) 2013-2016 Chukong Technologies Inc.
|
|
|
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2024-06-10 02:25:43 +08:00
|
|
|
https://axmol.dev/
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
2023-06-11 13:08:08 +08:00
|
|
|
#include "2d/ActionPageTurn3D.h"
|
|
|
|
#include "2d/Grid.h"
|
|
|
|
#include "2d/NodeGrid.h"
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2024-08-26 00:25:33 +08:00
|
|
|
namespace ax
|
|
|
|
{
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2021-10-23 23:27:14 +08:00
|
|
|
PageTurn3D* PageTurn3D::create(float duration, const Vec2& gridSize)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
PageTurn3D* action = new PageTurn3D();
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2021-12-08 00:11:53 +08:00
|
|
|
if (action->initWithDuration(duration, gridSize))
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
action->autorelease();
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
|
|
|
|
delete action;
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
PageTurn3D* PageTurn3D::clone() const
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
// no copy constructor
|
|
|
|
return PageTurn3D::create(_duration, _gridSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
GridBase* PageTurn3D::getGrid()
|
|
|
|
{
|
|
|
|
auto result = Grid3D::create(_gridSize, _gridNodeTarget->getGridRect());
|
|
|
|
if (result)
|
|
|
|
{
|
|
|
|
result->setNeedDepthTestForBlit(true);
|
|
|
|
}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Update each tick
|
|
|
|
* Time is the percentage of the way through the duration
|
|
|
|
*/
|
|
|
|
void PageTurn3D::update(float time)
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
float tt = MAX(0, time - 0.25f);
|
2019-11-23 20:27:39 +08:00
|
|
|
float deltaAy = (tt * tt * 500);
|
2021-12-25 10:04:45 +08:00
|
|
|
float ay = -100 - deltaAy;
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
float deltaTheta = sqrtf(time);
|
2021-12-25 10:04:45 +08:00
|
|
|
float theta = deltaTheta > 0.5f ? (float)M_PI_2 * deltaTheta : (float)M_PI_2 * (1 - deltaTheta);
|
|
|
|
|
|
|
|
float rotateByYAxis = (2 - time) * (float)M_PI;
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
float sinTheta = sinf(theta);
|
|
|
|
float cosTheta = cosf(theta);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
for (int i = 0; i <= _gridSize.width; ++i)
|
|
|
|
{
|
|
|
|
for (int j = 0; j <= _gridSize.height; ++j)
|
|
|
|
{
|
|
|
|
Vec2 pos((float)i, (float)j);
|
|
|
|
// Get original vertex
|
|
|
|
Vec3 p = getOriginalVertex(pos);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
p.x -= getGridRect().origin.x;
|
2021-12-25 10:04:45 +08:00
|
|
|
float R = sqrtf((p.x * p.x) + ((p.y - ay) * (p.y - ay)));
|
|
|
|
float r = R * sinTheta;
|
|
|
|
float alpha = asinf(p.x / R);
|
|
|
|
float beta = alpha / sinTheta;
|
|
|
|
float cosBeta = cosf(beta);
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// If beta > PI then we've wrapped around the cone
|
|
|
|
// Reduce the radius to stop these points interfering with others
|
|
|
|
if (beta <= M_PI)
|
|
|
|
{
|
2021-12-25 10:04:45 +08:00
|
|
|
p.x = (r * sinf(beta));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Force X = 0 to stop wrapped
|
|
|
|
// points
|
|
|
|
p.x = 0;
|
|
|
|
}
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
p.y = (R + ay - (r * (1 - cosBeta) * sinTheta));
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
// We scale z here to avoid the animation being
|
|
|
|
// too much bigger than the screen due to perspective transform
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
p.z = (r * (1 - cosBeta) * cosTheta); // "100" didn't work for
|
2019-11-23 20:27:39 +08:00
|
|
|
p.x = p.z * sinf(rotateByYAxis) + p.x * cosf(rotateByYAxis);
|
|
|
|
p.z = p.z * cosf(rotateByYAxis) - p.x * sinf(rotateByYAxis);
|
2021-12-25 10:04:45 +08:00
|
|
|
p.z /= 7;
|
2019-11-23 20:27:39 +08:00
|
|
|
// Stop z coord from dropping beneath underlying page in a transition
|
|
|
|
// issue #751
|
2021-12-25 10:04:45 +08:00
|
|
|
if (p.z < 0.5f)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
p.z = 0.5f;
|
|
|
|
}
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// Set new coords
|
|
|
|
p.x += getGridRect().origin.x;
|
|
|
|
setVertex(pos, p);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-26 00:25:33 +08:00
|
|
|
}
|