200 lines
7.4 KiB
C++
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();
|
|
}
|
|
}
|
|
|