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 <draw_sampling.h>
#include "./texture_wrap_settings.hpp"
/**
* Class which contains texture data
@@ -31,23 +32,100 @@ public:
// 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
// ----
/**
* 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
// ----
// TODO
const u8 &isNameSet() const { return _isNameSet; };
u32 id;
unsigned char *data;
texwrap_t wrapSettings;
char *name;
u8 width, height;
const u8 &isSizeSet() const { return _isSizeSet; };
private:
void setDefaultWrapSettings();
texwrap_t wrapSettings;
char *name;
u32 id, materialId;
u8 width, height, _isNameSet, _isSizeSet;
unsigned char *data;
};
#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)
{
o_texture.setName(t_name);
char *t_path_part = String::createConcatenated(t_subfolder, t_name);
char *t_path = String::createConcatenated(t_path_part, t_extension);
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 height = *(u32 *)&header[22];
o_texture.id = rand() % 100000;
o_texture.width = width;
o_texture.height = height;
o_texture.data = new unsigned char[width * height * 3];
o_texture.setSize(width, height);
printf("BMPLoader - width: %d | height: %d\n", width, height);
if (width > 128 || height > 128)
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 + 2] = tmp;
o_texture.data[x] = data[j];
o_texture.data[x + 1] = data[j + 1];
o_texture.data[x + 2] = data[j + 2];
o_texture.setData(x, data[j]);
o_texture.setData(x + 1, data[j + 1]);
o_texture.setData(x + 2, data[j + 2]);
x += 3;
}
}
+9 -9
View File
@@ -166,12 +166,12 @@ u32 Mesh::getVertexCount()
void Mesh::setDefaultWrapSettings(texwrap_t &t_wrapSettings)
{
t_wrapSettings.horizontal = WRAP_REPEAT;
t_wrapSettings.vertical = WRAP_REPEAT;
t_wrapSettings.maxu = 0;
t_wrapSettings.maxv = 0;
t_wrapSettings.minu = 0;
t_wrapSettings.minv = 0;
// t_wrapSettings.horizontal = WRAP_REPEAT;
// t_wrapSettings.vertical = WRAP_REPEAT;
// t_wrapSettings.maxu = 0;
// t_wrapSettings.maxv = 0;
// t_wrapSettings.minu = 0;
// t_wrapSettings.minv = 0;
}
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++)
{
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)
{
spec->textures = new MeshTexture[1];
bmpLoader.load(spec->textures[0], t_subfolder, md2->filename, t_extension);
setDefaultWrapSettings(spec->textures[0].wrapSettings);
// setDefaultWrapSettings(spec->textures[0].wrapSettings);
}
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++)
{
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
+52
View File
@@ -9,7 +9,10 @@
*/
#include "../include/models/mesh_texture.hpp"
#include "../include/utils/string.hpp"
#include "../include/utils/debug.hpp"
#include <cstdlib>
#include <draw_sampling.h>
// ----
// Constructors/Destructors
@@ -17,12 +20,61 @@
MeshTexture::MeshTexture()
{
id = rand() % 100000;
materialId = 0;
_isSizeSet = false;
_isNameSet = false;
setDefaultWrapSettings();
}
MeshTexture::~MeshTexture()
{
if (_isNameSet)
delete[] name;
if (_isSizeSet)
delete[] data;
}
// ----
// 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;
packet_t *packet = packet_init(packetSize, PACKET_NORMAL);
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);
q++;
q = draw_texture_wrapping(q, 0, &texture.wrapSettings);
q = draw_texture_wrapping(q, 0, texture.getWrapSettings());
q = draw_texture_flush(q);
dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0);
dma_wait_fast();
+3 -3
View File
@@ -115,11 +115,11 @@ void Renderer::deallocateTextureBuffer()
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();
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);
}
}