diff --git a/ROADMAP.txt b/ROADMAP.txt index 843a2a6..e7e68d2 100644 --- a/ROADMAP.txt +++ b/ROADMAP.txt @@ -1,5 +1,6 @@ ------------ Tyra's v2.0 roadmap to publish on GitHub ------------ - [General] Allow to edit all data from mesh/texture +- [General] USB test - [General] Tyra version, render it on start - [Renderer] Fog - [Demo] Create cool demo which will show all features of Tyra diff --git a/demo/inc/states/game/game_state.hpp b/demo/inc/states/game/game_state.hpp index 5e8e224..bfc8542 100644 --- a/demo/inc/states/game/game_state.hpp +++ b/demo/inc/states/game/game_state.hpp @@ -15,6 +15,7 @@ #include "./player/player.hpp" #include "./renderer/game_renderer.hpp" #include "./terrain/terrain.hpp" +#include "./skybox/skybox.hpp" #include "./debug_object.hpp" namespace Demo { @@ -44,6 +45,7 @@ class GameState : public State { GameRenderer renderer; Player* player; Terrain* terrain; + Skybox* skybox; DebugObject* dbgObj; }; diff --git a/demo/inc/states/game/skybox/skybox.hpp b/demo/inc/states/game/skybox/skybox.hpp new file mode 100644 index 0000000..c76b08e --- /dev/null +++ b/demo/inc/states/game/skybox/skybox.hpp @@ -0,0 +1,41 @@ +/* +# ______ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022, tyra - https://github.com/h4570/tyra +# Licenced under Apache License 2.0 +# Sandro Sobczyński +*/ + +#pragma once + +#include +#include +#include "states/game/renderer/renderer_static_pair.hpp" +#include + +using Tyra::Renderer; +using Tyra::StaPipOptions; +using Tyra::StaticMesh; +using Tyra::TextureRepository; +using Tyra::Vec4; + +namespace Demo { + +class Skybox { + public: + Skybox(TextureRepository* repo); + ~Skybox(); + + StaticMesh* mesh; + StaPipOptions* options; + RendererStaticPair* pair; + + void update(const Vec4& playerPosition); + + private: + void allocateOptions(); +}; + +} // namespace Demo diff --git a/demo/src/states/game/game_state.cpp b/demo/src/states/game/game_state.cpp index 89a3a2c..7512ad9 100644 --- a/demo/src/states/game/game_state.cpp +++ b/demo/src/states/game/game_state.cpp @@ -30,6 +30,7 @@ void GameState::onStart() { player = new Player(engine); terrain = new Terrain(&engine->renderer.core.texture.repository); + skybox = new Skybox(&engine->renderer.core.texture.repository); dbgObj = new DebugObject(&engine->renderer.core.texture.repository); initialized = true; @@ -40,6 +41,7 @@ GlobalStateType GameState::onFinish() { delete player; delete terrain; + delete skybox; delete dbgObj; initialized = false; @@ -54,10 +56,8 @@ void GameState::update() { // TODO: Get next player position and calculate all stuf for NEXT position // (not current!) - // TODO: Fix camera for heightmap - // TODO: Change map // TODO: Implement collision - + skybox->update(player->getPosition()); auto cameraInfo = player->getCameraInfo(); engine->renderer.beginFrame(cameraInfo); @@ -68,6 +68,7 @@ void GameState::update() { renderer.clear(); { + renderer.add(skybox->pair); renderer.add(player->staticPairs); renderer.add(player->dynamicPairs); renderer.add(terrain->pair); diff --git a/demo/src/states/game/player/camera.cpp b/demo/src/states/game/player/camera.cpp index 1974220..55ca761 100644 --- a/demo/src/states/game/player/camera.cpp +++ b/demo/src/states/game/player/camera.cpp @@ -40,9 +40,10 @@ void Camera::update(const Vec4& playerPosition, const float& terrainHeight) { } unitCircle.x = (sin(circleRotation) * lengthFromOrigin); - unitCircle.y = height + playerPosition.y + terrainHeight; + unitCircle.y = height; unitCircle.z = (cos(circleRotation) * lengthFromOrigin); + position = playerPosition; lookAt = unitCircle + playerPosition; } diff --git a/demo/src/states/game/player/weapon.cpp b/demo/src/states/game/player/weapon.cpp index f56d550..c97b53a 100644 --- a/demo/src/states/game/player/weapon.cpp +++ b/demo/src/states/game/player/weapon.cpp @@ -101,7 +101,8 @@ Weapon::~Weapon() { void Weapon::allocateOptions() { options = new StaPipOptions(); - options->shadingType = Tyra::TyraShadingGouraud; + options->textureMappingType = Tyra::TyraNearest; + options->shadingType = Tyra::TyraShadingFlat; options->blendingEnabled = false; options->fullClipChecks = false; options->frustumCulling = Tyra::PipelineFrustumCulling_None; diff --git a/demo/src/states/game/skybox/skybox.cpp b/demo/src/states/game/skybox/skybox.cpp new file mode 100644 index 0000000..b5c971a --- /dev/null +++ b/demo/src/states/game/skybox/skybox.cpp @@ -0,0 +1,66 @@ +/* +# ______ ____ ___ +# | \/ ____| |___| +# | | | \ | | +#----------------------------------------------------------------------- +# Copyright 2022, tyra - https://github.com/h4570/tyra +# Licenced under Apache License 2.0 +# Sandro Sobczyński +*/ + +#include "states/game/skybox/skybox.hpp" +#include +#include + +using Tyra::FileUtils; +using Tyra::TyrobjLoader; + +namespace Demo { + +Skybox::Skybox(TextureRepository* repo) { + TyrobjLoader loader; + auto* data = loader.load(FileUtils::fromCwd("game/models/skybox/skybox.obj"), + 1, 400.0F, true); + data->normalsEnabled = false; + mesh = new StaticMesh(*data); + delete data; + + mesh->scale.scaleX(2.0F); + mesh->scale.scaleZ(2.0F); + + for (u32 i = 0; i < mesh->getMaterialsCount(); i++) { + auto* material = mesh->getMaterial(i); + material->print(); + material->color.r = 16.0F; + material->color.g = 16.0F; + material->color.b = 16.0F; + } + + repo->addByMesh(mesh, FileUtils::fromCwd("game/models/skybox/"), "png"); + + allocateOptions(); + + pair = new RendererStaticPair{mesh, options}; +} + +Skybox::~Skybox() { + delete mesh; + delete options; + delete pair; +} + +void Skybox::update(const Vec4& playerPosition) { + mesh->translation.identity(); + mesh->translation.translate(playerPosition); +} + +void Skybox::allocateOptions() { + options = new StaPipOptions(); + options->frustumCulling = Tyra::PipelineFrustumCulling_None; + options->shadingType = Tyra::TyraShadingGouraud; + options->textureMappingType = Tyra::TyraNearest; + options->blendingEnabled = true; + options->antiAliasingEnabled = false; +} + +} // namespace Demo diff --git a/demo/src/states/game/terrain/terrain.cpp b/demo/src/states/game/terrain/terrain.cpp index 233a879..8f3fa06 100644 --- a/demo/src/states/game/terrain/terrain.cpp +++ b/demo/src/states/game/terrain/terrain.cpp @@ -18,7 +18,7 @@ using Tyra::TyrobjLoader; namespace Demo { Terrain::Terrain(TextureRepository* repo) : heightmap(-5.0F, // Min height - 70.0F, // Max height + 100.0F, // Max height Vec4(-196.6F, 0.0F, -412.0F, 1.0F), // Left up Vec4(286.0F, 0.0F, 443.3F, 1.0F) // Right down ) { diff --git a/docs/install/pcsx2.md b/docs/install/pcsx2.md index 1c1a1d2..f2d5d7b 100644 --- a/docs/install/pcsx2.md +++ b/docs/install/pcsx2.md @@ -16,4 +16,6 @@ WASD = Left joy Arrows = Right joy Space = X Circle = C -``` \ No newline at end of file +``` + +- Enable **"EE timing hack"** in PCSX2 hacks! \ No newline at end of file diff --git a/engine/inc/renderer/core/gs/renderer_core_gs_vram.hpp b/engine/inc/renderer/core/gs/renderer_core_gs_vram.hpp index 84a51b2..38dac80 100644 --- a/engine/inc/renderer/core/gs/renderer_core_gs_vram.hpp +++ b/engine/inc/renderer/core/gs/renderer_core_gs_vram.hpp @@ -29,14 +29,13 @@ class RendererCoreGSVRam { int allocate(const TextureData& texData); int allocateBuffer(const int& width, const int& height, const int& psm); + int allocate(const int& width, const int& height, const int& psm, + const int& alignment); /** Free texture, FIFO order */ void free(const int& address); private: - int allocate(const int& width, const int& height, const int& psm, - const int& alignment); - int getSize(int width, const int& height, const int& psm, const int& alignment); diff --git a/engine/src/renderer/core/paths/path3/path3.cpp b/engine/src/renderer/core/paths/path3/path3.cpp index 5352ce1..6b57144 100644 --- a/engine/src/renderer/core/paths/path3/path3.cpp +++ b/engine/src/renderer/core/paths/path3/path3.cpp @@ -65,19 +65,21 @@ void Path3::sendTexture(Texture* texture, const RendererCoreTextureBuffers& texBuffers) { packet2_reset(texturePacket, false); + int coreWidth = texBuffers.core->width <= 64 ? 64 : texBuffers.core->width; packet2_update( texturePacket, draw_texture_transfer(texturePacket->base, texture->getCoreData().data, texture->getWidth(), texture->getHeight(), texture->getCoreData().psm, - texBuffers.core->address, texBuffers.core->width)); + texBuffers.core->address, coreWidth)); if (texBuffers.clut != nullptr) { auto* clut = texture->getClutData(); - packet2_update(texturePacket, draw_texture_transfer( - texturePacket->next, clut->data, - clut->width, clut->height, clut->psm, - texBuffers.clut->address, clut->width)); + int clutWidth = texBuffers.clut->width <= 64 ? 64 : texBuffers.clut->width; + packet2_update(texturePacket, + draw_texture_transfer(texturePacket->next, clut->data, + clut->width, clut->height, clut->psm, + texBuffers.clut->address, clutWidth)); } packet2_chain_open_cnt(texturePacket, 0, 0, 0);