Files
MinecraftConsoles/Minecraft.Client/PS3/PS3_UIController.cpp
2026-03-01 12:16:08 +08:00

200 lines
7.4 KiB
C++

#include "stdafx.h"
#include "PS3_UIController.h"
#include "Common/UI/UIController.h"
#include <cell/gcm.h>
// Temp
#include "..\Minecraft.h"
#include "..\Textures.h"
#define _ENABLEIGGY
ConsoleUIController ui;
void ConsoleUIController::init(S32 w, S32 h)
{
#ifdef _ENABLEIGGY
// Shared init
preInit(w,h);
/* Now that Iggy is ready, we need to create a set of draw
callbacks for it to use to draw things with the platform
hardware (in this case, via GCM). To do this, we're building
this tutorial with the GCM GDraw implementaton that's included
with the Iggy SDK. To get it set up, we first need to set up
its memory configuration, then we create a context, and finally
we pass that context to Iggy so it will use it to render Flash
content.
First, we need to set up the GDraw memory configuration. GDraw
needs memory areas for various types of resources (such as textures,
and vertex buffers). Some of them, such as render targets, need to be
allocated in special types of memory to get optimal performance. In this
example, we allocate everything except for the dynamic vertex buffer
memory in local video memory.
Rendertargets deserve a special mention: They need to be allocated in a
tile region for optimum performance, which places some requirements on
their alignment and size. The size you specify here must be big enough to
cover the largest rendertarget you'll ever need for one Iggy rendering
call. In our case, we render the whole screen at once, so that's the
size we pass. */
// // Set up rendertarget memory.
S32 rt_mem_size = 16*1024*1024; // 16MB of render target memory.
void *rt_mem = RenderManager.allocVRAM(rt_mem_size, CELL_GCM_TILE_ALIGN_OFFSET);
S32 rt_pitch = cellGcmGetTiledPitchSize(w * 4);
gdraw_GCM_SetRendertargetMemory(rt_mem, rt_mem_size, w, h, rt_pitch);
// Also configure a tile region for it.
RenderManager.setTileInfo(rt_mem, rt_pitch, CELL_GCM_COMPMODE_C32_2X1);
// Texture and vertex buffer memory work in a similar fashion.
S32 tex_mem_size = 24*1024*1024;
S32 vert_mem_size = 2*1024*1024;
gdraw_GCM_SetResourceMemory(GDRAW_GCM_RESOURCE_texture, 200, RenderManager.allocVRAM(tex_mem_size, 128), tex_mem_size);
gdraw_GCM_SetResourceMemory(GDRAW_GCM_RESOURCE_vertexbuffer, 1000, RenderManager.allocVRAM(vert_mem_size, 128), vert_mem_size);
// In this example, we allocate dynamic vertex buffer memory from main memory,
// which is generally faster.
S32 dyn_vert_size = 128*1024;
gdraw_GCM_SetResourceMemory(GDRAW_GCM_RESOURCE_dyn_vertexbuffer, 0, RenderManager.allocIOMem(dyn_vert_size, 128), dyn_vert_size);
// Whew! Now that the GDraw memory configuration is set up, we need to initialize
// GDraw. But first, we need to allocate yet another block of video memory for
// GDraw to store its shaders etc. in (this is the last alloc!). Unlike the
// rest of the memory configuration, the work area is reserved to GDraw and can't
// be freed or relocated afterwards without shutting GDraw and all attached Iggys
// down completely. But it's fairly small (64k as of this writing) so this shouldn't
// be much of a problem.
void *gdraw_work_mem = RenderManager.allocVRAM(GDRAW_GCM_LOCAL_WORKMEM_SIZE, 128);
/* Finally, we can actually create the GDraw GCM driver and pass it to Iggy. */
gdraw_funcs = gdraw_GCM_CreateContext(
gCellGcmCurrentContext, // The default GCM context provided by libgcm.
gdraw_work_mem, // The work area in local memory
64); // RSX Label index to use for fences
IggySetGDraw(gdraw_funcs);
// Initialize audio
// TODO: 4J Stu - Currently Iggy crashes if I have audio enabled. Disabling for now.
//IggyAudioUseDefault();
// Shared init
postInit();
#endif
}
void ConsoleUIController::render()
{
#ifdef _ENABLEIGGY
// We need to tell GDraw which surface to render to.
// This tutorial just uses the backbuffer, but for in-game
// UI usage, you might want to use another rendertarget (like
// a texture) instead.
gdraw_GCM_SetTileOrigin(RenderManager.getCurrentBackBufferSurface(), 0, 0);
renderScenes();
// Finally we're ready to display the frame. First we
// call GDraw to let it know we're done rendering, so
// it can do any finalization it needs to do. Then we
// initiate the GCM buffer-flip procedure.
gdraw_GCM_NoMoreGDrawThisFrame();
#endif
}
CustomDrawData *ConsoleUIController::setupCustomDraw(UIScene *scene, IggyCustomDrawCallbackRegion *region)
{
CustomDrawData *customDrawRegion = new CustomDrawData();
customDrawRegion->x0 = region->x0;
customDrawRegion->x1 = region->x1;
customDrawRegion->y0 = region->y0;
customDrawRegion->y1 = region->y1;
// get the correct object-to-world matrix from GDraw, and set the render state to a normal state
gdraw_GCM_BeginCustomDraw(region, customDrawRegion->mat);
setupCustomDrawGameStateAndMatrices(scene, customDrawRegion);
return customDrawRegion;
}
CustomDrawData *ConsoleUIController::calculateCustomDraw(IggyCustomDrawCallbackRegion *region)
{
CustomDrawData *customDrawRegion = new CustomDrawData();
customDrawRegion->x0 = region->x0;
customDrawRegion->x1 = region->x1;
customDrawRegion->y0 = region->y0;
customDrawRegion->y1 = region->y1;
gdraw_GCM_CalculateCustomDraw_4J(region, customDrawRegion->mat);
return customDrawRegion;
}
void ConsoleUIController::endCustomDraw(IggyCustomDrawCallbackRegion *region)
{
endCustomDrawGameStateAndMatrices();
gdraw_GCM_EndCustomDraw(region);
}
void ConsoleUIController::setTileOrigin(S32 xPos, S32 yPos)
{
gdraw_GCM_SetTileOrigin(RenderManager.getCurrentBackBufferSurface(), xPos, yPos);
}
GDrawTexture *ConsoleUIController::getSubstitutionTexture(int textureId)
{
/* Create a wrapped texture from a shader resource view.
A wrapped texture can be used to let Iggy draw using the contents of a texture
you create and manage on your own. For example, you might render to this texture,
or stream video into it. Wrapped textures take up a handle. They will never be
freed or otherwise modified by GDraw; nor will GDraw change any reference counts.
All this is up to the application. */
CellGcmTexture *tex = RenderManager.TextureGetTexture(textureId);
GDrawTexture *gdrawTex = gdraw_GCM_WrappedTextureCreate(tex);
return gdrawTex;
}
void ConsoleUIController::destroySubstitutionTexture(void *destroyCallBackData, GDrawTexture *handle)
{
/* Destroys the GDraw wrapper for a wrapped texture object. This will free up
a GDraw texture handle but not release the associated D3D texture; that is
up to you. */
gdraw_GCM_WrappedTextureDestroy(handle);
}
void ConsoleUIController::shutdown()
{
#ifdef _ENABLEIGGY
/* Destroy the GDraw context. This frees all resources, shaders etc.
allocated by GDraw. Note this is only safe to call after all
active Iggy player have been destroyed! */
gdraw_GCM_DestroyContext();
#endif
}
void ConsoleUIController::beginIggyCustomDraw4J(IggyCustomDrawCallbackRegion *region, CustomDrawData *customDrawRegion)
{
PIXBeginNamedEvent(0,"Starting Iggy custom draw\n");
PIXBeginNamedEvent(0,"Gdraw setup");
// get the correct object-to-world matrix from GDraw, and set the render state to a normal state
gdraw_GCM_BeginCustomDraw(region, customDrawRegion->mat);
PIXEndNamedEvent();
}
void ConsoleUIController::handleUnlockFullVersionCallback()
{
for(unsigned int i = 0; i < eUIGroup_COUNT; ++i)
{
ui.m_groups[i]->handleUnlockFullVersion();
}
}