1#include "Project/HitSensor/HitSensorDirector.h"
2
3#include "Library/Execute/ExecuteDirector.h"
4#include "Library/Execute/ExecuteTableHolderUpdate.h"
5#include "Library/LiveActor/ActorSensorUtil.h"
6#include "Project/HitSensor/HitSensor.h"
7#include "Project/HitSensor/SensorHitGroup.h"
8
9namespace al {
10HitSensorDirector::HitSensorDirector(ExecuteDirector* parent) {
11 mPlayer = new SensorHitGroup(256, "Player");
12 mPlayerEye = new SensorHitGroup(128, "PlayerEye");
13 mRide = new SensorHitGroup(128, "Ride");
14 mEye = new SensorHitGroup(1024, "Eye");
15 mLookAt = new SensorHitGroup(512, "LookAt");
16 mSimple = new SensorHitGroup(1536, "Simple");
17 mMapObj = new SensorHitGroup(1536, "MapObj");
18 mCharacter = new SensorHitGroup(1024, "Character");
19 registerExecutorUser(user: this, director: parent, listName: "センサー");
20}
21
22void HitSensorDirector::execute() {
23 mPlayer->clear();
24 mPlayerEye->clear();
25 mRide->clear();
26 mEye->clear();
27 mLookAt->clear();
28 mSimple->clear();
29 mMapObj->clear();
30 mCharacter->clear();
31 executeHitCheckInSameGroup(group: mPlayer);
32 executeHitCheckGroup(group: mPlayer, group2: mPlayerEye);
33 executeHitCheckGroup(group: mPlayer, group2: mCharacter);
34 executeHitCheckGroup(group: mPlayer, group2: mMapObj);
35 executeHitCheckGroup(group: mPlayer, group2: mRide);
36 executeHitCheckGroup(group: mPlayer, group2: mSimple);
37 executeHitCheckGroup(group: mPlayer, group2: mEye);
38 executeHitCheckGroup(group: mPlayerEye, group2: mCharacter);
39 executeHitCheckGroup(group: mPlayerEye, group2: mMapObj);
40 executeHitCheckGroup(group: mPlayerEye, group2: mRide);
41 executeHitCheckGroup(group: mPlayerEye, group2: mSimple);
42 executeHitCheckGroup(group: mPlayerEye, group2: mLookAt);
43 executeHitCheckGroup(group: mRide, group2: mCharacter);
44 executeHitCheckGroup(group: mRide, group2: mMapObj);
45 executeHitCheckGroup(group: mRide, group2: mSimple);
46 executeHitCheckGroup(group: mRide, group2: mEye);
47 executeHitCheckGroup(group: mEye, group2: mCharacter);
48 executeHitCheckGroup(group: mEye, group2: mMapObj);
49 executeHitCheckGroup(group: mEye, group2: mSimple);
50 executeHitCheckGroup(group: mEye, group2: mLookAt);
51 executeHitCheckGroup(group: mCharacter, group2: mMapObj);
52 executeHitCheckInSameGroup(group: mCharacter);
53}
54
55void HitSensorDirector::executeHitCheckInSameGroup(SensorHitGroup* group) const {
56 s32 sensorCount = group->getSensorCount();
57 for (s32 i = 0; i < sensorCount; i++) {
58 auto* sensor = group->getSensor(index: i);
59 for (s32 j = i; j != sensorCount; j++) {
60 auto* otherSensor = group->getSensor(index: j);
61 executeHitCheck(sensor, otherSensor);
62 }
63 }
64}
65
66void HitSensorDirector::executeHitCheckGroup(SensorHitGroup* group, SensorHitGroup* group2) const {
67 s32 sensorCount = group->getSensorCount();
68 for (s32 i = 0; i < sensorCount; i++) {
69 auto* sensor = group->getSensor(index: i);
70 s32 group2SensorCount = group2->getSensorCount();
71 for (s32 j = 0; j < group2SensorCount; j++) {
72 auto* otherSensor = group2->getSensor(index: j);
73 executeHitCheck(sensor, otherSensor);
74 }
75 }
76}
77
78void HitSensorDirector::executeHitCheck(HitSensor* sensor, HitSensor* otherSensor) const {
79 if (sensor->mParentActor == otherSensor->mParentActor)
80 return;
81 sead::Vector3f distance = sensor->mPos - otherSensor->mPos;
82 f32 combinedRadius = sensor->mRadius + otherSensor->mRadius;
83 if (distance.squaredLength() >= sead::Mathf::square(t: combinedRadius))
84 return;
85 if (otherSensor->mSensorType != HitSensorType::Eye &&
86 otherSensor->mSensorType != HitSensorType::PlayerEye)
87 sensor->addHitSensor(otherSensor);
88 if (sensor->mSensorType != HitSensorType::Eye &&
89 sensor->mSensorType != HitSensorType::PlayerEye)
90 otherSensor->addHitSensor(sensor);
91}
92
93void HitSensorDirector::initGroup(HitSensor* sensor) {
94 if (isSensorPlayerEye(sensor))
95 sensor->mHitGroup = mPlayerEye;
96 else if (isSensorPlayerAll(sensor))
97 sensor->mHitGroup = mPlayer;
98 else if (isSensorRide(sensor))
99 sensor->mHitGroup = mRide;
100 else if (isSensorEye(sensor))
101 sensor->mHitGroup = mEye;
102 else if (isSensorSimple(sensor))
103 sensor->mHitGroup = mSimple;
104 else if (isSensorMapObj(sensor))
105 sensor->mHitGroup = mMapObj;
106 else if (isSensorLookAt(sensor))
107 sensor->mHitGroup = mLookAt;
108 else
109 sensor->mHitGroup = mCharacter;
110}
111
112} // namespace al
113