overloads, tutorial 04 init

This commit is contained in:
h4570
2022-08-21 19:44:47 +02:00
parent 409ee294eb
commit 4fa65fc535
25 changed files with 232 additions and 77 deletions
+1 -1
View File
@@ -22,10 +22,10 @@ because Mesh rendering uses only core.render()
------------ Github issues for Tyra v2 ------------ ------------ Github issues for Tyra v2 ------------
- [Demo] porzadek z konstruktorami bbox - [Demo] porzadek z konstruktorami bbox
- [General] smart pointers and std::array instead of raw pointers
- [renderer] fog - [renderer] fog
- [General] CI in Github via docker image - [General] CI in Github via docker image
- [renderer] bbox parts optimization - [renderer] bbox parts optimization
- [General] smart pointers and std::array instead of raw pointers
- [md2] refactor - [md2] refactor
- [2D] Add zbuffer support (z-index) - [2D] Add zbuffer support (z-index)
- [3DUtility] Add zbuffer support (z-index) - [3DUtility] Add zbuffer support (z-index)
@@ -15,6 +15,7 @@
#include <string> #include <string>
#include "renderer/models/color.hpp" #include "renderer/models/color.hpp"
#include "loaders/3d/obj_loader/tiny_obj_loader.hpp" #include "loaders/3d/obj_loader/tiny_obj_loader.hpp"
#include <memory.h>
namespace Tyra { namespace Tyra {
@@ -40,11 +41,12 @@ class ObjLoader : public Loader {
ObjLoader(); ObjLoader();
~ObjLoader(); ~ObjLoader();
MeshBuilderData* load(const char* fullpath); std::unique_ptr<MeshBuilderData> load(const char* fullpath);
MeshBuilderData* load(const char* fullpath, const ObjLoaderOptions& options); std::unique_ptr<MeshBuilderData> load(const char* fullpath,
MeshBuilderData* load(const std::string& fullpath); const ObjLoaderOptions& options);
MeshBuilderData* load(const std::string& fullpath, std::unique_ptr<MeshBuilderData> load(const std::string& fullpath);
const ObjLoaderOptions& options); std::unique_ptr<MeshBuilderData> load(const std::string& fullpath,
const ObjLoaderOptions& options);
private: private:
void addOutputMaterialsAndFrames( void addOutputMaterialsAndFrames(
@@ -18,8 +18,8 @@ namespace Tyra {
class DynamicMesh : public Mesh { class DynamicMesh : public Mesh {
public: public:
explicit DynamicMesh(const MeshBuilderData& data); explicit DynamicMesh(const MeshBuilderData* data);
explicit DynamicMesh(const DynamicMesh& mesh); DynamicMesh(const DynamicMesh& mesh);
~DynamicMesh(); ~DynamicMesh();
std::vector<MeshFrame*> frames; std::vector<MeshFrame*> frames;
+2 -2
View File
@@ -19,8 +19,8 @@ namespace Tyra {
class Mesh { class Mesh {
public: public:
explicit Mesh(const MeshBuilderData& data); explicit Mesh(const MeshBuilderData* data);
explicit Mesh(const Mesh& mesh); Mesh(const Mesh& mesh);
~Mesh(); ~Mesh();
u8 isMother; u8 isMother;
@@ -18,7 +18,7 @@ namespace Tyra {
class StaticMesh : public Mesh { class StaticMesh : public Mesh {
public: public:
StaticMesh(const MeshBuilderData& data); explicit StaticMesh(const MeshBuilderData* data);
StaticMesh(const StaticMesh& mesh); StaticMesh(const StaticMesh& mesh);
~StaticMesh(); ~StaticMesh();
@@ -15,6 +15,7 @@
#include <vector> #include <vector>
#include "./models/texture.hpp" #include "./models/texture.hpp"
#include "renderer/3d/mesh/mesh.hpp" #include "renderer/3d/mesh/mesh.hpp"
#include "renderer/core/2d/sprite/sprite.hpp"
#include "loaders/texture/base/texture_loader_selector.hpp" #include "loaders/texture/base/texture_loader_selector.hpp"
#include <string> #include <string>
@@ -32,11 +33,14 @@ class TextureRepository {
/** /**
* Returns single texture. * Returns single texture.
* nullptr if not found. * nullptr if not found.
* @param t_id
* For 3D: MeshMaterial id.
* For 2D: Sprite id.
*/ */
Texture* getBySpriteOrMesh(const u32& t_id) const; Texture* getBySpriteId(const u32& t_id) const;
/**
* Returns single texture.
* nullptr if not found.
*/
Texture* getByMeshMaterialId(const u32& t_id) const;
/** /**
* Returns single texture. * Returns single texture.
@@ -50,14 +54,6 @@ class TextureRepository {
*/ */
const s32 getIndexOf(const u32& t_texId) const; const s32 getIndexOf(const u32& t_texId) const;
// ----
// Setters
// ----
// ----
// Other
// ----
/** /**
* Add unlinked texture. * Add unlinked texture.
* @param fullpath Full path to texture file. Example: "host:texture.png" * @param fullpath Full path to texture file. Example: "host:texture.png"
@@ -81,37 +77,38 @@ class TextureRepository {
/** /**
* Add linked textures in given path for mesh material names. * Add linked textures in given path for mesh material names.
*/ */
void addByMesh(Mesh* mesh, const char* directory, const char* extension); void addByMesh(const Mesh* mesh, const char* directory,
const char* extension);
/** /**
* Add linked textures in given path for mesh material names. * Add linked textures in given path for mesh material names.
*/ */
inline void addByMesh(Mesh* mesh, const std::string& directory, inline void addByMesh(const Mesh* mesh, const std::string& directory,
const char* extension) { const char* extension) {
addByMesh(mesh, directory.c_str(), extension); addByMesh(mesh, directory.c_str(), extension);
} }
/** /**
* Remove texture from repository. * Remove texture from repository.
* Texture is NOT destructed. * Texture IS destructed.
*/ */
void removeByIndex(const u32& t_index); void free(const u32& texId);
void free(const Texture* tex);
void free(const Texture& tex);
void freeBySprite(const Sprite& sprite);
void freeByMesh(const Mesh& mesh);
void freeByMesh(const Mesh* mesh);
/** /**
* Remove texture from repository. * Remove texture from repository.
* Texture is NOT destructed. * Texture is NOT destructed.
* Not recommended.
*/ */
void removeById(const u32& t_texId); void removeById(const u32& t_texId);
/**
* Remove texture from repository.
* Texture IS destructed.
*/
void free(const u32& t_texId);
void free(const Texture* t_tex);
void free(const Texture& t_tex);
private: private:
void removeByIndex(const u32& t_index);
std::vector<Texture*> textures; std::vector<Texture*> textures;
TextureLoaderSelector texLoaderSelector; TextureLoaderSelector texLoaderSelector;
}; };
@@ -28,21 +28,21 @@ ObjLoader::ObjLoader() {}
ObjLoader::~ObjLoader() {} ObjLoader::~ObjLoader() {}
MeshBuilderData* ObjLoader::load(const char* fullpath) { std::unique_ptr<MeshBuilderData> ObjLoader::load(const char* fullpath) {
return load(fullpath, ObjLoaderOptions()); return load(fullpath, ObjLoaderOptions());
} }
MeshBuilderData* ObjLoader::load(const std::string& fullpath) { std::unique_ptr<MeshBuilderData> ObjLoader::load(const std::string& fullpath) {
return load(fullpath.c_str(), ObjLoaderOptions()); return load(fullpath.c_str(), ObjLoaderOptions());
} }
MeshBuilderData* ObjLoader::load(const std::string& fullpath, std::unique_ptr<MeshBuilderData> ObjLoader::load(
const ObjLoaderOptions& options) { const std::string& fullpath, const ObjLoaderOptions& options) {
return load(fullpath.c_str(), options); return load(fullpath.c_str(), options);
} }
MeshBuilderData* ObjLoader::load(const char* fullpath, std::unique_ptr<MeshBuilderData> ObjLoader::load(
const ObjLoaderOptions& options) { const char* fullpath, const ObjLoaderOptions& options) {
std::string path = fullpath; std::string path = fullpath;
std::string basePath = getPathFromFilename(path); std::string basePath = getPathFromFilename(path);
@@ -50,8 +50,7 @@ MeshBuilderData* ObjLoader::load(const char* fullpath,
auto rawFilename = getFilenameWithoutExtension(path); auto rawFilename = getFilenameWithoutExtension(path);
auto extension = getExtensionOfFilename(path); auto extension = getExtensionOfFilename(path);
auto result = std::make_unique<MeshBuilderData>();
auto* result = new MeshBuilderData();
tinyobj::ObjReaderConfig readerConfig; tinyobj::ObjReaderConfig readerConfig;
readerConfig.triangulate = options.animation.count == 1; readerConfig.triangulate = options.animation.count == 1;
@@ -93,11 +92,11 @@ MeshBuilderData* ObjLoader::load(const char* fullpath,
if (i == 1) { if (i == 1) {
auto scanResult = scan(shapes, materials); auto scanResult = scan(shapes, materials);
addOutputMaterialsAndFrames(result, attrib, shapes, materials, addOutputMaterialsAndFrames(result.get(), attrib, shapes, materials,
options.animation.count, scanResult); options.animation.count, scanResult);
} }
importFrame(result, attrib, shapes, materials, i - 1, options.scale, importFrame(result.get(), attrib, shapes, materials, i - 1, options.scale,
options.flipUVs, options.animation.count); options.flipUVs, options.animation.count);
} }
+1 -1
View File
@@ -20,7 +20,7 @@ void Renderer2D::init(RendererCore* t_rendererCore) { core = t_rendererCore; }
void Renderer2D::render(const Sprite* sprite) { render(*sprite); } void Renderer2D::render(const Sprite* sprite) { render(*sprite); }
void Renderer2D::render(const Sprite& sprite) { void Renderer2D::render(const Sprite& sprite) {
auto* texture = core->texture.repository.getBySpriteOrMesh(sprite.id); auto* texture = core->texture.repository.getBySpriteId(sprite.id);
TYRA_ASSERT( TYRA_ASSERT(
texture, "Texture for sprite with id: ", sprite.id, texture, "Texture for sprite with id: ", sprite.id,
@@ -15,15 +15,15 @@
namespace Tyra { namespace Tyra {
DynamicMesh::DynamicMesh(const MeshBuilderData& data) : Mesh(data) { DynamicMesh::DynamicMesh(const MeshBuilderData* data) : Mesh(data) {
if (data.materials[0]->frames.size() == 1) { if (data->materials[0]->frames.size() == 1) {
TYRA_WARN( TYRA_WARN(
"Frames count should be greater than 1 for DynamicMesh! Maybe you " "Frames count should be greater than 1 for DynamicMesh! Maybe you "
"should use StaticMesh?"); "should use StaticMesh?");
} }
for (u32 i = 0; i < data.materials[0]->frames.size(); i++) { for (u32 i = 0; i < data->materials[0]->frames.size(); i++) {
frames.push_back(new MeshFrame(data, i)); frames.push_back(new MeshFrame(*data, i));
} }
animation.resetAll(frames); animation.resetAll(frames);
+4 -4
View File
@@ -13,14 +13,14 @@
namespace Tyra { namespace Tyra {
Mesh::Mesh(const MeshBuilderData& data) { Mesh::Mesh(const MeshBuilderData* data) {
init(); init();
TYRA_ASSERT(data.materials.size() > 0, TYRA_ASSERT(data->materials.size() > 0,
"Materials count must be greater than 0"); "Materials count must be greater than 0");
for (u32 i = 0; i < data.materials.size(); i++) { for (u32 i = 0; i < data->materials.size(); i++) {
auto* material = new MeshMaterial(data, i); auto* material = new MeshMaterial(*data, i);
if (material->frames.size() == 0) { if (material->frames.size() == 0) {
TYRA_WARN("Found empty material: ", material->name, ". Skipping..."); TYRA_WARN("Found empty material: ", material->name, ". Skipping...");
@@ -13,12 +13,12 @@
namespace Tyra { namespace Tyra {
StaticMesh::StaticMesh(const MeshBuilderData& data) : Mesh(data) { StaticMesh::StaticMesh(const MeshBuilderData* data) : Mesh(data) {
if (data.materials[0]->frames.size() > 1) if (data->materials[0]->frames.size() > 1)
TYRA_WARN("Static meshes should have only one frame, but ", TYRA_WARN("Static meshes should have only one frame, but ",
data.materials[0]->frames.size(), " frames were found"); data->materials[0]->frames.size(), " frames were found");
frame = new MeshFrame(data, 0); frame = new MeshFrame(*data, 0);
} }
StaticMesh::StaticMesh(const StaticMesh& mesh) : Mesh(mesh) { StaticMesh::StaticMesh(const StaticMesh& mesh) : Mesh(mesh) {
@@ -106,7 +106,7 @@ void DynamicPipeline::render(const DynamicMesh* mesh,
u8 isPartInitialized = false; u8 isPartInitialized = false;
auto* texture = auto* texture =
rendererCore->texture.repository.getBySpriteOrMesh(material->id); rendererCore->texture.repository.getByMeshMaterialId(material->id);
TYRA_ASSERT( TYRA_ASSERT(
texture, "Texture for material: ", material->name, "Id: ", material->id, texture, "Texture for material: ", material->name, "Id: ", material->id,
@@ -143,7 +143,7 @@ StaPipTextureBag* StaticPipeline::getTextureBag(
auto* result = new StaPipTextureBag(); auto* result = new StaPipTextureBag();
result->texture = result->texture =
rendererCore->texture.repository.getBySpriteOrMesh(material->id); rendererCore->texture.repository.getByMeshMaterialId(material->id);
TYRA_ASSERT( TYRA_ASSERT(
result->texture, "Texture for material: ", material->name, result->texture, "Texture for material: ", material->name,
@@ -22,7 +22,14 @@ TextureRepository::~TextureRepository() {
} }
} }
Texture* TextureRepository::getBySpriteOrMesh(const u32& t_id) const { Texture* TextureRepository::getBySpriteId(const u32& t_id) const {
for (u32 i = 0; i < textures.size(); i++) {
if (textures[i]->isLinkedWith(t_id)) return textures[i];
}
return nullptr;
}
Texture* TextureRepository::getByMeshMaterialId(const u32& t_id) const {
for (u32 i = 0; i < textures.size(); i++) { for (u32 i = 0; i < textures.size(); i++) {
if (textures[i]->isLinkedWith(t_id)) return textures[i]; if (textures[i]->isLinkedWith(t_id)) return textures[i];
} }
@@ -56,6 +63,26 @@ void TextureRepository::removeById(const u32& t_texId) {
removeByIndex(index); removeByIndex(index);
} }
void TextureRepository::freeByMesh(const Mesh& mesh) {
for (auto* material : mesh.materials) {
auto* texture = getByMeshMaterialId(material->id);
if (texture != nullptr) {
free(texture);
}
}
}
void TextureRepository::freeByMesh(const Mesh* mesh) { freeByMesh(*mesh); }
void TextureRepository::freeBySprite(const Sprite& sprite) {
auto* texture = getBySpriteId(sprite.id);
if (texture != nullptr) {
free(texture);
}
}
void TextureRepository::free(const Texture* t_tex) { free(t_tex->id); } void TextureRepository::free(const Texture* t_tex) { free(t_tex->id); }
void TextureRepository::free(const Texture& t_tex) { free(t_tex.id); } void TextureRepository::free(const Texture& t_tex) { free(t_tex.id); }
@@ -81,7 +108,7 @@ Texture* TextureRepository::add(const char* fullpath) {
return texture; return texture;
} }
void TextureRepository::addByMesh(Mesh* mesh, const char* directory, void TextureRepository::addByMesh(const Mesh* mesh, const char* directory,
const char* extension) { const char* extension) {
auto& loader = texLoaderSelector.getLoaderByExtension(extension); auto& loader = texLoaderSelector.getLoaderByExtension(extension);
-1
View File
@@ -29,7 +29,6 @@ class Tutorial02 : public Game {
Engine* engine; Engine* engine;
Sprite sprite; Sprite sprite;
Texture* texture;
}; };
} // namespace Tyra } // namespace Tyra
+3 -13
View File
@@ -13,20 +13,10 @@
namespace Tyra { namespace Tyra {
Tutorial02::Tutorial02(Engine* t_engine) : engine(t_engine) { Tutorial02::Tutorial02(Engine* t_engine) : engine(t_engine) {}
/** Lets set default value, to prevent nullptr bugs */
texture = nullptr;
}
Tutorial02::~Tutorial02() { Tutorial02::~Tutorial02() {
if (texture != nullptr) { engine->renderer.getTextureRepository().freeBySprite(sprite);
/**
* free() function in texture repository is
* removing texture from repository and calling
* texture destructor
*/
engine->renderer.core.texture.repository.free(texture);
}
} }
void Tutorial02::init() { void Tutorial02::init() {
@@ -111,7 +101,7 @@ void Tutorial02::loadTexture() {
* 8bpp and 4bpp are the fastest. * 8bpp and 4bpp are the fastest.
* All of these formats can be easily exported via GIMP. * All of these formats can be easily exported via GIMP.
*/ */
texture = textureRepository.add(filepath); auto* texture = textureRepository.add(filepath);
/** Let's assign this texture to sprite. */ /** Let's assign this texture to sprite. */
texture->addLink(sprite.id); texture->addLink(sprite.id);
+2 -1
View File
@@ -14,12 +14,13 @@
namespace Tyra { namespace Tyra {
Tutorial03::Tutorial03(Engine* t_engine) : engine(t_engine) { Tutorial03::Tutorial03(Engine* t_engine) : engine(t_engine) {
/** Lets set default value, to prevent nullptr bugs */
textureAtlas = nullptr; textureAtlas = nullptr;
} }
Tutorial03::~Tutorial03() { Tutorial03::~Tutorial03() {
if (textureAtlas != nullptr) { if (textureAtlas != nullptr) {
engine->renderer.core.texture.repository.free(textureAtlas); engine->renderer.getTextureRepository().free(textureAtlas);
} }
} }
+24
View File
@@ -0,0 +1,24 @@
TARGET := tutorial_04.elf
ENGINEDIR := ../../engine
#The Directories, Source, Includes, Objects, Binary and Resources
SRCDIR := src
INCDIR := inc
BUILDDIR := obj
TARGETDIR := bin
RESDIR := res
SRCEXT := cpp
VSMEXT := vsm
VCLEXT := vcl
VCLPPEXT := vclpp
DEPEXT := d
OBJEXT := o
#Flags, Libraries and Includes
CFLAGS :=
LIB :=
LIBDIRS :=
INC := -I$(INCDIR)
INCDEP := -I$(INCDIR)
include ../Makefile.tutorials-base
+4
View File
@@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore
+35
View File
@@ -0,0 +1,35 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include <memory.h>
namespace Tyra {
class Tutorial04 : public Game {
public:
Tutorial04(Engine* engine);
~Tutorial04();
void init();
void loop();
private:
void loadMesh();
Engine* engine;
std::unique_ptr<StaticMesh> mesh;
StaPipOptions renderOptions;
};
} // namespace Tyra
+4
View File
@@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore
+4
View File
@@ -0,0 +1,4 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore
+4
View File
@@ -0,0 +1,4 @@
$ConfigFile = Join-Path $PSScriptRoot '../../windows-pcsx2.ps1'
. $ConfigFile
RunPCSX2
+26
View File
@@ -0,0 +1,26 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "engine.hpp"
#include "tutorial_04.hpp"
/**
* In this tutorial we will learn:
* - How to get pad input and move the camera
* - What is static pipeline and how to use it
* - What is mesh (StaticMesh) and how to load it from .obj file
*/
int main() {
Tyra::Engine engine;
Tyra::Tutorial04 game(&engine);
engine.run(&game);
return 0;
}
+39
View File
@@ -0,0 +1,39 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include <tyra>
#include "tutorial_04.hpp"
namespace Tyra {
Tutorial04::Tutorial04(Engine* t_engine) : engine(t_engine) {}
Tutorial04::~Tutorial04() {
engine->renderer.getTextureRepository().freeByMesh(mesh.get());
}
void Tutorial04::init() { loadMesh(); }
void Tutorial04::loop() {}
void Tutorial04::loadMesh() {
ObjLoader loader;
ObjLoaderOptions options;
options.flipUVs = true;
options.scale = 200.0F;
auto data = loader.load(FileUtils::fromCwd("de_dust2/de_dust2.obj"), options);
mesh = std::make_unique<StaticMesh>(data.get());
engine->renderer.getTextureRepository().addByMesh(
mesh.get(), FileUtils::fromCwd("de_dust2/"), "png");
}
} // namespace Tyra