Всем привет. Многие скорее всего уже забыли/продали/потеряли свою PSP, а мне захотелось покодить. Возможно свою PSP я куда-нибудь приспособлю для дальнейшего использования.
Начал кодить с gu. Разобрался с примером cube, написал свой загрузчик *.obj файлов под разные vtype флаги у sceGumDrawArray(). Тем не менее я надолго застрял с загрузкой текстур в sceGuTexImage(), где используется data не пойми какой структуры. Скорее всего это RGBA структура выровненная по 16 bytes, но все же мне не удалось из простой *.bmp правильно выгрузить текстуру. Пример:
struct COLOR
{
float r, g, b, a;
};
Image.h
#ifndef __IMAGE_H__
#define __IMAGE_H__
#include <stdlib.h>
#include <stdio.h>
#include "StructsExtended.h"
#define __attribute__(x)
class Image
{
public:
static void Read_BMP(const char* path, struct COLOR __attribute__((aligned(16)))* data, unsigned long* size);
};
void Image::Read_BMP(const char* path, struct COLOR __attribute__((aligned(16)))* data, unsigned long* size)
{
int i;
FILE* f = fopen(path, "rb");
if (f == NULL) {
return;
}
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header
// extract image height and width from header
int width = *(int*)&info[18];
int height = *(int*)&info[22];
(*size) = width * height * 3;
unsigned char* tmp_data = (unsigned char*)malloc(sizeof(unsigned char) * (*size));
fread(tmp_data, sizeof(unsigned char), (*size), f); // read the rest of the data at once
fclose(f);
//In the last part, the swap between every first and third pixel is done
// because windows stores the color values as (B, G, R) triples, not (R, G, B).
unsigned long curr_data_index = 0;
for (i = 0; i < (*size); i += 3)
{
(data + curr_data_index)->b = *(tmp_data + i);
(data + curr_data_index)->g = *(tmp_data + i + 1);
(data + curr_data_index)->r = *(tmp_data + i + 2);
curr_data_index++;
}
free(tmp_data);
}
#endif // !__IMAGE_H__
Тогда я начал копать и наткнулся на выше упомянутый graphic.h, у которого есть своя реализация загрузки картинок, что меня сильно обрадовало, но попытавшись его подключить я наткнулся на ошибки рода:
1>------ Сборка начата: проект: 3d obj loader, Конфигурация: Debug Win32 ------
1> psp-gcc -I. -ID:/PSP/pspsdk/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150 -L. -LD:/PSP/pspsdk/psp/sdk/lib morph.o d:/PSP/pspsdk/psp/sdk/samples/gu/common/callbacks.o d:/PSP/pspsdk/psp/sdk/samples/gu/common/vram.o d:/PSP/pspsdk/psp/sdk/samples/intraFont/graphics/graphics.o d:/PSP/pspsdk/psp/sdk/samples/intraFont/graphics/framebuffer.o -lpspgum -lpspgu -lpng -lpspgum -lm -lz -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -o morph.elf
1> morph.o: In function `main':
1> morph.cpp .text+0x7e0): undefined reference to `loadImage(char const*)'
1> make: *** [morph.elf] Error 1
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.MakeFile.Targets(41,5): error MSB3073: выход из команды "make" с кодом 2.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
|
Сразу говорю, что в конструкции Makefile'а я плохо разбираюсь, а так же какие libs нужно подключать и т.д., несмотря на то, что компилировать через консоль мне приходилось и что-то в этом я все же понимаю.
Программа расположена в папке d:\PSP\CodingTests\3d obj loader
PSPSDK находится в папке d:\PSP\pspsdk
Мой Makefile
TARGET = morph
OBJS = morph.o\
d:/PSP/pspsdk/psp/sdk/samples/gu/common/callbacks.o\
d:/PSP/pspsdk/psp/sdk/samples/gu/common/vram.o\
d:/PSP/pspsdk/psp/sdk/samples/intraFont/graphics/graphics.o\
d:/PSP/pspsdk/psp/sdk/samples/intraFont/graphics/framebuffer.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
LDFLAGS =
LIBS = -lpspgum -lpspgu -lpng -lpspgum -lm -lz
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = 3d obj loader
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
PS:
модель автобуса загружается отлично (
пример).