1#include "Game/Camera/CameraShaker.hpp"
2#include "Game/Camera/CameraShakePatternImpl.hpp"
3#include "Game/Camera/CameraShakeTask.hpp"
4#include "Game/Util/CameraUtil.hpp"
6f32 sVerticalTaskTable[7] = {
16f32 sHorizontalTable[3] = {
22CameraShaker::CameraShaker(
const char *pName) :
NameObj(pName) {
23 createSinglyVerticalTask();
24 createSinglyHorizontalTask();
28CameraShaker::~CameraShaker() {
32void CameraShaker::movement() {
33 updateSinglyVerticalTask();
34 updateSinglyHorizontalTask();
39void CameraShaker::shakeVertical(ESinglyVerticalPower power) {
40 if (mVerticalTasks[power]->isEnd()) {
41 mVerticalTasks[power]->start(1, 0);
45void CameraShaker::shakeInfinity(
NameObj *pNameObj,
float a2,
float a3) {
46 for (u32 i = 0; i < NR_INFINITY_TASKS; i++) {
47 if (mInfinityTasks[i]->isEnd()) {
48 startInfinity(i, a2, a3);
49 mInfinityNameObjs[i] = pNameObj;
55void CameraShaker::stopShakingInfinity(
NameObj *pNameObj) {
56 for (u32 i = 0; i < NR_INFINITY_TASKS; i++) {
57 if (mInfinityNameObjs[i] == pNameObj) {
58 mInfinityTasks[i]->endForce();
59 mInfinityNameObjs[i] =
nullptr;
65void CameraShaker::createSinglyVerticalTask() {
66 for (u32 i = 0; i < NR_VERTICAL_TASKS; i++) {
70 mVerticalTasks[i] = task;
74void CameraShaker::createSinglyHorizontalTask() {
82 for (u32 i = 0; i < NR_VERTICAL_TASKS; i++) {
89 singly->setDirection(dir);
93 mHorizontalTasks[i] = task;
97void CameraShaker::createInfinityTask() {
98 for (u32 i = 0; i < NR_INFINITY_TASKS; i++) {
102 mInfinityTasks[i] = task;
103 mInfinityNameObjs[i] =
nullptr;
107void CameraShaker::updateSinglyVerticalTask() {
108 for (u32 i = 0; i < NR_VERTICAL_TASKS; i++) {
109 mVerticalTasks[i]->movement();
113void CameraShaker::updateSinglyHorizontalTask() {
114 for (u32 i = 0; i < NR_HORIZONTAL_TASKS; i++) {
115 mHorizontalTasks[i]->movement();
119void CameraShaker::updateInfinityTask() {
120 for (u32 i = 0; i < NR_INFINITY_TASKS; i++) {
121 mInfinityTasks[i]->movement();
125void CameraShaker::setOffset() {
126 TVec2f offset = TVec2f(0.0f, 0.0f);
128 addSinglyVerticalTaskOffset(&offset);
129 addSinglyHorizontalTaskOffset(&offset);
130 addInfinityTaskOffset(&offset);
131 adjustOffsetToScreen(&offset);
132 MR::setShakeOffset(offset.x, offset.y);
135void CameraShaker::addSinglyVerticalTaskOffset(TVec2f *pOffset) {
136 for (u32 i = 0; i < NR_VERTICAL_TASKS; i++) {
137 if (!mVerticalTasks[i]->isEnd()) {
139 mVerticalTasks[i]->getOffset(&offset);
141 pOffset->x += offset.x;
142 pOffset->y += offset.y;
147void CameraShaker::addSinglyHorizontalTaskOffset(TVec2f *pOffset) {
148 for (u32 i = 0; i < NR_HORIZONTAL_TASKS; i++) {
149 if (!mHorizontalTasks[i]->isEnd()) {
151 mHorizontalTasks[i]->getOffset(&offset);
153 pOffset->x += offset.x;
154 pOffset->y += offset.y;
159void CameraShaker::addInfinityTaskOffset(TVec2f *pOffset) {
160 for (u32 i = 0; i < NR_INFINITY_TASKS; i++) {
161 if (!mInfinityTasks[i]->isEnd()) {
163 mInfinityTasks[i]->getOffset(&offset);
165 pOffset->x += offset.x;
166 pOffset->y += offset.y;
171void CameraShaker::startInfinity(
unsigned long index,
float a2,
float a3) {
177 mInfinityTasks[index]->startInfinity(0);
The most basic form of an object.