From 9efd8ab3e1b5bf899f9bfa5ec0300da548002d68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sandro=20Sobczy=C5=84ski?=
<32263891+h4570@users.noreply.github.com>
Date: Sun, 7 Feb 2021 14:13:31 +0100
Subject: [PATCH 01/16] Update README.MD
---
README.MD | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.MD b/README.MD
index f3c2777..6ca9f02 100644
--- a/README.MD
+++ b/README.MD
@@ -75,6 +75,8 @@ Tyra takes care for you, and rendering, coprocessors communication, synchronizat
* Master - monthly releases - tested on PS2 & PCSX2.
* Develop - daily builds - can be unstable.
+[](https://github.com/h4570/tyra/stargazers)
+
## Getting Started
### Installation [](https://discord.gg/NhhTmg3Gm5)
From 142bf60a6dc1487b2a5573b4cb87a474e9a0893e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sandro=20Sobczy=C5=84ski?=
<32263891+h4570@users.noreply.github.com>
Date: Sun, 7 Feb 2021 17:03:16 +0100
Subject: [PATCH 02/16] Update README.MD
---
README.MD | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/README.MD b/README.MD
index 6ca9f02..661b02d 100644
--- a/README.MD
+++ b/README.MD
@@ -25,6 +25,8 @@
+[](https://github.com/h4570/tyra/stargazers)
+
## Table of Contents
* [About the Project](#about-the-project)
@@ -75,8 +77,6 @@ Tyra takes care for you, and rendering, coprocessors communication, synchronizat
* Master - monthly releases - tested on PS2 & PCSX2.
* Develop - daily builds - can be unstable.
-[](https://github.com/h4570/tyra/stargazers)
-
## Getting Started
### Installation [](https://discord.gg/NhhTmg3Gm5)
@@ -84,7 +84,6 @@ In our Discord channel, there is detailed tutorial which will help you with sett
### Prerequisites
-This is an example of how to list things you need to use the software.
* PS2 DEV environment - [PS2DEV](https://github.com/ps2dev/ps2dev)
* At least #e8e9edb PS2SDK (06.02.2021) - [PS2SDK](https://github.com/ps2dev/ps2sdk)
* PS2 Emulator. For example [PCSX2](https://pcsx2.net/)
From 11717f42ebe74ab88b118b52f0df50f0a86e9d0e Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Fri, 2 Apr 2021 09:01:14 -0300
Subject: [PATCH 03/16] Initial setup for Cube sample
---
src/samples/cube/Makefile | 33 +++++
src/samples/cube/camera.cpp | 67 +++++++++
src/samples/cube/camera.hpp | 41 ++++++
src/samples/cube/cube.cpp | 32 +++++
src/samples/cube/cube.hpp | 28 ++++
src/samples/cube/main.cpp | 10 ++
src/samples/cube/managers/light_manager.cpp | 148 ++++++++++++++++++++
src/samples/cube/managers/light_manager.hpp | 38 +++++
8 files changed, 397 insertions(+)
create mode 100644 src/samples/cube/Makefile
create mode 100644 src/samples/cube/camera.cpp
create mode 100644 src/samples/cube/camera.hpp
create mode 100644 src/samples/cube/cube.cpp
create mode 100644 src/samples/cube/cube.hpp
create mode 100644 src/samples/cube/main.cpp
create mode 100644 src/samples/cube/managers/light_manager.cpp
create mode 100644 src/samples/cube/managers/light_manager.hpp
diff --git a/src/samples/cube/Makefile b/src/samples/cube/Makefile
new file mode 100644
index 0000000..7d1b17f
--- /dev/null
+++ b/src/samples/cube/Makefile
@@ -0,0 +1,33 @@
+EE_BIN = cube.elf
+
+TYRA_DIR = ./../../engine
+
+EE_OBJS = \
+ managers/light_manager.o \
+ camera.o \
+ cube.o \
+ main.o
+
+EE_LIBS = -ltyra
+
+all: $(EE_BIN)
+ $(EE_STRIP) --strip-all $(EE_BIN)
+ mv $(EE_BIN) bin/$(EE_BIN)
+ rm $(EE_OBJS)
+
+rebuild-engine:
+ cd $(TYRA_DIR) && make clean && make
+
+clean:
+ rm -f $(EE_OBJS)
+
+run: $(EE_BIN)
+ killall -v ps2client || true
+ ps2client reset
+ ps2client reset
+ $(EE_STRIP) --strip-all $(EE_BIN)
+ mv $(EE_BIN) bin/$(EE_BIN)
+ rm $(EE_OBJS)
+ cd bin/ && ps2client execee host:$(EE_BIN)
+
+include $(TYRA_DIR)/Makefile.pref
diff --git a/src/samples/cube/camera.cpp b/src/samples/cube/camera.cpp
new file mode 100644
index 0000000..e797c0f
--- /dev/null
+++ b/src/samples/cube/camera.cpp
@@ -0,0 +1,67 @@
+/*
+# ______ ____ ___
+# | \/ ____| |___|
+# | | | \ | |
+#-----------------------------------------------------------------------
+# Copyright 2020, tyra - https://github.com/h4570/tyra
+# Licenced under Apache License 2.0
+# Sandro Sobczyński
+*/
+
+#include "camera.hpp"
+
+#include
+#include
+
+const float CAMERA_Y = 30.0F;
+
+// ----
+// Constructors/Destructors
+// ----
+
+Camera::Camera(ScreenSettings *t_screen) : CameraBase(t_screen, &position)
+{
+ PRINT_LOG("Initializing camera");
+ verticalLevel = 80.0F;
+ PRINT_LOG("Camera initialized!");
+}
+
+Camera::~Camera() {}
+
+// ----
+// Methods
+// ----
+
+void Camera::update(Pad &t_pad, Mesh &t_mesh)
+{
+ rotate(t_pad);
+ followBy(t_mesh);
+ lookAt(t_mesh.position);
+}
+
+/** Set camera rotation by pad right joy and update unit circle
+ * https://en.wikipedia.org/wiki/Unit_circle
+ * https://www.desmos.com/calculator/3e7iypw4ow
+ */
+void Camera::rotate(Pad &t_pad)
+{
+ if (t_pad.rJoyH <= 100)
+ horizontalLevel -= 0.08;
+ else if (t_pad.rJoyH >= 200)
+ horizontalLevel += 0.08;
+ if (t_pad.rJoyV <= 50 && verticalLevel > 25.0F)
+ verticalLevel -= 0.9F;
+ else if (t_pad.rJoyV >= 200 && verticalLevel < 80.0F)
+ verticalLevel += 0.9F;
+ unitCirclePosition.x = (sin(horizontalLevel) * verticalLevel);
+ unitCirclePosition.y = CAMERA_Y;
+ unitCirclePosition.z = (cos(horizontalLevel) * verticalLevel);
+}
+
+/** Rotate camera around 3D object */
+void Camera::followBy(Mesh &t_mesh)
+{
+ position.x = unitCirclePosition.x + t_mesh.position.x;
+ position.y = unitCirclePosition.y + t_mesh.position.y;
+ position.z = unitCirclePosition.z + t_mesh.position.z;
+}
diff --git a/src/samples/cube/camera.hpp b/src/samples/cube/camera.hpp
new file mode 100644
index 0000000..49735d2
--- /dev/null
+++ b/src/samples/cube/camera.hpp
@@ -0,0 +1,41 @@
+/*
+# ______ ____ ___
+# | \/ ____| |___|
+# | | | \ | |
+#-----------------------------------------------------------------------
+# Copyright 2020, tyra - https://github.com/h4570/tyra
+# Licenced under Apache License 2.0
+# Sandro Sobczyński
+*/
+
+#ifndef _CAMERA_
+#define _CAMERA_
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+/** 3D camera which follow by 3D object. Can be rotated via pad */
+class Camera : public CameraBase
+{
+
+public:
+ Vector3 up, position, unitCirclePosition;
+ float horizontalLevel, verticalLevel;
+
+ Camera(ScreenSettings *t_screen);
+ ~Camera();
+
+ void update(Pad &t_pad, Mesh &t_mesh);
+ void rotate(Pad &t_pad);
+ void followBy(Mesh &t_mesh);
+
+protected:
+ Vector3 *getPosition() { return &position; };
+ ScreenSettings screen;
+};
+
+#endif
diff --git a/src/samples/cube/cube.cpp b/src/samples/cube/cube.cpp
new file mode 100644
index 0000000..c0b4399
--- /dev/null
+++ b/src/samples/cube/cube.cpp
@@ -0,0 +1,32 @@
+#include "cube.hpp"
+
+Cube::Cube(Engine *t_engine)
+ : engine(t_engine), camera(&t_engine->screen)
+{
+ return;
+}
+
+Cube::~Cube()
+{
+ return;
+}
+
+void Cube::onInit(){
+ setBgColorAndAmbientColor();
+ engine->renderer->setCameraDefinitions(&camera.view, &camera.unitCirclePosition, camera.planes);
+}
+
+void Cube::onUpdate(){
+ lightManager.update();
+}
+
+void Cube::setBgColorAndAmbientColor()
+{
+ color_t bgColor;
+ bgColor.r = 0x20;
+ bgColor.g = 0x20;
+ bgColor.b = 0x20;
+ engine->renderer->setWorldColor(bgColor);
+ Vector3 ambient = Vector3(0.003F, 0.003F, 0.003F);
+ engine->renderer->setAmbientLight(ambient);
+}
\ No newline at end of file
diff --git a/src/samples/cube/cube.hpp b/src/samples/cube/cube.hpp
new file mode 100644
index 0000000..b46c0bc
--- /dev/null
+++ b/src/samples/cube/cube.hpp
@@ -0,0 +1,28 @@
+#ifndef _CUBE_
+#define _CUBE_
+
+#include
+#include
+#include
+#include "managers/light_manager.hpp"
+#include "./camera.hpp"
+
+class Cube : public Game
+{
+
+public:
+ Cube(Engine *t_engine);
+ ~Cube();
+
+ void onInit();
+ void onUpdate();
+
+ Engine *engine;
+
+private:
+ void setBgColorAndAmbientColor();
+ LightManager lightManager;
+ Camera camera;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/samples/cube/main.cpp b/src/samples/cube/main.cpp
new file mode 100644
index 0000000..1b62314
--- /dev/null
+++ b/src/samples/cube/main.cpp
@@ -0,0 +1,10 @@
+#include "cube.hpp"
+
+int main()
+{
+ Engine engine = Engine();
+ Cube game = Cube(&engine);
+ game.engine->init(&game, 128);
+ SleepThread();
+ return 0;
+}
\ No newline at end of file
diff --git a/src/samples/cube/managers/light_manager.cpp b/src/samples/cube/managers/light_manager.cpp
new file mode 100644
index 0000000..a87f322
--- /dev/null
+++ b/src/samples/cube/managers/light_manager.cpp
@@ -0,0 +1,148 @@
+/*
+# ______ ____ ___
+# | \/ ____| |___|
+# | | | \ | |
+#-----------------------------------------------------------------------
+# Copyright 2020, tyra - https://github.com/h4570/tyra
+# Licenced under Apache License 2.0
+# Sandro Sobczyński
+*/
+
+#include "light_manager.hpp"
+#include
+
+// ----
+// Constructors/Destructors
+// ----
+
+LightManager::LightManager()
+{
+ PRINT_LOG("Creating light manager!");
+ bulbsCount = 2;
+
+ bulbs = new LightBulb[2];
+ bulb1Dir = 0;
+ bulbs[0].intensity = 1;
+ bulbs[0].position.set(30.00F, 30.00F, -30.00F);
+
+ bulb2Dir = 1;
+ bulbs[1].intensity = 1;
+ bulbs[1].position.set(-30.00F, 30.00F, 30.00F);
+
+ audioOffset = audioTick = 0;
+
+ PRINT_LOG("Light manager created!");
+}
+
+LightManager::~LightManager()
+{
+ delete[] bulbs;
+}
+
+// ----
+// Methods
+// ----
+
+/** Light bulb moving test */
+void LightManager::update()
+{
+ updateBulb1();
+ updateBulb2();
+}
+
+void LightManager::updateBulb1()
+{
+ if (bulb1Dir == 1)
+ {
+ if (areLightsInverted)
+ {
+ bulbs[0].position.x += 0.6F;
+ bulbs[0].position.z -= 0.6F;
+ }
+ else
+ {
+ bulbs[0].position.x += 0.6F;
+ bulbs[0].position.z += 0.6F;
+ }
+ }
+ else
+ {
+ if (areLightsInverted)
+ {
+ bulbs[0].position.x -= 0.6F;
+ bulbs[0].position.z += 0.6F;
+ }
+ else
+ {
+ bulbs[0].position.x -= 0.6F;
+ bulbs[0].position.z -= 0.6F;
+ }
+ }
+}
+
+void LightManager::updateBulb2()
+{
+ if (bulb2Dir == 1)
+ {
+ if (areLightsInverted)
+ {
+ bulbs[1].position.x -= 0.6F;
+ bulbs[1].position.z += 0.6F;
+ }
+ else
+ {
+ bulbs[1].position.x += 0.6F;
+ bulbs[1].position.z += 0.6F;
+ }
+ }
+ else
+ {
+ if (areLightsInverted)
+ {
+ bulbs[1].position.x += 0.6F;
+ bulbs[1].position.z -= 0.6F;
+ }
+ else
+ {
+ bulbs[1].position.x -= 0.6F;
+ bulbs[1].position.z -= 0.6F;
+ }
+ }
+}
+
+/** Called by audio thread */
+void LightManager::onAudioTick()
+{
+ bulb1Dir = bulb1Dir == 1 ? 0 : 1;
+ bulb2Dir = bulb2Dir == 1 ? 0 : 1;
+ if (audioTick++ > 17)
+ {
+ if (++audioOffset > 3)
+ {
+ audioOffset = 0;
+ if (areLightsInverted)
+ {
+ areLightsInverted = false;
+ bulbs[0].position.x = 20.0F;
+ bulbs[0].position.z = -20.0F;
+
+ bulbs[1].position.x = -20.0F;
+ bulbs[1].position.z = 20.0F;
+ }
+ else
+ {
+ areLightsInverted = true;
+ bulbs[0].position.x = 20.0F;
+ bulbs[0].position.z = 20.0F;
+
+ bulbs[1].position.x = -20.0F;
+ bulbs[1].position.z = -20.0F;
+ }
+ }
+ }
+ else
+ {
+ bulbs[0].intensity += 9;
+ bulbs[1].intensity += 9;
+ }
+}
diff --git a/src/samples/cube/managers/light_manager.hpp b/src/samples/cube/managers/light_manager.hpp
new file mode 100644
index 0000000..dbc3bf8
--- /dev/null
+++ b/src/samples/cube/managers/light_manager.hpp
@@ -0,0 +1,38 @@
+/*
+# ______ ____ ___
+# | \/ ____| |___|
+# | | | \ | |
+#-----------------------------------------------------------------------
+# Copyright 2020, tyra - https://github.com/h4570/tyra
+# Licenced under Apache License 2.0
+# Sandro Sobczyński
+*/
+
+#ifndef _LIGHT_MANAGER_
+#define _LIGHT_MANAGER_
+
+#include
+#include
+
+/** Class which is maintaining floors objects */
+class LightManager
+{
+
+public:
+ LightManager();
+ ~LightManager();
+
+ LightBulb *bulbs;
+ u8 bulbsCount;
+ void update();
+ void onAudioTick();
+
+private:
+ u8 bulb1Dir, bulb2Dir;
+ void updateBulb1();
+ void updateBulb2();
+ u8 audioOffset, areLightsInverted;
+ u32 audioTick;
+};
+
+#endif
From e43fae88e8c6fcfd77eb0fdda3dda2063b2c39f1 Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Wed, 7 Apr 2021 08:17:10 -0300
Subject: [PATCH 04/16] Setup initial cube sample
---
src/samples/cube/Makefile | 5 +-
src/samples/cube/bin/AUDSRV.IRX | Bin 0 -> 22089 bytes
src/samples/cube/bin/meshes/cube/Material.png | Bin 0 -> 266 bytes
src/samples/cube/bin/meshes/cube/cube.mtl | 13 ++++
src/samples/cube/bin/meshes/cube/cube.obj | 46 ++++++++++++++
src/samples/cube/cube.cpp | 32 ----------
src/samples/cube/cube.hpp | 28 ---------
src/samples/cube/cubes.cpp | 37 +++++++++++
src/samples/cube/cubes.hpp | 32 ++++++++++
src/samples/cube/main.cpp | 5 +-
src/samples/cube/objects/cube.cpp | 58 ++++++++++++++++++
src/samples/cube/objects/cube.hpp | 26 ++++++++
12 files changed, 218 insertions(+), 64 deletions(-)
create mode 100644 src/samples/cube/bin/AUDSRV.IRX
create mode 100644 src/samples/cube/bin/meshes/cube/Material.png
create mode 100644 src/samples/cube/bin/meshes/cube/cube.mtl
create mode 100644 src/samples/cube/bin/meshes/cube/cube.obj
delete mode 100644 src/samples/cube/cube.cpp
delete mode 100644 src/samples/cube/cube.hpp
create mode 100644 src/samples/cube/cubes.cpp
create mode 100644 src/samples/cube/cubes.hpp
create mode 100644 src/samples/cube/objects/cube.cpp
create mode 100644 src/samples/cube/objects/cube.hpp
diff --git a/src/samples/cube/Makefile b/src/samples/cube/Makefile
index 7d1b17f..09c7d18 100644
--- a/src/samples/cube/Makefile
+++ b/src/samples/cube/Makefile
@@ -3,9 +3,10 @@ EE_BIN = cube.elf
TYRA_DIR = ./../../engine
EE_OBJS = \
- managers/light_manager.o \
+ managers/light_manager.o \
+ objects/cube.o \
camera.o \
- cube.o \
+ cubes.o \
main.o
EE_LIBS = -ltyra
diff --git a/src/samples/cube/bin/AUDSRV.IRX b/src/samples/cube/bin/AUDSRV.IRX
new file mode 100644
index 0000000000000000000000000000000000000000..8699022a069ae2e0c95039b69342dc202a4fff9e
GIT binary patch
literal 22089
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
-{
- return;
-}
-
-Cube::~Cube()
-{
- return;
-}
-
-void Cube::onInit(){
- setBgColorAndAmbientColor();
- engine->renderer->setCameraDefinitions(&camera.view, &camera.unitCirclePosition, camera.planes);
-}
-
-void Cube::onUpdate(){
- lightManager.update();
-}
-
-void Cube::setBgColorAndAmbientColor()
-{
- color_t bgColor;
- bgColor.r = 0x20;
- bgColor.g = 0x20;
- bgColor.b = 0x20;
- engine->renderer->setWorldColor(bgColor);
- Vector3 ambient = Vector3(0.003F, 0.003F, 0.003F);
- engine->renderer->setAmbientLight(ambient);
-}
\ No newline at end of file
diff --git a/src/samples/cube/cube.hpp b/src/samples/cube/cube.hpp
deleted file mode 100644
index b46c0bc..0000000
--- a/src/samples/cube/cube.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _CUBE_
-#define _CUBE_
-
-#include
-#include
-#include
-#include "managers/light_manager.hpp"
-#include "./camera.hpp"
-
-class Cube : public Game
-{
-
-public:
- Cube(Engine *t_engine);
- ~Cube();
-
- void onInit();
- void onUpdate();
-
- Engine *engine;
-
-private:
- void setBgColorAndAmbientColor();
- LightManager lightManager;
- Camera camera;
-};
-
-#endif
\ No newline at end of file
diff --git a/src/samples/cube/cubes.cpp b/src/samples/cube/cubes.cpp
new file mode 100644
index 0000000..3e61895
--- /dev/null
+++ b/src/samples/cube/cubes.cpp
@@ -0,0 +1,37 @@
+#include "cubes.hpp"
+
+Cubes::Cubes(Engine *t_engine)
+ : engine(t_engine), camera(&t_engine->screen)
+{
+ PRINT_LOG("Initing cubes sample");
+}
+
+Cubes::~Cubes()
+{
+ return;
+}
+
+void Cubes::onInit(){
+ texRepo = engine->renderer->getTextureRepository();
+ cube = new Cube(texRepo);
+ setBgColorAndAmbientColor();
+ engine->renderer->setCameraDefinitions(&camera.view, &camera.unitCirclePosition, camera.planes);
+}
+
+void Cubes::onUpdate(){
+ lightManager.update();
+ camera.update(engine->pad, cube->mesh);
+ cube->update(engine->pad, camera);
+ engine->renderer->draw(cube->mesh);
+}
+
+void Cubes::setBgColorAndAmbientColor()
+{
+ color_t bgColor;
+ bgColor.r = 0x50;
+ bgColor.g = 0x50;
+ bgColor.b = 0x50;
+ engine->renderer->setWorldColor(bgColor);
+ Vector3 ambient = Vector3(0.2F, 0.2F, 0.2F);
+ engine->renderer->setAmbientLight(ambient);
+}
\ No newline at end of file
diff --git a/src/samples/cube/cubes.hpp b/src/samples/cube/cubes.hpp
new file mode 100644
index 0000000..0a14eb6
--- /dev/null
+++ b/src/samples/cube/cubes.hpp
@@ -0,0 +1,32 @@
+#ifndef _CUBES_
+#define _CUBES_
+
+#include
+#include
+#include
+#include "managers/light_manager.hpp"
+#include "modules/texture_repository.hpp"
+#include "camera.hpp"
+#include "objects/cube.hpp"
+
+class Cubes : public Game
+{
+
+ public:
+ Cubes(Engine *t_engine);
+ ~Cubes();
+
+ void onInit();
+ void onUpdate();
+
+ Engine *engine;
+
+ private:
+ void setBgColorAndAmbientColor();
+ TextureRepository *texRepo;
+ Cube *cube;
+ LightManager lightManager;
+ Camera camera;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/samples/cube/main.cpp b/src/samples/cube/main.cpp
index 1b62314..dc03ec4 100644
--- a/src/samples/cube/main.cpp
+++ b/src/samples/cube/main.cpp
@@ -1,9 +1,10 @@
-#include "cube.hpp"
+#include "cubes.hpp"
int main()
{
+ PRINT_LOG("INIT");
Engine engine = Engine();
- Cube game = Cube(&engine);
+ Cubes game = Cubes(&engine);
game.engine->init(&game, 128);
SleepThread();
return 0;
diff --git a/src/samples/cube/objects/cube.cpp b/src/samples/cube/objects/cube.cpp
new file mode 100644
index 0000000..60a660b
--- /dev/null
+++ b/src/samples/cube/objects/cube.cpp
@@ -0,0 +1,58 @@
+#include "cube.hpp"
+#include
+#include
+#include
+
+// ----
+// Constructors/Destructors
+// ----
+
+Cube::Cube( TextureRepository *t_texRepo )
+{
+ PRINT_LOG("Creating cube");
+ texRepo = t_texRepo;
+ speed = 1.5F;
+
+ mesh.loadObj("meshes/cube/", "cube", 6.0F, true);
+ mesh.position.set(20.00F, 40.00F, 10.00F);
+ mesh.rotation.x = -1.566F;
+ mesh.rotation.z = 1.566F;
+
+ texRepo->addByMesh("meshes/cube/", mesh, PNG);
+
+ PRINT_LOG("Cube object created!");
+}
+
+void Cube::update(const Pad &t_pad, const Camera &t_camera)
+{
+ Vector3 *nextPos = getNextPosition(t_pad, t_camera);
+}
+
+Vector3 *Cube::getNextPosition(const Pad &t_pad, const Camera &t_camera)
+{
+ Vector3 *result = new Vector3(mesh.position);
+ Vector3 normalizedCamera = Vector3(t_camera.unitCirclePosition);
+ normalizedCamera.normalize();
+ normalizedCamera *= speed;
+ if (t_pad.lJoyV <= 100)
+ {
+ result->x += -normalizedCamera.x;
+ result->z += -normalizedCamera.z;
+ }
+ else if (t_pad.lJoyV >= 200)
+ {
+ result->x += normalizedCamera.x;
+ result->z += normalizedCamera.z;
+ }
+ if (t_pad.lJoyH <= 100)
+ {
+ result->x += -normalizedCamera.z;
+ result->z += normalizedCamera.x;
+ }
+ else if (t_pad.lJoyH >= 200)
+ {
+ result->x += normalizedCamera.z;
+ result->z += -normalizedCamera.x;
+ }
+ return result;
+}
\ No newline at end of file
diff --git a/src/samples/cube/objects/cube.hpp b/src/samples/cube/objects/cube.hpp
new file mode 100644
index 0000000..22abe35
--- /dev/null
+++ b/src/samples/cube/objects/cube.hpp
@@ -0,0 +1,26 @@
+#ifndef _CUBE_
+#define _CUBE_
+
+#include "../camera.hpp"
+#include
+#include
+#include
+#include "modules/texture_repository.hpp"
+
+/** Cube 3D object class */
+class Cube
+{
+ public:
+ Mesh mesh;
+ Cube( TextureRepository *t_texRepo );
+ ~Cube();
+
+ void update(const Pad &t_pad, const Camera &t_camera);
+
+ private:
+ TextureRepository *texRepo;
+ Vector3 *getNextPosition(const Pad &t_pad, const Camera &t_camera);
+ float speed;
+};
+
+#endif
From b749a80a25ed295e37c7ebef802c9a93af1679a7 Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Thu, 8 Apr 2021 08:33:06 -0300
Subject: [PATCH 05/16] Add rotation function
---
.gitignore | 1 +
src/samples/cube/objects/cube.cpp | 9 +++++++++
src/samples/cube/objects/cube.hpp | 1 +
3 files changed, 11 insertions(+)
diff --git a/.gitignore b/.gitignore
index d1350e8..489b289 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
.vscode/
+.idea/
# ---
diff --git a/src/samples/cube/objects/cube.cpp b/src/samples/cube/objects/cube.cpp
index 60a660b..cb1f8ab 100644
--- a/src/samples/cube/objects/cube.cpp
+++ b/src/samples/cube/objects/cube.cpp
@@ -25,6 +25,7 @@ Cube::Cube( TextureRepository *t_texRepo )
void Cube::update(const Pad &t_pad, const Camera &t_camera)
{
+ rotate(t_pad);
Vector3 *nextPos = getNextPosition(t_pad, t_camera);
}
@@ -55,4 +56,12 @@ Vector3 *Cube::getNextPosition(const Pad &t_pad, const Camera &t_camera)
result->z += -normalizedCamera.x;
}
return result;
+}
+
+void Cube::rotate(const Pad &t_pad){
+ //if (t_pad.rJoyH >= 200)
+ //else if (t_pad.rJoyH <= 100)
+ mesh.rotation.x += 0.01;
+ mesh.rotation.y += 0.01;
+ mesh.rotation.z += 0.01;
}
\ No newline at end of file
diff --git a/src/samples/cube/objects/cube.hpp b/src/samples/cube/objects/cube.hpp
index 22abe35..e8350bf 100644
--- a/src/samples/cube/objects/cube.hpp
+++ b/src/samples/cube/objects/cube.hpp
@@ -20,6 +20,7 @@ class Cube
private:
TextureRepository *texRepo;
Vector3 *getNextPosition(const Pad &t_pad, const Camera &t_camera);
+ void rotate(const Pad &t_pad);
float speed;
};
From 444990a26286a3753a414942b3219a3549339015 Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Fri, 9 Apr 2021 13:16:50 -0300
Subject: [PATCH 06/16] Change background color
---
src/samples/cube/cubes.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/samples/cube/cubes.cpp b/src/samples/cube/cubes.cpp
index 3e61895..808e942 100644
--- a/src/samples/cube/cubes.cpp
+++ b/src/samples/cube/cubes.cpp
@@ -28,9 +28,9 @@ void Cubes::onUpdate(){
void Cubes::setBgColorAndAmbientColor()
{
color_t bgColor;
- bgColor.r = 0x50;
- bgColor.g = 0x50;
- bgColor.b = 0x50;
+ bgColor.r = 0x20;
+ bgColor.g = 0x20;
+ bgColor.b = 0x20;
engine->renderer->setWorldColor(bgColor);
Vector3 ambient = Vector3(0.2F, 0.2F, 0.2F);
engine->renderer->setAmbientLight(ambient);
From e022fcdafee8d4b397d00330d8f716148f25b826 Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Fri, 9 Apr 2021 13:18:34 -0300
Subject: [PATCH 07/16] Update cube mesh object
---
src/samples/cube/bin/meshes/cube/Material.png | Bin 266 -> 0 bytes
src/samples/cube/bin/meshes/cube/cube.mtl | 4 ++--
src/samples/cube/bin/meshes/cube/cube.obj | 2 +-
src/samples/cube/bin/meshes/cube/cube.png | Bin 0 -> 11599 bytes
4 files changed, 3 insertions(+), 3 deletions(-)
delete mode 100644 src/samples/cube/bin/meshes/cube/Material.png
create mode 100644 src/samples/cube/bin/meshes/cube/cube.png
diff --git a/src/samples/cube/bin/meshes/cube/Material.png b/src/samples/cube/bin/meshes/cube/Material.png
deleted file mode 100644
index 617d353e0d67a14a2952b2a98375eb8a50b97d79..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 266
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
literal 0
HcmV?d00001
From 4160bddc4b8752ccb0e7363bc7f2dc3de917ac32 Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Fri, 9 Apr 2021 13:19:12 -0300
Subject: [PATCH 08/16] Update scale and speed rotation
---
src/samples/cube/objects/cube.cpp | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/samples/cube/objects/cube.cpp b/src/samples/cube/objects/cube.cpp
index cb1f8ab..b6b4123 100644
--- a/src/samples/cube/objects/cube.cpp
+++ b/src/samples/cube/objects/cube.cpp
@@ -11,9 +11,9 @@ Cube::Cube( TextureRepository *t_texRepo )
{
PRINT_LOG("Creating cube");
texRepo = t_texRepo;
- speed = 1.5F;
+ speed = 1.2F;
- mesh.loadObj("meshes/cube/", "cube", 6.0F, true);
+ mesh.loadObj("meshes/cube/", "cube", 10.0F, true);
mesh.position.set(20.00F, 40.00F, 10.00F);
mesh.rotation.x = -1.566F;
mesh.rotation.z = 1.566F;
@@ -61,7 +61,7 @@ Vector3 *Cube::getNextPosition(const Pad &t_pad, const Camera &t_camera)
void Cube::rotate(const Pad &t_pad){
//if (t_pad.rJoyH >= 200)
//else if (t_pad.rJoyH <= 100)
- mesh.rotation.x += 0.01;
- mesh.rotation.y += 0.01;
- mesh.rotation.z += 0.01;
+ mesh.rotation.x += (0.01 * speed);
+ mesh.rotation.y += (0.01 * speed);
+ mesh.rotation.z += (0.01 * speed);
}
\ No newline at end of file
From 9268628ccd89b9fdfae7b14a87f13b04f148751b Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Fri, 9 Apr 2021 13:23:25 -0300
Subject: [PATCH 09/16] update .gitignore
---
src/samples/cube/.gitignore | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 src/samples/cube/.gitignore
diff --git a/src/samples/cube/.gitignore b/src/samples/cube/.gitignore
new file mode 100644
index 0000000..23c6dd9
--- /dev/null
+++ b/src/samples/cube/.gitignore
@@ -0,0 +1,3 @@
+.vscode/
+bin/**
+fonts/**
\ No newline at end of file
From 24509f7f201e317163cf69278b46cb7f5d764fb7 Mon Sep 17 00:00:00 2001
From: Wellinator
Date: Fri, 9 Apr 2021 13:26:06 -0300
Subject: [PATCH 10/16] remove bin dir
---
src/samples/cube/bin/AUDSRV.IRX | Bin 22089 -> 0 bytes
src/samples/cube/bin/meshes/cube/cube.mtl | 13 ------
src/samples/cube/bin/meshes/cube/cube.obj | 46 ----------------------
src/samples/cube/bin/meshes/cube/cube.png | Bin 11599 -> 0 bytes
4 files changed, 59 deletions(-)
delete mode 100644 src/samples/cube/bin/AUDSRV.IRX
delete mode 100644 src/samples/cube/bin/meshes/cube/cube.mtl
delete mode 100644 src/samples/cube/bin/meshes/cube/cube.obj
delete mode 100644 src/samples/cube/bin/meshes/cube/cube.png
diff --git a/src/samples/cube/bin/AUDSRV.IRX b/src/samples/cube/bin/AUDSRV.IRX
deleted file mode 100644
index 8699022a069ae2e0c95039b69342dc202a4fff9e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 22089
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