lod, prim refactor
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
------------ Tyra's v2.0 roadmap to publish on GitHub ------------
|
||||
- [Renderer] Test clipper
|
||||
- [Renderer] Fog
|
||||
- [Demo] Create cool demo which will show all features of Tyra
|
||||
- [General] CI in Github via docker image
|
||||
|
||||
@@ -45,6 +45,7 @@ class IntroPressKeyState : public State<IntroStateType> {
|
||||
bool _wantFinish;
|
||||
bool initialized;
|
||||
|
||||
constexpr static float textureWidthHeight = 512.0F;
|
||||
const static u8 mapRows = 3;
|
||||
const static u8 mapCols = 3;
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
using Tyra::FileUtils;
|
||||
using Tyra::Math;
|
||||
using Tyra::PngLoader;
|
||||
using Tyra::SpriteMode;
|
||||
using Tyra::Threading;
|
||||
|
||||
namespace Demo {
|
||||
@@ -44,8 +45,10 @@ void IntroPressKeyState::onStart() {
|
||||
for (u8 i = 0; i < mapRows; i++) {
|
||||
for (u8 j = 0; j < mapCols; j++) {
|
||||
mapSprites[i][j] = new Sprite;
|
||||
mapSprites[i][j]->size.set(512.0F, 512.0F);
|
||||
mapSprites[i][j]->position.set(i * 512.0F, j * 512.0F);
|
||||
mapSprites[i][j]->setMode(SpriteMode::MODE_STRETCH);
|
||||
mapSprites[i][j]->size.set(textureWidthHeight, textureWidthHeight);
|
||||
mapSprites[i][j]->position.set(i * textureWidthHeight,
|
||||
j * textureWidthHeight);
|
||||
|
||||
std::string filename =
|
||||
"map-" + std::to_string(i) + "-" + std::to_string(j);
|
||||
@@ -63,18 +66,20 @@ void IntroPressKeyState::onStart() {
|
||||
void IntroPressKeyState::update() {
|
||||
engine->renderer.beginFrame();
|
||||
|
||||
if (mapDirection == 0 && mapPosition.x >= 512.0F * (mapRows - 1) &&
|
||||
mapPosition.y >= 512.0F * (mapCols - 1)) {
|
||||
if (mapDirection == 0 &&
|
||||
mapPosition.x >= textureWidthHeight * (mapRows - 1) &&
|
||||
mapPosition.y >= textureWidthHeight * (mapCols - 1)) {
|
||||
mapDirection = 1;
|
||||
} else if (mapDirection == 1 && mapPosition.x <= 0.0F &&
|
||||
mapPosition.y <= 0.0F) {
|
||||
mapDirection = 0;
|
||||
}
|
||||
|
||||
const float offset = 0.1F;
|
||||
if (mapDirection == 0) {
|
||||
mapPosition += .5F;
|
||||
mapPosition += offset;
|
||||
} else if (mapDirection == 1) {
|
||||
mapPosition -= .5F;
|
||||
mapPosition -= offset;
|
||||
}
|
||||
|
||||
updateMap();
|
||||
@@ -92,8 +97,8 @@ IntroStateType IntroPressKeyState::onFinish() { return STATE_INTRO_END; }
|
||||
void IntroPressKeyState::updateMap() {
|
||||
for (u8 i = 0; i < mapRows; i++)
|
||||
for (u8 j = 0; j < mapCols; j++) {
|
||||
mapSprites[i][j]->position.x = i * 512.0F - mapPosition.x;
|
||||
mapSprites[i][j]->position.y = j * 512.0F - mapPosition.y;
|
||||
mapSprites[i][j]->position.x = i * textureWidthHeight - mapPosition.x;
|
||||
mapSprites[i][j]->position.y = j * textureWidthHeight - mapPosition.y;
|
||||
}
|
||||
}
|
||||
} // namespace Demo
|
||||
|
||||
@@ -58,6 +58,12 @@ class DynPipCore {
|
||||
void deallocateOnUse() { qbufferRenderer.deallocateOnUse(); }
|
||||
|
||||
private:
|
||||
void setPrim();
|
||||
void setLod();
|
||||
|
||||
prim_t prim;
|
||||
lod_t lod;
|
||||
|
||||
M4x4 mvp;
|
||||
RendererCore* rendererCore;
|
||||
DynPipRenderer qbufferRenderer;
|
||||
|
||||
@@ -21,7 +21,8 @@ class DynPipRenderer {
|
||||
DynPipRenderer();
|
||||
~DynPipRenderer();
|
||||
|
||||
void init(RendererCore* t_core, DynPipProgramsRepository* t_programRepo);
|
||||
void init(RendererCore* t_core, DynPipProgramsRepository* t_programRepo,
|
||||
prim_t* prim, lod_t* lod);
|
||||
|
||||
void reinitVU1();
|
||||
|
||||
@@ -47,6 +48,9 @@ class DynPipRenderer {
|
||||
const u32& count);
|
||||
void sendPacket();
|
||||
|
||||
prim_t* prim;
|
||||
lod_t* lod;
|
||||
|
||||
packet2_t* packets[2];
|
||||
packet2_t* programsPacket;
|
||||
packet2_t* currentPacket;
|
||||
|
||||
@@ -54,6 +54,12 @@ class MinecraftPipeline : public Renderer3DPipeline {
|
||||
const McpipBlockData& getBlockData() const { return manager.getBlockData(); }
|
||||
|
||||
private:
|
||||
void setPrim();
|
||||
void setLod();
|
||||
|
||||
prim_t prim;
|
||||
lod_t lod;
|
||||
|
||||
BlockizerProgramsManager manager;
|
||||
RendererCore* rendererCore;
|
||||
RenderBBox* bbox;
|
||||
|
||||
@@ -31,7 +31,7 @@ class McpipClip {
|
||||
EEClipAlgorithmSettings algoSettings;
|
||||
|
||||
void init(RendererCore* core, McpipBlockData* t_singleBlockData,
|
||||
McpipBlockData* t_multiBlockData);
|
||||
McpipBlockData* t_multiBlockData, prim_t* prim, lod_t* lod);
|
||||
|
||||
u32 uploadVU1Program(McpipProgramsRepository* repo, const u32& addr);
|
||||
|
||||
@@ -42,6 +42,9 @@ class McpipClip {
|
||||
const u8& context);
|
||||
|
||||
private:
|
||||
prim_t* prim;
|
||||
lod_t* lod;
|
||||
|
||||
RendererCore* rendererCore;
|
||||
McpipBlockData* singleBlockData;
|
||||
McpipBlockData* multiBlockData;
|
||||
|
||||
@@ -26,7 +26,8 @@ class McpipCull {
|
||||
McpipCull();
|
||||
~McpipCull();
|
||||
|
||||
void init(RendererCore* core, McpipBlockData* t_blockData);
|
||||
void init(RendererCore* core, McpipBlockData* t_blockData, prim_t* prim,
|
||||
lod_t* lod);
|
||||
|
||||
u32 uploadVU1Program(McpipProgramsRepository* repo, const u32& addr);
|
||||
|
||||
@@ -39,6 +40,8 @@ class McpipCull {
|
||||
RendererCoreTextureBuffers* texBuffers, bool isMulti);
|
||||
|
||||
private:
|
||||
prim_t* prim;
|
||||
lod_t* lod;
|
||||
RendererCore* rendererCore;
|
||||
u16 vu1DBufferSize;
|
||||
McpipBlockData* blockData;
|
||||
|
||||
@@ -36,7 +36,7 @@ class BlockizerProgramsManager {
|
||||
McpipCull culler;
|
||||
McpipClip clipper;
|
||||
|
||||
void init(RendererCore* core);
|
||||
void init(RendererCore* core, prim_t* prim, lod_t* lod);
|
||||
|
||||
void uploadVU1Programs();
|
||||
|
||||
|
||||
@@ -51,6 +51,12 @@ class StaPipCore {
|
||||
void deallocateOnUse() { qbufferRenderer.deallocateOnUse(); }
|
||||
|
||||
private:
|
||||
void setPrim();
|
||||
void setLod();
|
||||
|
||||
prim_t prim;
|
||||
lod_t lod;
|
||||
|
||||
u32 maxVertCount;
|
||||
RendererCore* rendererCore;
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ class StaPipQBufferRenderer {
|
||||
StaPipQBufferRenderer();
|
||||
~StaPipQBufferRenderer();
|
||||
|
||||
void init(RendererCore* t_core);
|
||||
void init(RendererCore* t_core, prim_t* prim, lod_t* lod);
|
||||
|
||||
void reinitVU1();
|
||||
|
||||
@@ -69,6 +69,9 @@ class StaPipQBufferRenderer {
|
||||
void deallocateOnUse();
|
||||
|
||||
private:
|
||||
prim_t* prim;
|
||||
lod_t* lod;
|
||||
|
||||
bool is1stDBufferFlushTime();
|
||||
bool is2ndDBufferFlushTime();
|
||||
|
||||
|
||||
@@ -31,6 +31,12 @@ class RendererCore2D {
|
||||
Texture* texture);
|
||||
|
||||
private:
|
||||
void setPrim();
|
||||
void setLod();
|
||||
|
||||
prim_t prim;
|
||||
lod_t lod;
|
||||
|
||||
static const float GS_CENTER;
|
||||
static const float SCREEN_CENTER;
|
||||
|
||||
|
||||
@@ -20,8 +20,6 @@ class RendererCoreGS {
|
||||
RendererCoreGS();
|
||||
~RendererCoreGS();
|
||||
|
||||
prim_t prim;
|
||||
lod_t lod;
|
||||
zbuffer_t zBuffer;
|
||||
RendererCoreGSVRam vram;
|
||||
|
||||
@@ -41,8 +39,6 @@ class RendererCoreGS {
|
||||
|
||||
void allocateBuffers();
|
||||
void initDrawingEnvironment();
|
||||
void setPrim();
|
||||
void setLod();
|
||||
void initChannels();
|
||||
void updateCurrentField();
|
||||
qword_t* setXYOffset(qword_t* q, const int& drawContext, const float& x,
|
||||
|
||||
@@ -15,13 +15,37 @@
|
||||
|
||||
namespace Tyra {
|
||||
|
||||
DynPipCore::DynPipCore() {}
|
||||
DynPipCore::DynPipCore() {
|
||||
setPrim();
|
||||
setLod();
|
||||
}
|
||||
|
||||
DynPipCore::~DynPipCore() {}
|
||||
|
||||
void DynPipCore::init(RendererCore* t_core) {
|
||||
rendererCore = t_core;
|
||||
qbufferRenderer.init(t_core, &repository);
|
||||
qbufferRenderer.init(t_core, &repository, &prim, &lod);
|
||||
}
|
||||
|
||||
void DynPipCore::setPrim() {
|
||||
prim.type = PRIM_TRIANGLE;
|
||||
prim.shading = PRIM_SHADE_GOURAUD;
|
||||
prim.mapping = DRAW_ENABLE;
|
||||
prim.fogging = DRAW_DISABLE;
|
||||
prim.blending = DRAW_ENABLE;
|
||||
prim.antialiasing = DRAW_DISABLE;
|
||||
prim.mapping_type = PRIM_MAP_ST;
|
||||
prim.colorfix = PRIM_UNFIXED;
|
||||
}
|
||||
|
||||
void DynPipCore::setLod() {
|
||||
lod.calculation = LOD_USE_K;
|
||||
lod.max_level = 0;
|
||||
lod.mag_filter = LOD_MAG_NEAREST;
|
||||
lod.min_filter = LOD_MIN_NEAREST;
|
||||
lod.mipmap_select = LOD_MIPMAP_REGISTER;
|
||||
lod.l = 0;
|
||||
lod.k = 0.0F;
|
||||
}
|
||||
|
||||
void DynPipCore::reinitVU1Programs() { qbufferRenderer.reinitVU1(); }
|
||||
|
||||
@@ -45,8 +45,11 @@ void DynPipRenderer::deallocateOnUse() {
|
||||
}
|
||||
|
||||
void DynPipRenderer::init(RendererCore* t_core,
|
||||
DynPipProgramsRepository* t_programRepo) {
|
||||
DynPipProgramsRepository* t_programRepo,
|
||||
prim_t* t_prim, lod_t* t_lod) {
|
||||
path1 = t_core->getPath1();
|
||||
prim = t_prim;
|
||||
lod = t_lod;
|
||||
rendererCore = t_core;
|
||||
programsRepo = t_programRepo;
|
||||
|
||||
@@ -122,7 +125,7 @@ void DynPipRenderer::sendObjectData(
|
||||
packet2_add_u32(objectDataPacket, 0); // not used, padding
|
||||
packet2_add_u32(objectDataPacket, 0); // not used, padding
|
||||
|
||||
packet2_utils_gs_add_lod(objectDataPacket, &rendererCore->gs.lod);
|
||||
packet2_utils_gs_add_lod(objectDataPacket, lod);
|
||||
|
||||
if (texBuffers != nullptr) {
|
||||
rendererCore->texture.updateClutBuffer(texBuffers->clut);
|
||||
@@ -154,8 +157,7 @@ void DynPipRenderer::addBufferDataToPacket(DynPipVU1Program* program,
|
||||
for (u32 i = 0; i < count; i++) {
|
||||
if (bags[i]->count <= 0) continue;
|
||||
|
||||
program->addBufferDataToPacket(currentPacket, bags[i],
|
||||
&rendererCore->gs.prim);
|
||||
program->addBufferDataToPacket(currentPacket, bags[i], prim);
|
||||
|
||||
if (lastProgramName != program->getName()) {
|
||||
packet2_utils_vu_add_start_program(currentPacket,
|
||||
|
||||
@@ -18,6 +18,8 @@ MinecraftPipeline::MinecraftPipeline() {
|
||||
latestMode = UndefinedMcpipProgram;
|
||||
spamBuffersCount = 4;
|
||||
spammerIndex = 0;
|
||||
setPrim();
|
||||
setLod();
|
||||
}
|
||||
|
||||
MinecraftPipeline::~MinecraftPipeline() {
|
||||
@@ -29,11 +31,32 @@ MinecraftPipeline::~MinecraftPipeline() {
|
||||
|
||||
void MinecraftPipeline::setRenderer(RendererCore* core) {
|
||||
rendererCore = core;
|
||||
manager.init(core);
|
||||
manager.init(core, &prim, &lod);
|
||||
|
||||
initBBox();
|
||||
}
|
||||
|
||||
void MinecraftPipeline::setPrim() {
|
||||
prim.type = PRIM_TRIANGLE;
|
||||
prim.shading = PRIM_SHADE_FLAT;
|
||||
prim.mapping = DRAW_ENABLE;
|
||||
prim.fogging = DRAW_DISABLE;
|
||||
prim.blending = DRAW_ENABLE;
|
||||
prim.antialiasing = DRAW_DISABLE;
|
||||
prim.mapping_type = PRIM_MAP_ST;
|
||||
prim.colorfix = PRIM_UNFIXED;
|
||||
}
|
||||
|
||||
void MinecraftPipeline::setLod() {
|
||||
lod.calculation = LOD_USE_K;
|
||||
lod.max_level = 0;
|
||||
lod.mag_filter = LOD_MAG_NEAREST;
|
||||
lod.min_filter = LOD_MIN_NEAREST;
|
||||
lod.mipmap_select = LOD_MIPMAP_REGISTER;
|
||||
lod.l = 0;
|
||||
lod.k = 0.0F;
|
||||
}
|
||||
|
||||
void MinecraftPipeline::onUse() {
|
||||
spamBuffers = new McpipBlock**[spamBuffersCount];
|
||||
spamCounts = new u32[spamBuffersCount];
|
||||
@@ -59,7 +82,6 @@ void MinecraftPipeline::render(McpipBlock* blocks, const u32& count,
|
||||
Texture* t_tex, const bool& isMulti,
|
||||
const bool& fullClipChecks) {
|
||||
auto texBuffers = rendererCore->texture.useTexture(t_tex);
|
||||
rendererCore->gs.prim.mapping = 1;
|
||||
|
||||
manager.clearLastProgram();
|
||||
std::vector<u32> cullIndexes;
|
||||
|
||||
@@ -22,7 +22,10 @@ McpipClip::McpipClip() {
|
||||
McpipClip::~McpipClip() { packet2_free(staticPacket); }
|
||||
|
||||
void McpipClip::init(RendererCore* core, McpipBlockData* t_singleBlockData,
|
||||
McpipBlockData* t_multiBlockData) {
|
||||
McpipBlockData* t_multiBlockData, prim_t* t_prim,
|
||||
lod_t* t_lod) {
|
||||
prim = t_prim;
|
||||
lod = t_lod;
|
||||
singleBlockData = t_singleBlockData;
|
||||
multiBlockData = t_multiBlockData;
|
||||
rendererCore = core;
|
||||
@@ -46,7 +49,7 @@ void McpipClip::configureVU1AndSendStaticData() {
|
||||
void McpipClip::initStaticPacket() {
|
||||
packet2_utils_vu_open_unpack(staticPacket, VU1_MCPIP_AS_IS_STATIC_LOD, false);
|
||||
{
|
||||
packet2_utils_gs_add_lod(staticPacket, &rendererCore->gs.lod);
|
||||
packet2_utils_gs_add_lod(staticPacket, lod);
|
||||
packet2_utils_gif_add_set(staticPacket, 1);
|
||||
}
|
||||
packet2_utils_vu_close_unpack(staticPacket);
|
||||
@@ -120,7 +123,7 @@ void McpipClip::addDataToPacket(packet2_t* packet, const u8& context,
|
||||
static_cast<float>(0xFFFFFF) / 32.0F); // scale
|
||||
packet2_add_s32(packet, count); // vertex count
|
||||
|
||||
packet2_utils_gs_add_prim_giftag(packet, &rendererCore->gs.prim, count,
|
||||
packet2_utils_gs_add_prim_giftag(packet, prim, count,
|
||||
((u64)GIF_REG_ST) << 0 |
|
||||
((u64)GIF_REG_RGBAQ) << 4 |
|
||||
((u64)GIF_REG_XYZ2) << 8,
|
||||
|
||||
@@ -18,7 +18,10 @@ McpipCull::McpipCull() {
|
||||
|
||||
McpipCull::~McpipCull() { packet2_free(staticPacket); }
|
||||
|
||||
void McpipCull::init(RendererCore* core, McpipBlockData* t_blockData) {
|
||||
void McpipCull::init(RendererCore* core, McpipBlockData* t_blockData,
|
||||
prim_t* t_prim, lod_t* t_lod) {
|
||||
prim = t_prim;
|
||||
lod = t_lod;
|
||||
blockData = t_blockData;
|
||||
rendererCore = core;
|
||||
initStaticPacket();
|
||||
@@ -79,9 +82,9 @@ u32 McpipCull::getMaxBlocksCountPerQBuffer() const {
|
||||
void McpipCull::initStaticPacket() {
|
||||
packet2_utils_vu_open_unpack(staticPacket, VU1_MCPIP_CULL_STATIC_LOD, false);
|
||||
{
|
||||
packet2_utils_gs_add_lod(staticPacket, &rendererCore->gs.lod);
|
||||
packet2_utils_gs_add_lod(staticPacket, lod);
|
||||
|
||||
packet2_utils_gs_add_prim_giftag(staticPacket, &rendererCore->gs.prim, 36,
|
||||
packet2_utils_gs_add_prim_giftag(staticPacket, prim, 36,
|
||||
((u64)GIF_REG_ST) << 0 |
|
||||
((u64)GIF_REG_RGBAQ) << 4 |
|
||||
((u64)GIF_REG_XYZ2) << 8,
|
||||
|
||||
@@ -36,10 +36,11 @@ BlockizerProgramsManager::~BlockizerProgramsManager() {
|
||||
packet2_free(programsPacket);
|
||||
}
|
||||
|
||||
void BlockizerProgramsManager::init(RendererCore* core) {
|
||||
void BlockizerProgramsManager::init(RendererCore* core, prim_t* prim,
|
||||
lod_t* lod) {
|
||||
rendererCore = core;
|
||||
culler.init(core, &singleTexBlockData);
|
||||
clipper.init(core, &singleTexBlockData, &multiTexBlockData);
|
||||
culler.init(core, &singleTexBlockData, prim, lod);
|
||||
clipper.init(core, &singleTexBlockData, &multiTexBlockData, prim, lod);
|
||||
}
|
||||
|
||||
void BlockizerProgramsManager::setProgramsCache() {
|
||||
|
||||
@@ -22,16 +22,41 @@
|
||||
|
||||
namespace Tyra {
|
||||
|
||||
StaPipCore::StaPipCore() { maxVertCount = 0; }
|
||||
StaPipCore::StaPipCore() {
|
||||
maxVertCount = 0;
|
||||
setPrim();
|
||||
setLod();
|
||||
}
|
||||
|
||||
StaPipCore::~StaPipCore() {}
|
||||
|
||||
void StaPipCore::init(RendererCore* t_core) {
|
||||
rendererCore = t_core;
|
||||
qbufferRenderer.init(t_core);
|
||||
qbufferRenderer.init(t_core, &prim, &lod);
|
||||
packager.init(&rendererCore->renderer3D.frustumPlanes);
|
||||
}
|
||||
|
||||
void StaPipCore::setPrim() {
|
||||
prim.type = PRIM_TRIANGLE;
|
||||
prim.shading = PRIM_SHADE_GOURAUD;
|
||||
prim.mapping = DRAW_ENABLE;
|
||||
prim.fogging = DRAW_DISABLE;
|
||||
prim.blending = DRAW_ENABLE;
|
||||
prim.antialiasing = DRAW_DISABLE;
|
||||
prim.mapping_type = PRIM_MAP_ST;
|
||||
prim.colorfix = PRIM_UNFIXED;
|
||||
}
|
||||
|
||||
void StaPipCore::setLod() {
|
||||
lod.calculation = LOD_USE_K;
|
||||
lod.max_level = 0;
|
||||
lod.mag_filter = LOD_MAG_NEAREST;
|
||||
lod.min_filter = LOD_MIN_NEAREST;
|
||||
lod.mipmap_select = LOD_MIPMAP_REGISTER;
|
||||
lod.l = 0;
|
||||
lod.k = 0.0F;
|
||||
}
|
||||
|
||||
void StaPipCore::reinitVU1Programs() { qbufferRenderer.reinitVU1(); }
|
||||
|
||||
u32 StaPipCore::getMaxVertCountByBag(const StaPipBag* bag) {
|
||||
|
||||
@@ -82,10 +82,13 @@ StaPipQBufferRenderer::~StaPipQBufferRenderer() {
|
||||
if (programsPacket) packet2_free(programsPacket);
|
||||
}
|
||||
|
||||
void StaPipQBufferRenderer::init(RendererCore* t_core) {
|
||||
void StaPipQBufferRenderer::init(RendererCore* t_core, prim_t* t_prim,
|
||||
lod_t* t_lod) {
|
||||
path1 = t_core->getPath1();
|
||||
clipper.init(t_core->getSettings());
|
||||
rendererCore = t_core;
|
||||
prim = t_prim;
|
||||
lod = t_lod;
|
||||
|
||||
dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0);
|
||||
dma_channel_fast_waits(DMA_CHANNEL_VIF1);
|
||||
@@ -136,7 +139,7 @@ void StaPipQBufferRenderer::sendObjectData(
|
||||
packet2_add_u32(objectDataPacket, 0); // not used, padding
|
||||
packet2_add_u32(objectDataPacket, 0); // not used, padding
|
||||
|
||||
packet2_utils_gs_add_lod(objectDataPacket, &rendererCore->gs.lod);
|
||||
packet2_utils_gs_add_lod(objectDataPacket, lod);
|
||||
|
||||
if (texBuffers != nullptr) {
|
||||
rendererCore->texture.updateClutBuffer(texBuffers->clut);
|
||||
@@ -153,9 +156,9 @@ void StaPipQBufferRenderer::sendObjectData(
|
||||
}
|
||||
|
||||
void StaPipQBufferRenderer::setInfo(PipelineInfoBag* bag) {
|
||||
rendererCore->gs.prim.antialiasing = bag->antiAliasingEnabled;
|
||||
rendererCore->gs.prim.blending = bag->blendingEnabled;
|
||||
rendererCore->gs.prim.shading = bag->shadingType;
|
||||
prim->antialiasing = bag->antiAliasingEnabled;
|
||||
prim->blending = bag->blendingEnabled;
|
||||
prim->shading = bag->shadingType;
|
||||
}
|
||||
|
||||
void StaPipQBufferRenderer::sendStaticData() const {
|
||||
@@ -286,8 +289,7 @@ void StaPipQBufferRenderer::addBufferDataToPacket(StaPipQBuffer** buffers,
|
||||
for (u32 i = 0; i < count; i++) {
|
||||
if (!buffers[i]->any()) continue;
|
||||
|
||||
dBufferPrograms[i]->addBufferDataToPacket(currentPacket, buffers[i],
|
||||
&rendererCore->gs.prim);
|
||||
dBufferPrograms[i]->addBufferDataToPacket(currentPacket, buffers[i], prim);
|
||||
|
||||
if (lastProgramName != dBufferPrograms[i]->getName()) {
|
||||
packet2_utils_vu_add_start_program(
|
||||
|
||||
@@ -20,6 +20,9 @@ RendererCore2D::RendererCore2D() {
|
||||
packets[1] = packet2_create(16, P2_TYPE_NORMAL, P2_MODE_NORMAL, 0);
|
||||
rects[0] = new texrect_t;
|
||||
rects[1] = new texrect_t;
|
||||
|
||||
setPrim();
|
||||
setLod();
|
||||
}
|
||||
|
||||
RendererCore2D::~RendererCore2D() {
|
||||
@@ -32,6 +35,27 @@ RendererCore2D::~RendererCore2D() {
|
||||
const float RendererCore2D::GS_CENTER = 4096.0F;
|
||||
const float RendererCore2D::SCREEN_CENTER = 4096.0F / 2.0F;
|
||||
|
||||
void RendererCore2D::setPrim() {
|
||||
prim.type = PRIM_TRIANGLE;
|
||||
prim.shading = PRIM_SHADE_GOURAUD;
|
||||
prim.mapping = DRAW_ENABLE;
|
||||
prim.fogging = DRAW_DISABLE;
|
||||
prim.blending = DRAW_ENABLE;
|
||||
prim.antialiasing = DRAW_DISABLE;
|
||||
prim.mapping_type = PRIM_MAP_ST;
|
||||
prim.colorfix = PRIM_UNFIXED;
|
||||
}
|
||||
|
||||
void RendererCore2D::setLod() {
|
||||
lod.calculation = LOD_USE_K;
|
||||
lod.max_level = 0;
|
||||
lod.mag_filter = LOD_MAG_LINEAR;
|
||||
lod.min_filter = LOD_MIN_LINEAR;
|
||||
lod.mipmap_select = LOD_MIPMAP_REGISTER;
|
||||
lod.l = 0;
|
||||
lod.k = 0.0F;
|
||||
}
|
||||
|
||||
void RendererCore2D::init(RendererSettings* t_settings,
|
||||
clutbuffer_t* t_clutBuffer) {
|
||||
settings = t_settings;
|
||||
@@ -86,10 +110,14 @@ void RendererCore2D::render(Sprite* sprite,
|
||||
packet2_reset(packet, false);
|
||||
packet2_update(packet, draw_primitive_xyoffset(packet->base, 0, SCREEN_CENTER,
|
||||
SCREEN_CENTER));
|
||||
|
||||
packet2_utils_gif_add_set(packet, 1);
|
||||
packet2_utils_gs_add_lod(packet, &lod);
|
||||
packet2_utils_gif_add_set(packet, 1);
|
||||
packet2_utils_gs_add_texbuff_clut(packet, texBuffers.core, clutBuffer);
|
||||
draw_enable_blending();
|
||||
packet2_update(packet, draw_rect_textured(packet->next, 0, rect));
|
||||
|
||||
packet2_update(packet, draw_primitive_xyoffset(
|
||||
packet->next, 0,
|
||||
SCREEN_CENTER - (settings->getWidth() / 2.0F),
|
||||
|
||||
@@ -27,6 +27,7 @@ RendererCoreGS::RendererCoreGS() {
|
||||
context = 0;
|
||||
currentField = 0;
|
||||
}
|
||||
|
||||
RendererCoreGS::~RendererCoreGS() {
|
||||
if (flipPacket) {
|
||||
packet2_free(flipPacket);
|
||||
@@ -40,8 +41,6 @@ void RendererCoreGS::init(RendererSettings* t_settings) {
|
||||
flipPacket = packet2_create(4, P2_TYPE_UNCACHED_ACCL, P2_MODE_NORMAL, 0);
|
||||
allocateBuffers();
|
||||
initDrawingEnvironment();
|
||||
setPrim();
|
||||
setLod();
|
||||
|
||||
TYRA_LOG("Renderer core initialized!");
|
||||
}
|
||||
@@ -104,28 +103,6 @@ void RendererCoreGS::initDrawingEnvironment() {
|
||||
TYRA_LOG("Drawing environment initialized!");
|
||||
}
|
||||
|
||||
void RendererCoreGS::setPrim() {
|
||||
prim.type = PRIM_TRIANGLE;
|
||||
prim.shading = PRIM_SHADE_GOURAUD;
|
||||
prim.mapping = DRAW_ENABLE;
|
||||
prim.fogging = DRAW_DISABLE;
|
||||
prim.blending = DRAW_ENABLE;
|
||||
prim.antialiasing = DRAW_DISABLE;
|
||||
prim.mapping_type = PRIM_MAP_ST;
|
||||
prim.colorfix = PRIM_UNFIXED;
|
||||
TYRA_LOG("Prim set!");
|
||||
}
|
||||
|
||||
void RendererCoreGS::setLod() {
|
||||
lod.calculation = LOD_USE_K;
|
||||
lod.max_level = 0;
|
||||
lod.mag_filter = LOD_MAG_NEAREST;
|
||||
lod.min_filter = LOD_MIN_NEAREST;
|
||||
lod.l = 0;
|
||||
lod.k = 0.0F;
|
||||
TYRA_LOG("Lod set!");
|
||||
}
|
||||
|
||||
qword_t* RendererCoreGS::setXYOffset(qword_t* q, const int& drawContext,
|
||||
const float& x, const float& y) {
|
||||
PACK_GIFTAG(q, GIF_SET_TAG(1, 0, 0, 0, GIF_FLG_PACKED, 1), GIF_REG_AD);
|
||||
|
||||
Reference in New Issue
Block a user