but when i compile it into a prx..and load it in vsh mode by a module loader....
the background animate shows normally.
and sceUtilityOskInitStart() successfully load..
but i cant see the osk keyboard...
if I turn off the psp now... I could see the osk keyboard flash up while the
XMB shutting down...
here is the code
main.c
Code: Select all
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <psprtc.h>
#include <pspgu.h>
#include <psputils.h>
#include <pspmath.h>
#include <string.h>
#include <psputility_osk.h>
PSP_MODULE_INFO("pspmath_demo", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_VFPU);
typedef struct {
	unsigned int c;
	float x, y, z;
} CVertex;
u32 __attribute__((aligned(16))) list[1024];
CVertex __attribute__((aligned(16))) stars[1000];
ScePspFMatrix4 projection3d, view, model;
ScePspQuatMatrix qcam, qa, qb;
int running = 1;
int exitCallback(int arg1, int arg2, void *common)
{
	running = 0;
	return 0;
}
int callbackThread(SceSize args, void *argp)
{
	int cbid;
	cbid = sceKernelCreateCallback("Exit Callback", exitCallback, NULL);
	sceKernelRegisterExitCallback(cbid);
	sceKernelSleepThreadCB();
	return 0;
}
int setupCallbacks(void)
{
	int thid = 0;
	thid = sceKernelCreateThread("callbackThread", callbackThread, 0x11, 0xFA0, 0, 0);
	if(thid >= 0)
		sceKernelStartThread(thid, 0, 0);
	return thid;
}
void initGU() {
	sceGuInit();
	sceGuStart(GU_DIRECT,list);
	sceGuDrawBuffer(GU_PSM_8888,(void *)0,512);
	sceGuDispBuffer(480,272,(void*)0x88000,512);
	sceGuOffset(2048 - (480/2),2048 - (272/2));
	sceGuViewport(2048,2048,480,272);
	sceGuScissor(0,0,480,272);
	sceGuEnable(GU_SCISSOR_TEST);
	sceGuShadeModel(GU_SMOOTH);
	sceGuDisable(GU_DEPTH_TEST);
	sceGuDisable(GU_CULL_FACE);
	sceGuDisable(GU_LIGHTING);
	sceGuDisable(GU_TEXTURE_2D);
	sceGuFinish();
	sceGuSync(0,0);
	sceDisplayWaitVblankStart();
	sceGuDisplay(1);
}
int main(int argc, char *argv[]) {
	u64 tick;
	int n;
	SceCtrlData pad;
	float t;
	
	char input[128]="";
	// vfpu has a random number generator,
	// and it needs to be seeded
	sceRtcGetCurrentTick(&tick);
	vfpu_srand((u32)tick / 10000.0f);
	//setupCallbacks();
	initGU();
	vfpu_perspective_matrix(&projection3d, 60.0f, 480.0f/272.0f, 0.5f, 1000.0f);
	vfpu_identity_matrix(&view);
	vfpu_identity_matrix(&model);
	// build a random starfield, using sphere to cartesian coordinate conversions
	// note how we use vfpu_randf here to generate random radian angles,
	// and how we use vfpu_rand_8888 to generate random colors for the stars
	for (n=0; n<1000; n++) {
		vfpu_sphere_to_cartesian(vfpu_randf(0.0f, 6.28319f), vfpu_randf(0.0f, 3.14159f), 1000.0f, (ScePspFVector4 *)&(stars[n]));
		stars[n].c = vfpu_rand_8888(160, 255);
	}
	n = 0;
	// start off with 2 random rotations for the interpolation
	vfpu_quaternion_from_euler(&qa, vfpu_randf(0.0f, 360.0f), vfpu_randf(0.0f, 360.0f), vfpu_randf(0.0f, 360.0f));
	vfpu_quaternion_ln(&qa, &qa);
	vfpu_quaternion_from_euler(&qb, vfpu_randf(0.0f, 360.0f), vfpu_randf(0.0f, 360.0f), vfpu_randf(0.0f, 360.0f));
	vfpu_quaternion_ln(&qb, &qb);
	sceCtrlSetSamplingCycle(0);
	sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
	
	   // INIT OSK 
	unsigned short intext[128]  = { 0 }; // text already in the edit box on start 
	unsigned short outtext[128] = { 0 }; // text after input 
	unsigned short desc[128]    = { 'E', 'n', 't', 'e', 'r', ' ', 'T', 'e', 'x', 't', 0 }; // description 
	SceUtilityOskData data; 
	memset(&data, 0, sizeof(data)); 
	data.language = 2; // english 
	data.lines = 1; // just one line 
	data.unk_24 = 1; // set to 1 
	data.desc = desc; 
	data.intext = intext; 
	data.outtextlength = 128; // sizeof(outtext) / sizeof(unsigned short) 
	data.outtextlimit = 50; // just allow 50 chars 
	data.outtext = (unsigned short*)outtext; 
	SceUtilityOskParams osk; 
	memset(&osk, 0, sizeof(osk)); 
	osk.size = sizeof(osk); 
	osk.language = 1; 
	osk.buttonswap = 0; //X button: 1 
	osk.unk_12 = 17; 
	osk.unk_16 = 19; //tester a 1 pour les chiffres 
	osk.unk_20 = 18; 
	osk.unk_24 = 16; 
	osk.unk_48 = 1; 
	osk.data = &data; 
	int rc = sceUtilityOskInitStart(&osk); 
	if(rc) { 
		return 0; 
	}
	while (running) {
		n++;
		// when we reach the limit of our interpolation:
		//		copy qb to qa
		//		generate a new random quaternion in qb
		//		take the log of quaternion qb
		//		reset the time counter
		if (n >= 300) {
			n = 0;
			vfpu_quaternion_copy(&qa, &qb);
			vfpu_quaternion_from_euler(&qb, vfpu_randf(0.0f, 360.0f), vfpu_randf(0.0f, 360.0f), vfpu_randf(0.0f, 360.0f));
			vfpu_quaternion_ln(&qb, &qb);
		}
		// to build the view matrix:
		//		get the interpolated quaternion in qcam
		//		take the exp of qcam
		//		build a rotation matrix from qcam, place into view matrix
		//
		// here we use the function .5 + (cos(t) * .5) for our 'time' variable
		// this gives us the smooth ease in/ease out motion you see as the demo
		// interpolates between qa and qb
		//
		// this is why we must do 300-n, as cos(0) = 1, cos(PI) = -1, we want
		// the reverse, -1 to 1
		t = n/300.0f;
		vfpu_quaternion_sample_linear(&qcam, &qa, &qb, vfpu_ease_in_out(t));
		vfpu_quaternion_exp(&qcam, &qcam);
		vfpu_quaternion_to_matrix(&qcam, &view);
		sceGuStart(GU_DIRECT, list);
		sceGuClearColor(0);
		sceGuClear(GU_COLOR_BUFFER_BIT|GU_FAST_CLEAR_BIT);
		// load our generated matrix data into the display list
		sceGuSetMatrix(GU_PROJECTION, &projection3d);
		sceGuSetMatrix(GU_VIEW, &view);
		sceGuSetMatrix(GU_MODEL, &model);
		sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF | GU_COLOR_8888 | GU_TRANSFORM_3D, 1000, 0, stars);
		sceGuFinish();
		sceGuSync(0,0);
	
		switch(sceUtilityOskGetStatus()) { 
	         case PSP_OSK_INIT : 
	            break; 
	         case PSP_OSK_VISIBLE : 
	            sceUtilityOskUpdate(2); // 2 is taken from ps2dev.org recommendation 
	            break; 
	         case PSP_OSK_QUIT : 
	            sceUtilityOskShutdownStart(); 
	            break; 
	         case PSP_OSK_FINISHED : 
	            running = 0; 
	            break; 
	         case PSP_OSK_NONE : 
	         default : 
	            break; 
	      } 
	      int i,j=0; 
	      for(i = 0; data.outtext[i]; i++) { 
	         if (data.outtext[i]!='\0' && data.outtext[i]!='\n' && data.outtext[i]!='\r'){ 
	            input[j] = data.outtext[i]; 
	            j++; 
	         } 
	      }
		sceGuSwapBuffers();
	
		//sceCtrlPeekBufferPositive(&pad, 1);
		//if (pad.Buttons & PSP_CTRL_CROSS) {
		//	break;
		//}
		sceDisplayWaitVblankStart();
	}
	sceGuTerm();
	//sceKernelExitGame();
	return 0;
}
makefile
Code: Select all
TARGET = sample
OBJS = main.o
BUILD_PRX = 1
USE_PSPSDK_LIBC = 1
INCDIR =
CFLAGS = -G0 -Wall -O2 -fno-strict-aliasing
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti 
ASFLAGS = $(CFLAGS)
LIBDIR =
LDFLAGS =
LIBS= -lpspgu -lpsprtc -lpspctrl -lpspmath
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak