fixes to match latest libpacket2 commit
This commit is contained in:
@@ -15,8 +15,8 @@
|
|||||||
#include <sifrpc.h>
|
#include <sifrpc.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <vu.h>
|
||||||
#include "include/modules/vu1.hpp"
|
#include <dma.h>
|
||||||
#include "include/utils/debug.hpp"
|
#include "include/utils/debug.hpp"
|
||||||
|
|
||||||
// VU1 micro program
|
// VU1 micro program
|
||||||
@@ -84,7 +84,9 @@ void Engine::firePS2()
|
|||||||
{
|
{
|
||||||
SifInitRpc(0);
|
SifInitRpc(0);
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
VU1::uploadProgram(0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd);
|
dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0);
|
||||||
|
dma_channel_fast_waits(DMA_CHANNEL_VIF1);
|
||||||
|
vu_upload_program(0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd, DMA_CHANNEL_VIF1);
|
||||||
fileService.startThread();
|
fileService.startThread();
|
||||||
audio.startThread(&fileService);
|
audio.startThread(&fileService);
|
||||||
isInitialized = 0;
|
isInitialized = 0;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#include <draw_types.h>
|
#include <draw_types.h>
|
||||||
#include <draw_primitives.h>
|
#include <draw_primitives.h>
|
||||||
#include <math3d.h>
|
#include <math3d.h>
|
||||||
#include <spacket.h>
|
#include <packet2.h>
|
||||||
#include "../models/mesh.hpp"
|
#include "../models/mesh.hpp"
|
||||||
#include "../models/math/matrix.hpp"
|
#include "../models/math/matrix.hpp"
|
||||||
#include "../models/screen_settings.hpp"
|
#include "../models/screen_settings.hpp"
|
||||||
@@ -45,8 +45,8 @@ private:
|
|||||||
texel_t *st;
|
texel_t *st;
|
||||||
u8 isAnyObjectAdded;
|
u8 isAnyObjectAdded;
|
||||||
ScreenSettings *screen;
|
ScreenSettings *screen;
|
||||||
spacket_t *packets[2];
|
packet2_t *packets[2];
|
||||||
spacket_t *currentPacket;
|
packet2_t *currentPacket;
|
||||||
u8 packetsCount;
|
u8 packetsCount;
|
||||||
int packetSize;
|
int packetSize;
|
||||||
float halfScreenW, halfScreenH;
|
float halfScreenW, halfScreenH;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
#include <draw_buffers.h>
|
#include <draw_buffers.h>
|
||||||
#include <draw_primitives.h>
|
#include <draw_primitives.h>
|
||||||
#include <spacket.h>
|
#include <packet2.h>
|
||||||
#include "gif_sender.hpp"
|
#include "gif_sender.hpp"
|
||||||
#include "vif_sender.hpp"
|
#include "vif_sender.hpp"
|
||||||
#include "../models/math/plane.hpp"
|
#include "../models/math/plane.hpp"
|
||||||
@@ -118,7 +118,7 @@ private:
|
|||||||
TextureRepository textureRepo;
|
TextureRepository textureRepo;
|
||||||
GifSender *gifSender;
|
GifSender *gifSender;
|
||||||
VifSender *vifSender;
|
VifSender *vifSender;
|
||||||
spacket_t *flipPacket;
|
packet2_t *flipPacket;
|
||||||
void allocateBuffers(float t_screenW, float t_screenH);
|
void allocateBuffers(float t_screenW, float t_screenH);
|
||||||
void initDrawingEnv(float t_screenW, float t_screenH);
|
void initDrawingEnv(float t_screenW, float t_screenH);
|
||||||
void setPrim();
|
void setPrim();
|
||||||
|
|||||||
@@ -12,12 +12,12 @@
|
|||||||
#define _TYRA_VIF_SENDER_
|
#define _TYRA_VIF_SENDER_
|
||||||
|
|
||||||
#include <tamtypes.h>
|
#include <tamtypes.h>
|
||||||
|
#include <vu.h>
|
||||||
#include "../models/render_data.hpp"
|
#include "../models/render_data.hpp"
|
||||||
#include "../models/light_bulb.hpp"
|
#include "../models/light_bulb.hpp"
|
||||||
#include "../models/mesh.hpp"
|
#include "../models/mesh.hpp"
|
||||||
#include "../models/math/matrix.hpp"
|
#include "../models/math/matrix.hpp"
|
||||||
#include "../models/math/vector3.hpp"
|
#include "../models/math/vector3.hpp"
|
||||||
#include "vu1.hpp"
|
|
||||||
|
|
||||||
/** Class responsible for sending 3D objects via VIF (PATH 1) */
|
/** Class responsible for sending 3D objects via VIF (PATH 1) */
|
||||||
class VifSender
|
class VifSender
|
||||||
@@ -28,12 +28,16 @@ public:
|
|||||||
~VifSender();
|
~VifSender();
|
||||||
|
|
||||||
// TODO refactor
|
// TODO refactor
|
||||||
void drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, const Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer);
|
void drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer);
|
||||||
void sendMatrices(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation);
|
void sendMatrices(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer);
|
void setDoubleBuffer();
|
||||||
VU1 vu1; // TODO
|
void drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer);
|
||||||
|
packet2_t *packets[2] __attribute__((aligned(64)));
|
||||||
|
packet2_t *currPacket;
|
||||||
|
u8 context;
|
||||||
|
packet2_t *matricesPacket __attribute__((aligned(64)));
|
||||||
MATRIX localWorld, localScreen;
|
MATRIX localWorld, localScreen;
|
||||||
VECTOR position, rotation;
|
VECTOR position, rotation;
|
||||||
u32 vertCount;
|
u32 vertCount;
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
# ______ ____ ___
|
|
||||||
# | \/ ____| |___|
|
|
||||||
# | | | \ | |
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
# Copyright 2020, tyra - https://github.com/h4570/tyra
|
|
||||||
# Licenced under Apache License 2.0
|
|
||||||
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TYRA_VU1_
|
|
||||||
#define _TYRA_VU1_
|
|
||||||
|
|
||||||
#include "../models/math/matrix.hpp"
|
|
||||||
#include <draw_buffers.h>
|
|
||||||
#include <tamtypes.h>
|
|
||||||
#include <draw_primitives.h>
|
|
||||||
#include <spacket.h>
|
|
||||||
#include <packet.h>
|
|
||||||
#include <math3d.h>
|
|
||||||
|
|
||||||
#define V4_32 0xC
|
|
||||||
#define GS_PRIM(PRIM, IIP, TME, FGE, ABE, AA1, FST, CTXT, FIX) (u128)(((FIX << 10) | (CTXT << 9) | (FST << 8) | (AA1 << 7) | (ABE << 6) | (FGE << 5) | (TME << 4) | (IIP << 3) | (PRIM)))
|
|
||||||
#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) (((u64)(NREG) << 60) | ((u64)(FLG) << 58) | ((u64)(PRIM) << 47) | ((u64)(PRE) << 46) | (EOP << 15) | (NLOOP << 0))
|
|
||||||
|
|
||||||
/** Class responsible for managing VU1 micro programs */
|
|
||||||
class VU1
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
VU1();
|
|
||||||
~VU1();
|
|
||||||
|
|
||||||
static void uploadProgram(int t_dest, u32 *t_start, u32 *t_end);
|
|
||||||
void createList();
|
|
||||||
void sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize);
|
|
||||||
void addListBeginning();
|
|
||||||
void continueList();
|
|
||||||
void addReferenceList(void *t_data, u32 t_size, u8 t_useTops);
|
|
||||||
void addFloat(float v);
|
|
||||||
void add32(u32 v);
|
|
||||||
void add64(u64 v);
|
|
||||||
void add128(u64 v1, u64 v2);
|
|
||||||
void addListEnding();
|
|
||||||
void addStartProgram();
|
|
||||||
void addContinueProgram();
|
|
||||||
void sendList();
|
|
||||||
void addDoubleBufferSetting();
|
|
||||||
void addFlush();
|
|
||||||
|
|
||||||
spacket_t *currPacket;
|
|
||||||
|
|
||||||
private:
|
|
||||||
u32 qwordsInsertedToVU1;
|
|
||||||
u8 isDoubleBufferSet, isBuilding;
|
|
||||||
spacket_t *spackets[2] __attribute__((aligned(16)));
|
|
||||||
u8 switchPacket;
|
|
||||||
static u32 countProgramSize(u32 *t_start, u32 *t_end);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -32,16 +32,16 @@ GifSender::GifSender(u32 t_packetSize, ScreenSettings *t_screen) : screen(t_scre
|
|||||||
{
|
{
|
||||||
PRINT_LOG("Initializing GifSender");
|
PRINT_LOG("Initializing GifSender");
|
||||||
packetSize = t_packetSize;
|
packetSize = t_packetSize;
|
||||||
packets[0] = spacket_create(t_packetSize, SPACKET_NORMAL);
|
packets[0] = packet2_create_chain(t_packetSize, P2_TYPE_NORMAL, false);
|
||||||
packets[1] = spacket_create(t_packetSize, SPACKET_NORMAL);
|
packets[1] = packet2_create_chain(t_packetSize, P2_TYPE_NORMAL, false);
|
||||||
PRINT_LOG("GifSender initialized!");
|
PRINT_LOG("GifSender initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Releases packets memory */
|
/** Releases packets memory */
|
||||||
GifSender::~GifSender()
|
GifSender::~GifSender()
|
||||||
{
|
{
|
||||||
spacket_free(packets[0]);
|
packet2_free(packets[0]);
|
||||||
spacket_free(packets[1]);
|
packet2_free(packets[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----
|
// ----
|
||||||
@@ -54,38 +54,40 @@ GifSender::~GifSender()
|
|||||||
/** Send texture via GIF */
|
/** Send texture via GIF */
|
||||||
void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer)
|
void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer)
|
||||||
{
|
{
|
||||||
spacket_t *spacket = spacket_create(15, SPACKET_NORMAL);
|
packet2_t *packet2 = packet2_create_chain(15, P2_TYPE_NORMAL, false);
|
||||||
spacket_update(
|
packet2_update(
|
||||||
spacket,
|
packet2,
|
||||||
draw_texture_transfer(
|
draw_texture_transfer(
|
||||||
spacket->base,
|
packet2->base,
|
||||||
texture.getData(),
|
texture.getData(),
|
||||||
texture.getWidth(),
|
texture.getWidth(),
|
||||||
texture.getHeight(), GS_PSM_24,
|
texture.getHeight(), GS_PSM_24,
|
||||||
t_texBuffer->address,
|
t_texBuffer->address,
|
||||||
t_texBuffer->width));
|
t_texBuffer->width));
|
||||||
spacket_chain_open_cnt(spacket, 0, 0, 0, false);
|
packet2_chain_open_cnt(packet2, 0, 0, 0);
|
||||||
spacket_update(spacket, draw_texture_wrapping(spacket->next, 0, texture.getWrapSettings()));
|
packet2_update(packet2, draw_texture_wrapping(packet2->next, 0, texture.getWrapSettings()));
|
||||||
spacket_chain_close_tag(spacket);
|
packet2_chain_close_tag(packet2);
|
||||||
spacket_update(spacket, draw_texture_flush(spacket->next));
|
packet2_update(packet2, draw_texture_flush(packet2->next));
|
||||||
spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true, false);
|
dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true);
|
||||||
spacket_free(spacket);
|
dma_channel_wait(DMA_CHANNEL_GIF, 0);
|
||||||
|
packet2_free(packet2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GifSender::sendClear(zbuffer_t *t_zBuffer)
|
void GifSender::sendClear(zbuffer_t *t_zBuffer)
|
||||||
{
|
{
|
||||||
spacket_t *spacket = spacket_create(36, SPACKET_NORMAL);
|
packet2_t *packet2 = packet2_create_chain(36, P2_TYPE_NORMAL, false);
|
||||||
spacket_chain_open_end(spacket, 0, 0, false);
|
packet2_chain_open_end(packet2, 0, 0);
|
||||||
spacket_update(spacket, draw_disable_tests(spacket->next, 0, t_zBuffer));
|
packet2_update(packet2, draw_disable_tests(packet2->next, 0, t_zBuffer));
|
||||||
spacket_update(spacket, draw_clear(spacket->next, 0,
|
packet2_update(packet2, draw_clear(packet2->next, 0,
|
||||||
2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2),
|
2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2),
|
||||||
screen->width, screen->height,
|
screen->width, screen->height,
|
||||||
0x10, 0x10, 0x10));
|
0x10, 0x10, 0x10));
|
||||||
spacket_update(spacket, draw_enable_tests(spacket->next, 0, t_zBuffer));
|
packet2_update(packet2, draw_enable_tests(packet2->next, 0, t_zBuffer));
|
||||||
spacket_update(spacket, draw_finish(spacket->next));
|
packet2_update(packet2, draw_finish(packet2->next));
|
||||||
spacket_chain_close_tag(spacket);
|
packet2_chain_close_tag(packet2);
|
||||||
spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true, false);
|
dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true);
|
||||||
spacket_free(spacket);
|
dma_channel_wait(DMA_CHANNEL_GIF, 0);
|
||||||
|
packet2_free(packet2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Used in game loop.
|
/** Used in game loop.
|
||||||
@@ -94,7 +96,7 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer)
|
|||||||
void GifSender::initPacket(u8 t_context)
|
void GifSender::initPacket(u8 t_context)
|
||||||
{
|
{
|
||||||
currentPacket = packets[t_context];
|
currentPacket = packets[t_context];
|
||||||
spacket_reset(currentPacket, false);
|
packet2_reset(currentPacket, false);
|
||||||
isAnyObjectAdded = false;
|
isAnyObjectAdded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,24 +105,25 @@ void GifSender::sendPacket()
|
|||||||
{
|
{
|
||||||
if (isAnyObjectAdded)
|
if (isAnyObjectAdded)
|
||||||
{
|
{
|
||||||
spacket_chain_open_end(currentPacket, 0, 0, false);
|
packet2_chain_open_end(currentPacket, 0, 0);
|
||||||
spacket_update(currentPacket, draw_finish(currentPacket->next));
|
packet2_update(currentPacket, draw_finish(currentPacket->next));
|
||||||
spacket_chain_close_tag(currentPacket);
|
packet2_chain_close_tag(currentPacket);
|
||||||
}
|
}
|
||||||
spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true, false);
|
dma_channel_send_packet2(currentPacket, DMA_CHANNEL_GIF, true);
|
||||||
|
dma_channel_wait(DMA_CHANNEL_GIF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds clear screen to current packet */
|
/** Adds clear screen to current packet */
|
||||||
void GifSender::addClear(zbuffer_t *t_zBuffer)
|
void GifSender::addClear(zbuffer_t *t_zBuffer)
|
||||||
{
|
{
|
||||||
spacket_chain_open_cnt(currentPacket, 0, 0, 0, false);
|
packet2_chain_open_cnt(currentPacket, 0, 0, 0);
|
||||||
spacket_update(currentPacket, draw_disable_tests(currentPacket->next, 0, t_zBuffer));
|
packet2_update(currentPacket, draw_disable_tests(currentPacket->next, 0, t_zBuffer));
|
||||||
spacket_update(currentPacket, draw_clear(currentPacket->next, 0,
|
packet2_update(currentPacket, draw_clear(currentPacket->next, 0,
|
||||||
2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2),
|
2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2),
|
||||||
screen->width, screen->height,
|
screen->width, screen->height,
|
||||||
0x10, 0x10, 0x10));
|
0x10, 0x10, 0x10));
|
||||||
spacket_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer));
|
packet2_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer));
|
||||||
spacket_chain_close_tag(currentPacket);
|
packet2_chain_close_tag(currentPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds 3D objects to current packet
|
/** Adds 3D objects to current packet
|
||||||
@@ -131,10 +134,10 @@ void GifSender::addClear(zbuffer_t *t_zBuffer)
|
|||||||
*/
|
*/
|
||||||
void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer)
|
void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer)
|
||||||
{
|
{
|
||||||
spacket_chain_open_cnt(currentPacket, 0, 0, 0, false);
|
packet2_chain_open_cnt(currentPacket, 0, 0, 0);
|
||||||
spacket_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod));
|
packet2_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod));
|
||||||
spacket_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut));
|
packet2_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut));
|
||||||
spacket_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color));
|
packet2_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color));
|
||||||
xyz = new xyz_t[vertexCount];
|
xyz = new xyz_t[vertexCount];
|
||||||
rgbaq = new color_t[vertexCount];
|
rgbaq = new color_t[vertexCount];
|
||||||
st = new texel_t[vertexCount];
|
st = new texel_t[vertexCount];
|
||||||
@@ -143,8 +146,8 @@ void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCoun
|
|||||||
delete[] xyz;
|
delete[] xyz;
|
||||||
delete[] rgbaq;
|
delete[] rgbaq;
|
||||||
delete[] st;
|
delete[] st;
|
||||||
spacket_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST));
|
packet2_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST));
|
||||||
spacket_chain_close_tag(currentPacket);
|
packet2_chain_close_tag(currentPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Calculates 3D object data into xyz, rgbq, st
|
/** Calculates 3D object data into xyz, rgbq, st
|
||||||
@@ -248,9 +251,9 @@ void GifSender::addCurrentCalcs(u32 &t_vertexCount)
|
|||||||
{
|
{
|
||||||
for (u32 i = 0; i < t_vertexCount; i++)
|
for (u32 i = 0; i < t_vertexCount; i++)
|
||||||
{
|
{
|
||||||
spacket_add_u64(currentPacket, rgbaq[i].rgbaq);
|
packet2_add_u64(currentPacket, rgbaq[i].rgbaq);
|
||||||
spacket_add_u64(currentPacket, st[i].uv);
|
packet2_add_u64(currentPacket, st[i].uv);
|
||||||
spacket_add_u64(currentPacket, xyz[i].xyz);
|
packet2_add_u64(currentPacket, xyz[i].xyz);
|
||||||
}
|
}
|
||||||
spacket_align_to_qw(currentPacket);
|
packet2_align_to_qword(currentPacket);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ Renderer::Renderer(u32 t_packetSize, ScreenSettings *t_screen)
|
|||||||
isVSyncEnabled = true;
|
isVSyncEnabled = true;
|
||||||
isFrameEmpty = false;
|
isFrameEmpty = false;
|
||||||
lastTextureId = 0;
|
lastTextureId = 0;
|
||||||
flipPacket = spacket_create(4, SPACKET_UNCACHED_ACCL);
|
flipPacket = packet2_create_normal(4, P2_TYPE_UNCACHED_ACCL);
|
||||||
allocateBuffers(t_screen->width, t_screen->height);
|
allocateBuffers(t_screen->width, t_screen->height);
|
||||||
initDrawingEnv(t_screen->width, t_screen->height);
|
initDrawingEnv(t_screen->width, t_screen->height);
|
||||||
setPrim();
|
setPrim();
|
||||||
@@ -106,12 +106,13 @@ void Renderer::initDrawingEnv(float t_screenW, float t_screenH)
|
|||||||
PRINT_LOG("Initializing drawing environment");
|
PRINT_LOG("Initializing drawing environment");
|
||||||
u16 halfW = (u16)t_screenW / 2;
|
u16 halfW = (u16)t_screenW / 2;
|
||||||
u16 halfH = (u16)t_screenH / 2;
|
u16 halfH = (u16)t_screenH / 2;
|
||||||
spacket_t *spacket = spacket_create(20, SPACKET_NORMAL);
|
packet2_t *packet2 = packet2_create_normal(20, P2_TYPE_NORMAL);
|
||||||
spacket_update(spacket, draw_setup_environment(spacket->base, 0, frameBuffers, &(zBuffer)));
|
packet2_update(packet2, draw_setup_environment(packet2->base, 0, frameBuffers, &(zBuffer)));
|
||||||
spacket_update(spacket, draw_primitive_xyoffset(spacket->next, 0, (2048 - halfW), (2048 - halfH)));
|
packet2_update(packet2, draw_primitive_xyoffset(packet2->next, 0, (2048 - halfW), (2048 - halfH)));
|
||||||
spacket_update(spacket, draw_finish(spacket->next));
|
packet2_update(packet2, draw_finish(packet2->next));
|
||||||
spacket_send(spacket, DMA_CHANNEL_GIF, true);
|
dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true);
|
||||||
spacket_free(spacket);
|
dma_channel_wait(DMA_CHANNEL_GIF, 0);
|
||||||
|
packet2_free(packet2);
|
||||||
PRINT_LOG("Drawing environment initialized!");
|
PRINT_LOG("Drawing environment initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,8 +275,8 @@ void Renderer::flipBuffers()
|
|||||||
0);
|
0);
|
||||||
context ^= 1;
|
context ^= 1;
|
||||||
isFrameEmpty = 1;
|
isFrameEmpty = 1;
|
||||||
spacket_update(flipPacket, draw_framebuffer(flipPacket->base, 0, &frameBuffers[context]));
|
packet2_update(flipPacket, draw_framebuffer(flipPacket->base, 0, &frameBuffers[context]));
|
||||||
spacket_update(flipPacket, draw_finish(flipPacket->next));
|
packet2_update(flipPacket, draw_finish(flipPacket->next));
|
||||||
spacket_send(flipPacket, DMA_CHANNEL_GIF, false);
|
dma_channel_send_packet2(flipPacket, DMA_CHANNEL_GIF, true);
|
||||||
draw_wait_finish();
|
draw_wait_finish();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,10 +16,9 @@
|
|||||||
#include "../include/utils/math.hpp"
|
#include "../include/utils/math.hpp"
|
||||||
#include "../include/utils/debug.hpp"
|
#include "../include/utils/debug.hpp"
|
||||||
|
|
||||||
// Similiar set is in PS2SDK, but for VU1 we have to switch ST with RGBAQ, because VU1 must know Q before sending RGBAQ
|
|
||||||
#define DRAW_R_STQ_REGLIST ((u64)GIF_REG_ST) << 0 | ((u64)GIF_REG_RGBAQ) << 4 | ((u64)GIF_REG_XYZ2) << 8
|
|
||||||
const u32 VU1_PACKAGE_VERTS_PER_BUFF = 96; // Remember to modify buffer size in vu1 also
|
const u32 VU1_PACKAGE_VERTS_PER_BUFF = 96; // Remember to modify buffer size in vu1 also
|
||||||
const u32 VU1_PACKAGES_PER_PACKET = 6;
|
const u32 VU1_PACKAGES_PER_PACKET = 6;
|
||||||
|
const u32 VU1_PACKET_SIZE = 128;
|
||||||
|
|
||||||
// ----
|
// ----
|
||||||
// Constructors/Destructors
|
// Constructors/Destructors
|
||||||
@@ -29,12 +28,19 @@ VifSender::VifSender()
|
|||||||
{
|
{
|
||||||
PRINT_LOG("Initializing VifSender");
|
PRINT_LOG("Initializing VifSender");
|
||||||
PRINT_LOG("VifSender initialized!");
|
PRINT_LOG("VifSender initialized!");
|
||||||
|
packets[0] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true);
|
||||||
dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0);
|
packets[1] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true);
|
||||||
dma_channel_fast_waits(DMA_CHANNEL_VIF1);
|
matricesPacket = packet2_create_chain(4, P2_TYPE_NORMAL, true);
|
||||||
|
context = 0;
|
||||||
|
setDoubleBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
VifSender::~VifSender() {}
|
VifSender::~VifSender()
|
||||||
|
{
|
||||||
|
packet2_free(packets[0]);
|
||||||
|
packet2_free(packets[1]);
|
||||||
|
packet2_free(matricesPacket);
|
||||||
|
}
|
||||||
|
|
||||||
// ----
|
// ----
|
||||||
// Methods
|
// Methods
|
||||||
@@ -46,15 +52,21 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po
|
|||||||
vec3ToNative(rotation, t_rotation, 1.0F);
|
vec3ToNative(rotation, t_rotation, 1.0F);
|
||||||
create_local_world(localWorld, position, rotation);
|
create_local_world(localWorld, position, rotation);
|
||||||
create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data);
|
create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data);
|
||||||
vu1.sendSingleRefList(0, &localScreen, 8);
|
packet2_reset(matricesPacket, false);
|
||||||
|
vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0);
|
||||||
|
vu_add_end_tag(matricesPacket);
|
||||||
|
dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1);
|
||||||
|
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, const Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer)
|
void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer)
|
||||||
{
|
{
|
||||||
// we have to split 3D object into small parts, because of small memory of VU1
|
// we have to split 3D object into small parts, because of small memory of VU1
|
||||||
|
|
||||||
for (u32 i = 0; i < vertCount2;)
|
for (u32 i = 0; i < vertCount2;)
|
||||||
{
|
{
|
||||||
vu1.createList();
|
currPacket = packets[context];
|
||||||
|
packet2_reset(currPacket, false);
|
||||||
for (u8 j = 0; j < VU1_PACKAGES_PER_PACKET; j++) // how many "packages" per one packet
|
for (u8 j = 0; j < VU1_PACKAGES_PER_PACKET; j++) // how many "packages" per one packet
|
||||||
{
|
{
|
||||||
if (i != 0) // we have to go back to avoid the visual artifacts
|
if (i != 0) // we have to go back to avoid the visual artifacts
|
||||||
@@ -70,72 +82,40 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver
|
|||||||
i += (VU1_PACKAGE_VERTS_PER_BUFF - 1);
|
i += (VU1_PACKAGE_VERTS_PER_BUFF - 1);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
vu1.sendList();
|
vu_add_end_tag(currPacket);
|
||||||
|
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
|
||||||
|
dma_channel_send_packet2(currPacket, DMA_CHANNEL_VIF1, 1);
|
||||||
|
context = !context;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VifSender::setDoubleBuffer()
|
||||||
|
{
|
||||||
|
packet2_t *settings = packet2_create_chain(2, P2_TYPE_NORMAL, true);
|
||||||
|
vu_add_double_buffer_settings(settings, 8, 496);
|
||||||
|
vu_add_end_tag(settings);
|
||||||
|
dma_channel_send_packet2(settings, DMA_CHANNEL_VIF1, 1);
|
||||||
|
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
|
||||||
|
packet2_free(settings);
|
||||||
|
}
|
||||||
|
|
||||||
/** Draw using PATH1 */
|
/** Draw using PATH1 */
|
||||||
void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer)
|
void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer)
|
||||||
{
|
{
|
||||||
const u32 vertCount = t_end - t_start;
|
const u32 vertCount = t_end - t_start;
|
||||||
vu1.addListBeginning();
|
vu_open_unpack(currPacket);
|
||||||
|
|
||||||
// TODO get this via screensettings
|
// TODO get this via screensettings
|
||||||
vu1.addFloat(2048.0F); // scale
|
vu_unpack_add_float(currPacket, 2048.0F); // scale
|
||||||
vu1.addFloat(2048.0F); // scale
|
vu_unpack_add_float(currPacket, 2048.0F); // scale
|
||||||
vu1.addFloat(((float)0xFFFFFF) / 32.0F); // scale
|
vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale
|
||||||
vu1.add32(vertCount); // vertex count
|
vu_unpack_add_u32(currPacket, vertCount); // vertex count
|
||||||
|
vu_unpack_add_set(currPacket, 1);
|
||||||
vu1.add128(GIF_SET_TAG(1, 0, 0, 0, GIF_FLG_PACKED, 1), GIF_REG_AD); // 1x set tag
|
vu_unpack_add_lod(currPacket, &t_mesh.lod);
|
||||||
|
vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut);
|
||||||
vu1.add128( // tex -> lod
|
vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0);
|
||||||
GS_SET_TEX1(
|
|
||||||
t_mesh.lod.calculation,
|
|
||||||
t_mesh.lod.max_level,
|
|
||||||
t_mesh.lod.mag_filter,
|
|
||||||
t_mesh.lod.min_filter,
|
|
||||||
t_mesh.lod.mipmap_select,
|
|
||||||
t_mesh.lod.l,
|
|
||||||
(int)(t_mesh.lod.k * 16.0F)),
|
|
||||||
GS_REG_TEX1);
|
|
||||||
|
|
||||||
vu1.add128( // tex -> buff + clut
|
|
||||||
GS_SET_TEX0(
|
|
||||||
textureBuffer->address >> 6,
|
|
||||||
textureBuffer->width >> 6,
|
|
||||||
textureBuffer->psm,
|
|
||||||
textureBuffer->info.width,
|
|
||||||
textureBuffer->info.height,
|
|
||||||
textureBuffer->info.components,
|
|
||||||
textureBuffer->info.function,
|
|
||||||
t_mesh.clut.address >> 6,
|
|
||||||
t_mesh.clut.psm,
|
|
||||||
t_mesh.clut.storage_mode,
|
|
||||||
t_mesh.clut.start,
|
|
||||||
t_mesh.clut.load_method),
|
|
||||||
GS_REG_TEX0);
|
|
||||||
|
|
||||||
vu1.add128(
|
|
||||||
GS_GIFTAG(
|
|
||||||
vertCount, // amount of loops
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
GS_PRIM(
|
|
||||||
t_prim->type,
|
|
||||||
t_prim->shading,
|
|
||||||
t_prim->mapping,
|
|
||||||
t_prim->fogging,
|
|
||||||
t_prim->blending,
|
|
||||||
t_prim->antialiasing,
|
|
||||||
t_prim->mapping_type,
|
|
||||||
0, // context
|
|
||||||
t_prim->colorfix),
|
|
||||||
0, // GIFTAG_PACKED
|
|
||||||
3), // STQ + RGBA + XYZ
|
|
||||||
DRAW_R_STQ_REGLIST);
|
|
||||||
|
|
||||||
for (u8 j = 0; j < 4; j++)
|
for (u8 j = 0; j < 4; j++)
|
||||||
vu1.add32(128);
|
vu_unpack_add_u32(currPacket, 128);
|
||||||
|
|
||||||
//// Clipping tests start
|
//// Clipping tests start
|
||||||
|
|
||||||
@@ -172,15 +152,14 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR
|
|||||||
// // vu1.addFloat(1.0F);
|
// // vu1.addFloat(1.0F);
|
||||||
// // vu1.addFloat(500.0F); // far
|
// // vu1.addFloat(500.0F); // far
|
||||||
|
|
||||||
vu1.addFloat(0.0F);
|
vu_unpack_add_float(currPacket, 0.0F);
|
||||||
vu1.addFloat(0.0F);
|
vu_unpack_add_float(currPacket, 0.0F);
|
||||||
vu1.addFloat(0.0F);
|
vu_unpack_add_float(currPacket, 0.0F);
|
||||||
vu1.addFloat(0.0F);
|
vu_unpack_add_float(currPacket, 0.0F);
|
||||||
|
|
||||||
//// Clipping tests end
|
//// Clipping tests end
|
||||||
|
vu_close_unpack(currPacket);
|
||||||
vu1.addListEnding();
|
vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1);
|
||||||
vu1.addReferenceList(t_vertices + t_start, 2 * vertCount, 1);
|
vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1);
|
||||||
vu1.addReferenceList(t_coordinates + t_start, 2 * vertCount, 1);
|
vu_add_start_program(currPacket, 0);
|
||||||
vu1.addStartProgram();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,226 +0,0 @@
|
|||||||
/*
|
|
||||||
# ______ ____ ___
|
|
||||||
# | \/ ____| |___|
|
|
||||||
# | | | \ | |
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
# Copyright 2020, tyra - https://github.com/h4570/tyra
|
|
||||||
# Licenced under Apache License 2.0
|
|
||||||
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../include/modules/vu1.hpp"
|
|
||||||
|
|
||||||
#include "../include/utils/debug.hpp"
|
|
||||||
#include <dma.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <kernel.h>
|
|
||||||
|
|
||||||
// ----
|
|
||||||
// Constructors/Destructors
|
|
||||||
// ----
|
|
||||||
|
|
||||||
VU1::VU1()
|
|
||||||
{
|
|
||||||
PRINT_LOG("Initializing VU1");
|
|
||||||
currPacket = 0;
|
|
||||||
switchPacket = 0;
|
|
||||||
spackets[0] = spacket_create(3072, SPACKET_NORMAL);
|
|
||||||
spackets[1] = spacket_create(3072, SPACKET_NORMAL);
|
|
||||||
PRINT_LOG("VU1 initialized!");
|
|
||||||
}
|
|
||||||
|
|
||||||
VU1::~VU1() {}
|
|
||||||
|
|
||||||
// ----
|
|
||||||
// Methods
|
|
||||||
// -
|
|
||||||
|
|
||||||
/** Create dynamic list */
|
|
||||||
void VU1::createList()
|
|
||||||
{
|
|
||||||
switchPacket = !switchPacket;
|
|
||||||
qwordsInsertedToVU1 = 0;
|
|
||||||
if (switchPacket)
|
|
||||||
currPacket = spackets[0];
|
|
||||||
else
|
|
||||||
currPacket = spackets[1];
|
|
||||||
spacket_reset(currPacket, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Add reference list and send via VIF1
|
|
||||||
* Not using TOPS register
|
|
||||||
* Similar to addReferenceList()
|
|
||||||
*/
|
|
||||||
void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize)
|
|
||||||
{
|
|
||||||
spacket_t *spacket = spacket_create(2, SPACKET_NORMAL);
|
|
||||||
spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true);
|
|
||||||
spacket_vif_stcycl(spacket, 0, 0x0101, 0);
|
|
||||||
spacket_open_unpack(spacket, V4_32, t_destAddress, 0, 0, 0, 0);
|
|
||||||
spacket_close_unpack(spacket, t_quadSize);
|
|
||||||
spacket_chain_open_end(spacket, 0, 0, true);
|
|
||||||
spacket_vif_nop(spacket, 0);
|
|
||||||
spacket_vif_nop(spacket, 0);
|
|
||||||
spacket_chain_close_tag(spacket);
|
|
||||||
spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Add list beginning, set's double buffer if not set */
|
|
||||||
void VU1::addListBeginning()
|
|
||||||
{
|
|
||||||
if (isBuilding)
|
|
||||||
PRINT_ERR("Please end current list list before adding new one!");
|
|
||||||
|
|
||||||
if (isDoubleBufferSet == 0)
|
|
||||||
addDoubleBufferSetting();
|
|
||||||
else
|
|
||||||
addFlush();
|
|
||||||
|
|
||||||
qwordsInsertedToVU1 = 0;
|
|
||||||
spacket_chain_open_cnt(currPacket, 0, 0, 0, true);
|
|
||||||
spacket_vif_stcycl(currPacket, 0, 0x0101, 0);
|
|
||||||
spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 1, 0);
|
|
||||||
isBuilding = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Add list ending and fix unpack size */
|
|
||||||
void VU1::addListEnding()
|
|
||||||
{
|
|
||||||
if (!isBuilding)
|
|
||||||
{
|
|
||||||
PRINT_ERR("Please add list beginning first. Nothing to end!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
spacket_align_to_qw(currPacket);
|
|
||||||
spacket_chain_close_tag(currPacket);
|
|
||||||
spacket_close_unpack(currPacket, qwordsInsertedToVU1 >> 4);
|
|
||||||
isBuilding = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Add list which will load data from given pointer
|
|
||||||
* A lot faster than standard list.
|
|
||||||
* @param offset offset before data in quadwords.
|
|
||||||
* @param data data pointer
|
|
||||||
* @param size in quadwords
|
|
||||||
* @param useTops when true, data will be loaded at the beginning of buffer (BASE+OFFSET)
|
|
||||||
*/
|
|
||||||
void VU1::addReferenceList(void *t_data, u32 t_size, u8 t_useTops)
|
|
||||||
{
|
|
||||||
if (isBuilding)
|
|
||||||
PRINT_ERR("Please end current list list before adding new one!");
|
|
||||||
spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1);
|
|
||||||
spacket_vif_stcycl(currPacket, 0, 0x0101, 0);
|
|
||||||
spacket_open_unpack(currPacket, V4_32, qwordsInsertedToVU1 >> 4, t_useTops, 0, 1, 0);
|
|
||||||
spacket_close_unpack(currPacket, t_size);
|
|
||||||
qwordsInsertedToVU1 += t_size * 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Start VU1 program */
|
|
||||||
void VU1::addStartProgram()
|
|
||||||
{
|
|
||||||
spacket_chain_open_cnt(currPacket, 0, 0, 0, 1);
|
|
||||||
spacket_vif_mscal(currPacket, 0, 0);
|
|
||||||
spacket_vif_flush(currPacket, 0);
|
|
||||||
spacket_chain_close_tag(currPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Continue VU1 program from "--cont" line */
|
|
||||||
void VU1::addContinueProgram()
|
|
||||||
{
|
|
||||||
spacket_chain_open_cnt(currPacket, 0, 0, 0, 1);
|
|
||||||
spacket_vif_mscnt(currPacket, 0);
|
|
||||||
spacket_vif_flush(currPacket, 0);
|
|
||||||
spacket_chain_close_tag(currPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Add end tag and send packet via VIF1 */
|
|
||||||
void VU1::sendList()
|
|
||||||
{
|
|
||||||
spacket_chain_open_end(currPacket, 0, 0, 1);
|
|
||||||
spacket_vif_nop(currPacket, 0);
|
|
||||||
spacket_vif_nop(currPacket, 0);
|
|
||||||
spacket_chain_close_tag(currPacket);
|
|
||||||
spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void VU1::addDoubleBufferSetting()
|
|
||||||
{
|
|
||||||
spacket_chain_open_cnt(currPacket, 0, 0, 0, 1);
|
|
||||||
spacket_vif_base(currPacket, 8, 0);
|
|
||||||
spacket_vif_offset(currPacket, 496, 0);
|
|
||||||
isDoubleBufferSet = 1;
|
|
||||||
spacket_chain_close_tag(currPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
void VU1::addFlush()
|
|
||||||
{
|
|
||||||
spacket_chain_open_cnt(currPacket, 0, 0, 0, 1);
|
|
||||||
spacket_vif_nop(currPacket, 0);
|
|
||||||
spacket_vif_flush(currPacket, 0);
|
|
||||||
spacket_chain_close_tag(currPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----
|
|
||||||
// List adding
|
|
||||||
// ----
|
|
||||||
|
|
||||||
void VU1::add128(u64 v1, u64 v2)
|
|
||||||
{
|
|
||||||
spacket_add_u64(currPacket, v1);
|
|
||||||
spacket_add_u64(currPacket, v2);
|
|
||||||
qwordsInsertedToVU1 += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VU1::add64(u64 v)
|
|
||||||
{
|
|
||||||
spacket_add_u64(currPacket, v);
|
|
||||||
qwordsInsertedToVU1 += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VU1::add32(u32 v)
|
|
||||||
{
|
|
||||||
spacket_add_u32(currPacket, v);
|
|
||||||
qwordsInsertedToVU1 += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VU1::addFloat(float v)
|
|
||||||
{
|
|
||||||
spacket_add_float(currPacket, v);
|
|
||||||
qwordsInsertedToVU1 += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----
|
|
||||||
// Static
|
|
||||||
// ----
|
|
||||||
|
|
||||||
/** TODO */
|
|
||||||
void VU1::uploadProgram(int t_dest, u32 *t_start, u32 *t_end)
|
|
||||||
{
|
|
||||||
// get the size of the code as we can only send 256 instructions in each MPGtag
|
|
||||||
int count = VU1::countProgramSize(t_start, t_end);
|
|
||||||
spacket_t *spacket = spacket_create(20, SPACKET_NORMAL);
|
|
||||||
|
|
||||||
while (count > 0)
|
|
||||||
{
|
|
||||||
u32 currentCount = count > 256 ? 256 : count;
|
|
||||||
spacket_ref(spacket, t_start, currentCount / 2, 0, 0, 0, 1);
|
|
||||||
spacket_vif_nop(spacket, 0);
|
|
||||||
spacket_vif_mpg(spacket, currentCount & 0xFF, t_dest, 0);
|
|
||||||
t_start += currentCount * 2;
|
|
||||||
count -= currentCount;
|
|
||||||
t_dest += currentCount;
|
|
||||||
}
|
|
||||||
spacket_chain_open_end(spacket, 0, 0, true);
|
|
||||||
spacket_vif_nop(spacket, 0);
|
|
||||||
spacket_vif_nop(spacket, 0);
|
|
||||||
spacket_chain_close_tag(spacket);
|
|
||||||
spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 VU1::countProgramSize(u32 *t_start, u32 *t_end)
|
|
||||||
{
|
|
||||||
u32 size = (t_end - t_start) / 2;
|
|
||||||
if (size & 1)
|
|
||||||
size++;
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,6 @@ EE_OBJS = \
|
|||||||
../../engine/modules/texture_repository.o \
|
../../engine/modules/texture_repository.o \
|
||||||
../../engine/modules/timer.o \
|
../../engine/modules/timer.o \
|
||||||
../../engine/modules/vif_sender.o \
|
../../engine/modules/vif_sender.o \
|
||||||
../../engine/modules/vu1.o \
|
|
||||||
../../engine/utils/math.o \
|
../../engine/utils/math.o \
|
||||||
../../engine/utils/string.o \
|
../../engine/utils/string.o \
|
||||||
../../engine/loaders/bmp_loader.o \
|
../../engine/loaders/bmp_loader.o \
|
||||||
@@ -33,7 +32,7 @@ EE_OBJS = \
|
|||||||
ari.o \
|
ari.o \
|
||||||
main.o
|
main.o
|
||||||
|
|
||||||
EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -laudsrv -lc -lstdc++
|
EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpacket2 -lvu -lpad -laudsrv -lc -lstdc++
|
||||||
EE_INCS := -I./../../engine/include $(EE_INCS)
|
EE_INCS := -I./../../engine/include $(EE_INCS)
|
||||||
EE_DVP = dvp-as
|
EE_DVP = dvp-as
|
||||||
EE_VCL = vcl
|
EE_VCL = vcl
|
||||||
|
|||||||
+11
-11
@@ -37,7 +37,7 @@ void Ari::onInit()
|
|||||||
engine->audio.loadSong("MOV-CIRC.WAV");
|
engine->audio.loadSong("MOV-CIRC.WAV");
|
||||||
adpcm = engine->audio.loadADPCM("ziobro.adpcm");
|
adpcm = engine->audio.loadADPCM("ziobro.adpcm");
|
||||||
texRepo = engine->renderer->getTextureRepository();
|
texRepo = engine->renderer->getTextureRepository();
|
||||||
|
engine->renderer->disableVSync();
|
||||||
island.loadDff("sunnyisl/", "sunnyisl", 0.1F, false);
|
island.loadDff("sunnyisl/", "sunnyisl", 0.1F, false);
|
||||||
island.rotation.x = -1.6F;
|
island.rotation.x = -1.6F;
|
||||||
island.position.set(0.0F, 10.0F, 20.0F);
|
island.position.set(0.0F, 10.0F, 20.0F);
|
||||||
@@ -49,8 +49,8 @@ void Ari::onInit()
|
|||||||
islandAddons.rotation.x = -1.6F;
|
islandAddons.rotation.x = -1.6F;
|
||||||
islandAddons.position.set(0.0F, 10.0F, 20.0F);
|
islandAddons.position.set(0.0F, 10.0F, 20.0F);
|
||||||
|
|
||||||
// skybox.loadObj("skybox/", "skybox", 100.0F, false);
|
skybox.loadObj("skybox/", "skybox", 100.0F, false);
|
||||||
// skybox.shouldBeFrustumCulled = false;
|
skybox.shouldBeFrustumCulled = false;
|
||||||
|
|
||||||
waterFloors[0].loadObj("water/", "water", 5.0F, false);
|
waterFloors[0].loadObj("water/", "water", 5.0F, false);
|
||||||
waterFloors[0].position.set(0.0F, 8.0F, 0.0F);
|
waterFloors[0].position.set(0.0F, 8.0F, 0.0F);
|
||||||
@@ -71,13 +71,13 @@ void Ari::onInit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
texRepo->addByMesh("sunnyisl/", island);
|
texRepo->addByMesh("sunnyisl/", island);
|
||||||
// texRepo->addByMesh("sunnyisl/", islandAddons);
|
texRepo->addByMesh("sunnyisl/", islandAddons);
|
||||||
|
|
||||||
// texRepo->addByMesh("skybox/", skybox);
|
texRepo->addByMesh("skybox/", skybox);
|
||||||
|
|
||||||
// texRepo->addByMesh("ari/", player.mesh);
|
texRepo->addByMesh("ari/", player.mesh);
|
||||||
|
|
||||||
// engine->audio.playSong();
|
engine->audio.playSong();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ari::initBulb()
|
void Ari::initBulb()
|
||||||
@@ -91,14 +91,14 @@ void Ari::onUpdate()
|
|||||||
if (engine->pad.isCrossClicked)
|
if (engine->pad.isCrossClicked)
|
||||||
{
|
{
|
||||||
engine->audio.loadSong("nob-else.wav");
|
engine->audio.loadSong("nob-else.wav");
|
||||||
// engine->audio.playADPCM(adpcm);
|
engine->audio.playADPCM(adpcm);
|
||||||
printf("FPS:%f\n", engine->fps);
|
printf("FPS:%f\n", engine->fps);
|
||||||
}
|
}
|
||||||
camera.update(engine->pad, player.mesh);
|
camera.update(engine->pad, player.mesh);
|
||||||
// engine->renderer->draw(skybox);
|
engine->renderer->draw(skybox);
|
||||||
engine->renderer->draw(island);
|
engine->renderer->draw(island);
|
||||||
// engine->renderer->draw(islandAddons);
|
engine->renderer->draw(islandAddons);
|
||||||
// engine->renderer->draw(player.mesh);
|
engine->renderer->draw(player.mesh);
|
||||||
for (u8 i = 0; i < WATER_TILES_COUNT; i++)
|
for (u8 i = 0; i < WATER_TILES_COUNT; i++)
|
||||||
engine->renderer->drawByPath3(waterFloors[i]);
|
engine->renderer->drawByPath3(waterFloors[i]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,16 +22,16 @@
|
|||||||
|
|
||||||
Player::Player()
|
Player::Player()
|
||||||
{
|
{
|
||||||
// PRINT_LOG("Creating player object");
|
PRINT_LOG("Creating player object");
|
||||||
// this->gravity = 0.1F;
|
this->gravity = 0.1F;
|
||||||
// this->lift = -1.0F;
|
this->lift = -1.0F;
|
||||||
// this->mesh.loadMD2("ari/", "ari", 0.0001F, true);
|
this->mesh.loadMD2("ari/", "ari", 0.0001F, true);
|
||||||
// this->mesh.position.set(0.0F, 10.0F, 0.0F);
|
this->mesh.position.set(0.0F, 10.0F, 0.0F);
|
||||||
// this->mesh.shouldBeBackfaceCulled = true;
|
this->mesh.shouldBeBackfaceCulled = true;
|
||||||
// this->mesh.shouldBeFrustumCulled = false;
|
this->mesh.shouldBeFrustumCulled = false;
|
||||||
// this->mesh.shouldBeLighted = true;
|
this->mesh.shouldBeLighted = true;
|
||||||
// this->mesh.setAnimSpeed(0.05F);
|
this->mesh.setAnimSpeed(0.05F);
|
||||||
// this->mesh.playAnimation(0, 1);
|
this->mesh.playAnimation(0, 1);
|
||||||
PRINT_LOG("Player object created!");
|
PRINT_LOG("Player object created!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ EE_OBJS = \
|
|||||||
../../engine/modules/texture_repository.o \
|
../../engine/modules/texture_repository.o \
|
||||||
../../engine/modules/timer.o \
|
../../engine/modules/timer.o \
|
||||||
../../engine/modules/vif_sender.o \
|
../../engine/modules/vif_sender.o \
|
||||||
../../engine/modules/vu1.o \
|
|
||||||
../../engine/utils/math.o \
|
../../engine/utils/math.o \
|
||||||
../../engine/utils/string.o \
|
../../engine/utils/string.o \
|
||||||
../../engine/loaders/bmp_loader.o \
|
../../engine/loaders/bmp_loader.o \
|
||||||
@@ -37,7 +36,7 @@ EE_OBJS = \
|
|||||||
floors.o \
|
floors.o \
|
||||||
main.o
|
main.o
|
||||||
|
|
||||||
EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -laudsrv -lc -lstdc++
|
EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -lpacket2 -lvu -laudsrv -lc -lstdc++
|
||||||
EE_INCS := -I./../../engine/include $(EE_INCS)
|
EE_INCS := -I./../../engine/include $(EE_INCS)
|
||||||
EE_DVP = dvp-as
|
EE_DVP = dvp-as
|
||||||
EE_VCL = openvcl
|
EE_VCL = openvcl
|
||||||
|
|||||||
Reference in New Issue
Block a user