Code: Select all
class VideoSystem {
public:
VideoSystem();
~VideoSystem();
void Initialize();
bool Loop();
void Flip();
void DrawPolygon(Eternal::Rectangle *,float r, float g, float b);
private:
pvr_poly_hdr_t hdr;
};
Eternal::VideoSystem::VideoSystem() {
}
Eternal::VideoSystem::~VideoSystem() {
}
void Eternal::VideoSystem::Initialize() {
// Set up the parameters
pvr_init_params_t init_params = {
{ PVR_BINSIZE_16, PVR_BINSIZE_0, PVR_BINSIZE_0, PVR_BINSIZE_0, PVR_BINSIZE_0 }
, 512 * 1024
};
vid_set_mode(DM_640x480,PM_RGB565);
pvr_init(&init_params);
pvr_init_defaults();
pvr_poly_cxt_t cxt;
pvr_poly_cxt_col(&cxt, PVR_LIST_OP_POLY);
pvr_poly_compile(&hdr, &cxt);
}
bool Eternal::VideoSystem::Loop() {
pvr_wait_ready();
pvr_scene_begin();
pvr_list_begin(PVR_LIST_TR_POLY);
pvr_prim(&hdr,sizeof(hdr));
return true;
}
void Eternal::VideoSystem::Flip() {
pvr_list_finish();
pvr_scene_finish();
}
void Eternal::VideoSystem::DrawPolygon(Rectangle *p, float r, float g, float b) {
pvr_vertex_t vert;
vert.flags = PVR_CMD_VERTEX;
vert.x = p->x;
vert.y = p->y + p->w;
vert.z = 1.0f;
vert.u = vert.v = 0.0f;
vert.argb = PVR_PACK_COLOR(1, r / 255, g / 255, b / 255);
vert.oargb = 0;
pvr_prim(&vert, sizeof(vert));
vert.y = p->y;
pvr_prim(&vert, sizeof(vert));
vert.x = p->x + p->w;
vert.y = p->y + p->h;
pvr_prim(&vert, sizeof(vert));
vert.flags = PVR_CMD_VERTEX_EOL;
vert.y = p->y;
pvr_prim(&vert, sizeof(vert));
}
class Sprite {
public:
Sprite();
~Sprite();
void Load(const char* filename);
void Render();
Rectangle Pos;
Rectangle Crop;
private:
pvr_ptr_t p_Texture;
kos_img_t kos_img;
unsigned int fWidth;
unsigned int fHeight;
};
Eternal::Sprite::Sprite() {
}
Eternal::Sprite::~Sprite() {
}
void Eternal::Sprite::Load(const char *filename) {
std::string f = "/cd/";
f += filename;
p_Texture = pvr_mem_malloc(kos_img.w * kos_img.h * 2);
png_to_img(f.c_str(), PNG_FULL_ALPHA, &kos_img);
pvr_txr_load_kimg( &kos_img, p_Texture, PNG_FULL_ALPHA);
Pos.w = Crop.w = kos_img.w;
Pos.h = Crop.h = kos_img.h;
fWidth = kos_img.w;
fHeight = kos_img.h;
Crop.x = Crop.y = Pos.x = Pos.y = 0;
}
void Eternal::Sprite::Render() {
pvr_vertex_t vert;
pvr_poly_cxt_t cxt;
pvr_poly_hdr_t hdr;
Rectangle *p = &Pos;
pvr_poly_cxt_txr(&cxt, PVR_LIST_TR_POLY, PVR_TXRFMT_ARGB4444, kos_img.w, kos_img.h, p_Texture, PVR_FILTER_NONE);
pvr_poly_compile(&hdr, &cxt);
pvr_prim(&hdr, sizeof(hdr));
vert.flags = PVR_CMD_VERTEX;
vert.z = p->z;
vert.x = p->x;
vert.y = p->y;
vert.u = Crop.x / fWidth;
vert.v = Crop.y / fHeight;
vert.argb = PVR_PACK_COLOR(1, 1, 1, 1);
vert.oargb = 0;
pvr_prim(&vert, sizeof(vert));
vert.x = p->x + p->w;
vert.y = p->y;
vert.u = (Crop.x + Crop.w) / fWidth;
vert.v = Crop.y / fHeight;
pvr_prim(&vert, sizeof(vert));
vert.y = p->y + p->h;
vert.x = p->x;
vert.u = Crop.x / fWidth;
vert.v = (Crop.y + Crop.h) / fHeight;
pvr_prim(&vert, sizeof(vert));
vert.flags = PVR_CMD_VERTEX_EOL;
vert.x = p->x + p->w;
vert.y = p->y + p->h;
vert.u = (Crop.x + Crop.w) / fWidth;
vert.v = (Crop.y + Crop.h) / fHeight;
pvr_prim(&vert, sizeof(vert));
}
int main(int argc,char *args[]) {
VideoSystem *VideoSystem = new VideoSystem();
Sprite spr;
spr.Load("My_texture_with_transparency.png");
while(VideoSystem->Loop()) {
// So we can see the transparent parts are black
// Draw a blue polygon in the backround
VideoSystem->DrawPolygon(0,0,640,480,0,0,255);
spr.Render();
VideoSystem->Flip();
}
return 0;
}
I tried to keep it small but also whilst getting everything relevant to KOS and PVR it seemed quite hard.
I do have some debugging stuff in as well but I've removed that to try and keep it short and to the point.
EDIT:
Okay I really screwed up with keeping it small
![Neutral :|](./images/smilies/icon_neutral.gif)