22 #ifndef ALCACHOFA_DEBUG_H 23 #define ALCACHOFA_DEBUG_H 25 #include "alcachofa/alcachofa.h" 35 virtual void update() = 0;
43 void update()
override {
44 auto mousePos2D =
g_engine->input().debugInput().mousePos2D();
45 auto mousePos3D =
g_engine->input().debugInput().mousePos3D();
46 auto floor =
g_engine->player().currentRoom()->activeFloor();
48 if (floor ==
nullptr || renderer ==
nullptr)
52 if (_polygonI < 0 || (uint)_polygonI >= floor->polygonCount())
53 target3D = floor->closestPointTo(mousePos3D);
55 target3D = floor->at((uint)_polygonI).closestPointTo(mousePos3D);
56 renderer->debugPolyline(mousePos2D,
g_engine->camera().transform3Dto2D(target3D));
66 void update()
override {
67 auto floor =
g_engine->player().currentRoom()->activeFloor();
69 if (floor ==
nullptr || renderer ==
nullptr) {
70 g_engine->console().attach(
"Either the room has no floor or the renderer is not a debug renderer");
71 g_engine->setDebugMode(DebugMode::None, 0);
75 if (
g_engine->input().debugInput().wasMouseLeftPressed())
76 _fromPos3D =
g_engine->input().debugInput().mousePos3D();
77 renderer->debugPolyline(
78 g_engine->camera().transform3Dto2D(_fromPos3D),
79 g_engine->input().debugInput().mousePos2D(),
82 if (_polygonI >= 0 && (uint)_polygonI < floor->polygonCount())
83 drawIntersectionsFor(floor->at((uint)_polygonI), renderer);
85 for (uint i = 0; i < floor->polygonCount(); i++)
86 drawIntersectionsFor(floor->at(i), renderer);
91 static constexpr
float kMarkerLength = 16;
95 auto mousePos3D =
g_engine->input().debugInput().mousePos3D();
96 for (uint i = 0; i < polygon._points.size(); i++) {
97 if (!polygon.intersectsEdge(i, _fromPos3D, mousePos3D))
99 auto a = camera.transform3Dto2D(polygon._points[i]);
100 auto b = camera.transform3Dto2D(polygon._points[(i + 1) % polygon._points.size()]);
101 auto mid = (a + b) / 2;
102 auto length = sqrtf(a.sqrDist(b));
104 normal = { normal.y, (int16)-normal.x };
105 auto inner = mid + normal * (kMarkerLength / length);
107 renderer->debugPolyline(a, b, kDebugGreen);
108 renderer->debugPolyline(mid, inner, kDebugGreen);
114 MainCharacterKind _kind;
118 void update()
override {
120 g_engine->player().drawCursor(
true);
123 auto &input =
g_engine->input().debugInput();
124 if (input.wasMouseRightPressed()) {
125 g_engine->setDebugMode(DebugMode::None, 0);
129 if (!input.wasMouseLeftPressed())
131 auto floor =
g_engine->player().currentRoom()->activeFloor();
132 if (floor ==
nullptr || !floor->contains(input.mousePos3D()))
135 if (_kind == MainCharacterKind::Filemon)
136 teleport(
g_engine->world().filemon(), input.mousePos3D());
137 else if (_kind == MainCharacterKind::Mortadelo)
138 teleport(
g_engine->world().mortadelo(), input.mousePos3D());
140 teleport(
g_engine->world().filemon(), input.mousePos3D());
141 teleport(
g_engine->world().mortadelo(), input.mousePos3D());
143 g_engine->setDebugMode(DebugMode::None, 0);
148 auto currentRoom =
g_engine->player().currentRoom();
149 if (character.room() != currentRoom) {
150 character.resetTalking();
151 character.room() = currentRoom;
153 character.setPosition(position);
159 const bool _useColor;
160 Color _curColor = kDebugGreen;
161 bool _isOnFloor =
false;
162 static constexpr
size_t kBufferSize = 64;
163 char _buffer[kBufferSize] = { 0 };
167 , _useColor(useColor) {}
172 for (
auto itObject = room->beginObjects(); itObject != room->endObjects(); ++itObject) {
174 if (floor ==
nullptr)
183 g_engine->console().debugPrintf(
"Invalid floor color index, there are %u floors in this room\n", floorCount);
187 void update()
override {
188 auto &input =
g_engine->input().debugInput();
189 if (input.wasMouseRightPressed()) {
190 g_engine->setDebugMode(DebugMode::None, 0);
194 if (input.isMouseLeftDown()) {
195 auto optColor = _shape.colorAt(input.mousePos3D());
196 _isOnFloor = optColor.first;
198 uint8 roomAlpha = (uint)(
g_engine->player().currentRoom()->characterAlphaTint() * 255 / 100);
199 optColor.second =
Color { 255, 255, 255, roomAlpha };
202 _curColor = _useColor
203 ?
Color { optColor.second.r, optColor.second.g, optColor.second.b, 255 }
204 :
Color { optColor.second.a, optColor.second.a, optColor.second.a, 255 };
205 g_engine->world().mortadelo().color() =
206 g_engine->world().filemon().color() =
207 _useColor ? optColor.second :
Color { 255, 255, 255, optColor.second.a };
210 snprintf(_buffer, kBufferSize,
"r:%3d g:%3d b:%3d a:%3d",
211 (
int)_curColor.r, (
int)_curColor.g, (
int)_curColor.b, (
int)_curColor.a);
215 g_engine->player().drawCursor(
true);
216 g_engine->renderer().setTexture(
nullptr);
217 g_engine->renderer().quad({ 0, 0 }, { 50, 50 }, _isOnFloor ? _curColor : kDebugGreen);
219 g_engine->globalUI().dialogFont(), _buffer,
Point { 70, 20 }, 500,
false, kWhite, -kForegroundOrderCount + 1);
221 g_engine->renderer().quad({ 5, 5 }, { 40, 40 }, _curColor);
222 if (debugRenderer !=
nullptr)
223 debugRenderer->debugShape(_shape, kDebugBlue);
230 #endif // ALCACHOFA_DEBUG_H Definition: graphics.h:101
Definition: alcachofa.h:45
Definition: graphics.h:369
Definition: objects.h:588
Definition: algorithm.h:29
Definition: objects.h:528