added MeshTexture class

This commit is contained in:
Sandro Sobczyński
2020-10-30 14:37:39 +01:00
parent 99d4c3633b
commit aa97e471ed
7 changed files with 177 additions and 27 deletions
+84 -6
View File
@@ -13,6 +13,7 @@
#include <tamtypes.h> #include <tamtypes.h>
#include <draw_sampling.h> #include <draw_sampling.h>
#include "./texture_wrap_settings.hpp"
/** /**
* Class which contains texture data * Class which contains texture data
@@ -31,23 +32,100 @@ public:
// Getters // Getters
// ---- // ----
/**
* Auto generated unique Id.
* Core role of this variable is to dont send
* again texture in renderer, when last sent texture id
* by renderer will be equal to this id.
*/
const u32 &getId() const { return id; };
/**
* Core role of this variable is to assign texture to correct material.
* For example you can have two textures for single material.
* Example: Same player can have two textures (team A, team B)
*/
const u32 &getMaterialId() const { return materialId; };
const u8 &getWidth() const { return width; };
const u8 &getHeight() const { return height; };
texwrap_t *getWrapSettings() { return &wrapSettings; };
/**
* Returns always width * width * 3.
* 3 because of RGB
*/
u32 getDataSize() const { return width * height * 3; };
/**
* Texture data, used by renderer.
* Array of size getDataSize().
*/
unsigned char *getData() const { return data; };
/**
* Get texture name.
* For "textures/abc.bmp" result will be: "abc"
*/
char *getName() const { return name; };
// ---- // ----
// Setters // Setters
// ---- // ----
/**
* Core role of this variable is to assign texture to correct material.
* For example you can have two textures for single material.
* Example: Same player can have two textures (team A, team B)
*/
void setMaterialId(const u32 &t_val) { materialId = t_val; }
/**
* Set texture size and allocate texture data
* Do not call this method unless you know what you do.
* Should be called by data loader.
*/
void setSize(const u8 &t_width, const u8 &t_height);
/**
* Do not call this method unless you know what you do.
* Should be called by data loader.
*/
void setHeight(const u8 &t_val) { height = t_val; }
/**
* Set texture name.
* Should be the file name without extension
*/
void setData(const u32 &t_index, const unsigned char &t_val) { data[t_index] = t_val; }
/**
* Set texture name.
* Should be the file name without extension
*/
void setName(char *t_val);
/** Set texture wrapping */
void setWrapSettings(const WrapSettings t_horizontal, const WrapSettings t_vertical);
// ---- // ----
// Other // Other
// ---- // ----
// TODO const u8 &isNameSet() const { return _isNameSet; };
u32 id; const u8 &isSizeSet() const { return _isSizeSet; };
unsigned char *data;
texwrap_t wrapSettings;
char *name;
u8 width, height;
private: private:
void setDefaultWrapSettings();
texwrap_t wrapSettings;
char *name;
u32 id, materialId;
u8 width, height, _isNameSet, _isSizeSet;
unsigned char *data;
}; };
#endif #endif
@@ -0,0 +1,22 @@
/*
# ______ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2020, tyra - https://github.com/h4570/tyra
# Licenced under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#ifndef _TYRA_TEXTURE_WRAP_SETTINGS_
#define _TYRA_TEXTURE_WRAP_SETTINGS_
enum WrapSettings
{
Repeat = 0,
Clamp = 1,
RegionClamp = 2,
RegionRepeat = 3
};
#endif
+5 -7
View File
@@ -32,6 +32,7 @@ BmpLoader::~BmpLoader() {}
*/ */
void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, char *t_extension) void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, char *t_extension)
{ {
o_texture.setName(t_name);
char *t_path_part = String::createConcatenated(t_subfolder, t_name); char *t_path_part = String::createConcatenated(t_subfolder, t_name);
char *t_path = String::createConcatenated(t_path_part, t_extension); char *t_path = String::createConcatenated(t_path_part, t_extension);
delete[] t_path_part; delete[] t_path_part;
@@ -46,10 +47,7 @@ void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, ch
u32 width = *(u32 *)&header[18]; u32 width = *(u32 *)&header[18];
u32 height = *(u32 *)&header[22]; u32 height = *(u32 *)&header[22];
o_texture.id = rand() % 100000; o_texture.setSize(width, height);
o_texture.width = width;
o_texture.height = height;
o_texture.data = new unsigned char[width * height * 3];
printf("BMPLoader - width: %d | height: %d\n", width, height); printf("BMPLoader - width: %d | height: %d\n", width, height);
if (width > 128 || height > 128) if (width > 128 || height > 128)
PRINT_ERR("Given texture is big for PS2. Please strict to 128x128 max"); PRINT_ERR("Given texture is big for PS2. Please strict to 128x128 max");
@@ -70,9 +68,9 @@ void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, ch
data[j] = data[j + 2]; data[j] = data[j + 2];
data[j + 2] = tmp; data[j + 2] = tmp;
o_texture.data[x] = data[j]; o_texture.setData(x, data[j]);
o_texture.data[x + 1] = data[j + 1]; o_texture.setData(x + 1, data[j + 1]);
o_texture.data[x + 2] = data[j + 2]; o_texture.setData(x + 2, data[j + 2]);
x += 3; x += 3;
} }
} }
+9 -9
View File
@@ -166,12 +166,12 @@ u32 Mesh::getVertexCount()
void Mesh::setDefaultWrapSettings(texwrap_t &t_wrapSettings) void Mesh::setDefaultWrapSettings(texwrap_t &t_wrapSettings)
{ {
t_wrapSettings.horizontal = WRAP_REPEAT; // t_wrapSettings.horizontal = WRAP_REPEAT;
t_wrapSettings.vertical = WRAP_REPEAT; // t_wrapSettings.vertical = WRAP_REPEAT;
t_wrapSettings.maxu = 0; // t_wrapSettings.maxu = 0;
t_wrapSettings.maxv = 0; // t_wrapSettings.maxv = 0;
t_wrapSettings.minu = 0; // t_wrapSettings.minu = 0;
t_wrapSettings.minv = 0; // t_wrapSettings.minv = 0;
} }
void Mesh::loadTextures(char *t_subfolder, char *t_extension) void Mesh::loadTextures(char *t_subfolder, char *t_extension)
@@ -183,14 +183,14 @@ void Mesh::loadTextures(char *t_subfolder, char *t_extension)
for (u8 i = 0; i < obj->frames[0].getMaterialsCount(); i++) for (u8 i = 0; i < obj->frames[0].getMaterialsCount(); i++)
{ {
bmpLoader.load(spec->textures[i], t_subfolder, obj->frames[0].getMaterial(i).getName(), t_extension); bmpLoader.load(spec->textures[i], t_subfolder, obj->frames[0].getMaterial(i).getName(), t_extension);
setDefaultWrapSettings(spec->textures[i].wrapSettings); // setDefaultWrapSettings(spec->textures[i].wrapSettings);
} }
} }
else if (isMd2Loaded) else if (isMd2Loaded)
{ {
spec->textures = new MeshTexture[1]; spec->textures = new MeshTexture[1];
bmpLoader.load(spec->textures[0], t_subfolder, md2->filename, t_extension); bmpLoader.load(spec->textures[0], t_subfolder, md2->filename, t_extension);
setDefaultWrapSettings(spec->textures[0].wrapSettings); // setDefaultWrapSettings(spec->textures[0].wrapSettings);
} }
else if (isDffLoaded) else if (isDffLoaded)
{ {
@@ -199,7 +199,7 @@ void Mesh::loadTextures(char *t_subfolder, char *t_extension)
for (u8 j = 0; j < dff->clump.geometryList.geometries[0].materialList.materials[i].data.textureCount; j++) for (u8 j = 0; j < dff->clump.geometryList.geometries[0].materialList.materials[i].data.textureCount; j++)
{ {
bmpLoader.load(spec->textures[i], t_subfolder, dff->clump.geometryList.geometries[0].materialList.materials[i].textures[j].textureName.text, t_extension); bmpLoader.load(spec->textures[i], t_subfolder, dff->clump.geometryList.geometries[0].materialList.materials[i].textures[j].textureName.text, t_extension);
setDefaultWrapSettings(spec->textures[i].wrapSettings); // setDefaultWrapSettings(spec->textures[i].wrapSettings);
} }
} }
else else
+52
View File
@@ -9,7 +9,10 @@
*/ */
#include "../include/models/mesh_texture.hpp" #include "../include/models/mesh_texture.hpp"
#include "../include/utils/string.hpp"
#include "../include/utils/debug.hpp" #include "../include/utils/debug.hpp"
#include <cstdlib>
#include <draw_sampling.h>
// ---- // ----
// Constructors/Destructors // Constructors/Destructors
@@ -17,12 +20,61 @@
MeshTexture::MeshTexture() MeshTexture::MeshTexture()
{ {
id = rand() % 100000;
materialId = 0;
_isSizeSet = false;
_isNameSet = false;
setDefaultWrapSettings();
} }
MeshTexture::~MeshTexture() MeshTexture::~MeshTexture()
{ {
if (_isNameSet)
delete[] name;
if (_isSizeSet)
delete[] data;
} }
// ---- // ----
// Methods // Methods
// ---- // ----
void MeshTexture::setSize(const u8 &t_width, const u8 &t_height)
{
if (_isSizeSet)
{
PRINT_ERR("Can't set size, because was already set!");
return;
}
width = t_width;
height = t_height;
data = new unsigned char[getDataSize()];
_isSizeSet = true;
}
void MeshTexture::setName(char *t_val)
{
if (_isNameSet)
{
PRINT_ERR("Can't set name, because was already set!");
return;
}
name = String::createCopy(t_val);
_isNameSet = true;
}
void MeshTexture::setDefaultWrapSettings()
{
wrapSettings.horizontal = WRAP_REPEAT;
wrapSettings.vertical = WRAP_REPEAT;
wrapSettings.maxu = 0;
wrapSettings.maxv = 0;
wrapSettings.minu = 0;
wrapSettings.minv = 0;
}
void MeshTexture::setWrapSettings(const WrapSettings t_horizontal, const WrapSettings t_vertical)
{
wrapSettings.horizontal = t_horizontal;
wrapSettings.vertical = t_vertical;
}
+2 -2
View File
@@ -56,10 +56,10 @@ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer)
const u16 packetSize = 40; const u16 packetSize = 40;
packet_t *packet = packet_init(packetSize, PACKET_NORMAL); packet_t *packet = packet_init(packetSize, PACKET_NORMAL);
qword_t *q = packet->data; qword_t *q = packet->data;
q = draw_texture_transfer(q, texture.data, texture.width, texture.height, GS_PSM_24, t_texBuffer->address, t_texBuffer->width); q = draw_texture_transfer(q, texture.getData(), texture.getWidth(), texture.getHeight(), GS_PSM_24, t_texBuffer->address, t_texBuffer->width);
DMATAG_CNT(q, 2, 0, 0, 0); DMATAG_CNT(q, 2, 0, 0, 0);
q++; q++;
q = draw_texture_wrapping(q, 0, &texture.wrapSettings); q = draw_texture_wrapping(q, 0, texture.getWrapSettings());
q = draw_texture_flush(q); q = draw_texture_flush(q);
dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0); dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0);
dma_wait_fast(); dma_wait_fast();
+3 -3
View File
@@ -115,11 +115,11 @@ void Renderer::deallocateTextureBuffer()
void Renderer::changeTexture(Mesh *t_mesh, u8 t_textureIndex) void Renderer::changeTexture(Mesh *t_mesh, u8 t_textureIndex)
{ {
if (t_mesh->spec->textures[t_textureIndex].id != lastTextureId) if (t_mesh->spec->textures[t_textureIndex].getId() != lastTextureId)
{ {
lastTextureId = t_mesh->spec->textures[t_textureIndex].id; lastTextureId = t_mesh->spec->textures[t_textureIndex].getId();
deallocateTextureBuffer(); deallocateTextureBuffer();
allocateTextureBuffer(t_mesh->spec->textures[t_textureIndex].width, t_mesh->spec->textures[t_textureIndex].height); allocateTextureBuffer(t_mesh->spec->textures[t_textureIndex].getWidth(), t_mesh->spec->textures[t_textureIndex].getHeight());
GifSender::sendTexture(t_mesh->spec->textures[t_textureIndex], &textureBuffer); GifSender::sendTexture(t_mesh->spec->textures[t_textureIndex], &textureBuffer);
} }
} }