From 66248ad16bda77a22945504849a33455bfa57be7 Mon Sep 17 00:00:00 2001 From: Thomas Edvalson Date: Thu, 6 Feb 2014 20:46:43 -0500 Subject: [PATCH] Fixed structure flaw that didn't draw stage actors with 3D effect. --- include/cpp3ds/Drawable.h | 4 ++-- include/cpp3ds/Screen.h | 4 ++-- include/cpp3ds/Stage.h | 8 ++++---- include/cpp3ds/TopScreen.h | 10 ++++++---- include/cpp3ds/actors/Rectangle.h | 2 +- include/cpp3ds/actors/Text.h | 7 ++++--- src/Screen.cpp | 27 +++++++++++++++------------ src/Stage.cpp | 14 +++++++------- src/TopScreen.cpp | 16 ++++++++++------ src/actors/Actor.cpp | 8 -------- src/actors/Text.cpp | 2 +- 11 files changed, 52 insertions(+), 50 deletions(-) diff --git a/include/cpp3ds/Drawable.h b/include/cpp3ds/Drawable.h index 02ec8ac..6f40b5b 100644 --- a/include/cpp3ds/Drawable.h +++ b/include/cpp3ds/Drawable.h @@ -8,8 +8,8 @@ namespace cpp3ds { class Drawable { public: float depth3d; - Drawable(){ depth3d = 0; } - virtual void draw(Screen& screen, float x, float y) = 0; + Drawable(float depth3d): depth3d(depth3d) {} + virtual void draw(Screen& screen, float x, float y, bool use3D, bool isLeftside) = 0; }; } diff --git a/include/cpp3ds/Screen.h b/include/cpp3ds/Screen.h index 47e63f0..7a39194 100644 --- a/include/cpp3ds/Screen.h +++ b/include/cpp3ds/Screen.h @@ -19,8 +19,8 @@ namespace cpp3ds { int getHeight(){ return height; } void setPixelAddress(int addr, Color color); void setPixel(int x, int y, Color color); - void clear(Color color); - void draw(Drawable& obj, float x = 0, float y = 0); + void clear(Color color = {0,0,0}); + virtual void draw(Drawable& obj, float x = 0, float y = 0, bool use3D = false); }; } diff --git a/include/cpp3ds/Stage.h b/include/cpp3ds/Stage.h index 1df5416..8b71f6c 100644 --- a/include/cpp3ds/Stage.h +++ b/include/cpp3ds/Stage.h @@ -17,10 +17,10 @@ namespace cpp3ds { float width, height; ActorNode *actorHead, *actorTail; public: - Stage(); - void addActor(Actor& actor); - void removeActor(Actor& actor); - virtual void draw(Screen& screen, float x = 0, float y = 0); + Stage(): Actors::Actor(0,0,0), actorHead(NULL), actorTail(NULL) {} + void addActor(Actors::Actor& actor); + void removeActor(Actors::Actor& actor); + virtual void draw(Screen& screen, float x = 0, float y = 0, bool use3D = true, bool isLeftside = true); }; } diff --git a/include/cpp3ds/TopScreen.h b/include/cpp3ds/TopScreen.h index 990e9bd..5dbb952 100644 --- a/include/cpp3ds/TopScreen.h +++ b/include/cpp3ds/TopScreen.h @@ -11,19 +11,21 @@ #define TOP_LEFT_FRAME2 0x201CB370 #define TOP_RIGHT_FRAME1 0x20282160 #define TOP_RIGHT_FRAME2 0x202C8670 +#define SLIDER_STATE 0x10144000 namespace cpp3ds { class TopScreen: public Screen { protected: - Screen right_screen; + Screen left_screen, right_screen; int width, height; public: TopScreen(): - Screen(TOP_LEFT_FRAME1, TOP_LEFT_FRAME2, TOP_WIDTH, TOP_HEIGHT), + Screen(0, 0, TOP_WIDTH, TOP_HEIGHT), + left_screen(TOP_LEFT_FRAME1, TOP_LEFT_FRAME2, TOP_WIDTH, TOP_HEIGHT), right_screen(TOP_RIGHT_FRAME1, TOP_RIGHT_FRAME2, TOP_WIDTH, TOP_HEIGHT) {}; - void clear(Color color); - void draw(Drawable& obj, float x = 0, float y = 0); + void clear(Color color = {0,0,0}); + virtual void draw(Drawable& obj, float x = 0, float y = 0, bool use3D = true); }; } diff --git a/include/cpp3ds/actors/Rectangle.h b/include/cpp3ds/actors/Rectangle.h index f0673b4..cfd0b54 100644 --- a/include/cpp3ds/actors/Rectangle.h +++ b/include/cpp3ds/actors/Rectangle.h @@ -14,7 +14,7 @@ namespace cpp3ds { public: Color color; Rectangle(int w, int h, Color color, float x = 0, float y = 0, float depth3d = 0): - width(w), height(h), color(color), Actor(x, y, depth3d) {} + Actor(x, y, depth3d), width(w), height(h), color(color) {} virtual void draw(Screen& screen, float x = 0, float y = 0); }; diff --git a/include/cpp3ds/actors/Text.h b/include/cpp3ds/actors/Text.h index 365dc8b..04a2d1c 100644 --- a/include/cpp3ds/actors/Text.h +++ b/include/cpp3ds/actors/Text.h @@ -1,6 +1,7 @@ #ifndef TEXT_ACTOR_H #define TEXT_ACTOR_H +#include #include #include #include @@ -14,9 +15,9 @@ namespace cpp3ds { public: char* text; Color color; - Text(char* text, Color color, float x = 0, float y = 0, float depth3d = 0): - text(text), color(color), Actor(x, y, depth3d) {} - virtual void draw(Screen& screen, float x = 0, float y = 0); + Text(char* text, Color color = {0,0,0}, float x = 0, float y = 0, float depth3d = 0): + Actor(x, y, depth3d), text(text), color(color) {} + virtual void draw(Screen& screen, float x = 0, float y = 0, bool use3D = true, bool isLeftside = true); }; } diff --git a/src/Screen.cpp b/src/Screen.cpp index 1237a58..a7f50cb 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -20,21 +20,24 @@ namespace cpp3ds { } void Screen::clear(Color color){ - // Just clear to black - // memset((char*)frame1, 0, width*height*3); - // memset((char*)frame2, 0, width*height*3); - // TODO: Too slow, maybe try memcpy? - char* frameptr1 = (char*)frame1; - char* frameptr2 = (char*)frame2; - for (int i = 0; i < width*height; ++i){ - *frameptr1++ = *frameptr2++ = color.b; - *frameptr1++ = *frameptr2++ = color.g; - *frameptr1++ = *frameptr2++ = color.r; + if (color.r == color.g && color.g == color.b){ + memset((char*)frame1, color.r, width*height*3); + memset((char*)frame2, color.r, width*height*3); + } else { + // TODO: Too slow, maybe try memcpy? + char* frameptr1 = (char*)frame1; + char* frameptr2 = (char*)frame2; + for (int i = 0; i < width*height; ++i){ + *frameptr1++ = *frameptr2++ = color.b; + *frameptr1++ = *frameptr2++ = color.g; + *frameptr1++ = *frameptr2++ = color.r; + } } } - void Screen::draw(Drawable& obj, float x, float y) { - obj.draw(*this, x, y); + void Screen::draw(Drawable& obj, float x, float y, bool use3D) { + // TODO: Check bounds and don't draw objects outside screen + obj.draw(*this, x, y, use3D, true); } } diff --git a/src/Stage.cpp b/src/Stage.cpp index 6f80ea9..53ea750 100644 --- a/src/Stage.cpp +++ b/src/Stage.cpp @@ -5,11 +5,6 @@ namespace cpp3ds { - Stage::Stage(){ - actorHead = NULL; - actorTail = NULL; - } - void Stage::addActor(Actors::Actor& actor){ if (this == &actor) return; // Avoid infinite recursion @@ -39,11 +34,16 @@ namespace cpp3ds { } } - void Stage::draw(Screen& screen, float x, float y) { + void Stage::draw(Screen& screen, float x, float y, bool use3D, bool isLeftside) { // Loop through and draw all actors on the stage ActorNode* cur = actorTail; while (cur != NULL) { - cur->actor->draw(screen, this->x + x, this->y + y); + Actors::Actor& actor = *cur->actor; + if (use3D) { + float slider = 1.0f * actor.depth3d; + x = (isLeftside) ? x - slider : x + slider; + } + actor.draw(screen, this->x + x, this->y + y, use3D, isLeftside); cur = cur->prev; } } diff --git a/src/TopScreen.cpp b/src/TopScreen.cpp index 832f846..663b218 100644 --- a/src/TopScreen.cpp +++ b/src/TopScreen.cpp @@ -5,15 +5,19 @@ namespace cpp3ds { void TopScreen::clear(Color color){ - Screen::clear(color); + left_screen.clear(color); right_screen.clear(color); } - void TopScreen::draw(Drawable& obj, float x, float y) { - // TODO: Get real 3D Slider State - float slider = 1.0f; - obj.draw(*this, x - slider * obj.depth3d, y); - obj.draw(right_screen, x + slider * obj.depth3d, y); + void TopScreen::draw(Drawable& obj, float x, float y, bool use3D) { + if (use3D) { + float slider = 1.0f * obj.depth3d; + obj.draw(left_screen, x - slider, y, use3D, true); + obj.draw(right_screen, x + slider, y, use3D, false); + } else { + obj.draw(left_screen, x, y, use3D, true); + obj.draw(right_screen, x, y, use3D, false); + } } } diff --git a/src/actors/Actor.cpp b/src/actors/Actor.cpp index cce471f..6aee75e 100644 --- a/src/actors/Actor.cpp +++ b/src/actors/Actor.cpp @@ -4,14 +4,6 @@ namespace cpp3ds { namespace Actors { - - Actor::Actor(float x, float y, float depth3d) { - stageHead = NULL; - stageTail = NULL; - this->x = x; - this->y = y; - this->depth3d = depth3d; - } void Actor::addStage(Stage& stage){ StageNode *node = new StageNode(); diff --git a/src/actors/Text.cpp b/src/actors/Text.cpp index a51e030..9cf92dc 100644 --- a/src/actors/Text.cpp +++ b/src/actors/Text.cpp @@ -23,7 +23,7 @@ namespace cpp3ds { } } - void Text::draw(Screen& screen, float x, float y) { + void Text::draw(Screen& screen, float x, float y, bool use3D, bool isLeftside) { float tmp_x = this->x + x; int i; int line = 0;