¿Un programador en esta sección?

Ofertas en PcComponentes: Top Verano y PcCom Days
Hola foro.
Si hay algun programador en esta sección, que aceptara una petición de crear un pequeño programa.

La razón por la que tanto quiero este programa es para hacer un juego con muchos zeldas que compartiré con vosotros y os iré dando detalles sobre él.


Imagen

-Ok, pues viene a ser un formato que usa la gamecube para comprimir imágenes. Se llama "BTI"
Una persona en su día (remito a la web http://www.amnoid.de/gc) creó un programa llamado "btidump" que dumpeaba imágenes bti a formato "DDS", ya haciéndolas factibles de visualizar y modificar.
Esta persona dejó escrita la estructura del formato bti, pero no llegó a hacer el proceso contrario. Convertir imágenes DDS a BTI.

-Los archivos los he sacado de el juego "Zelda Collectors edition" para más información.

Pues me gustaría que alguien tan amable me ayudara a hacer este programa que convierta imágenes dds a bti. El formato no es muy complejo pero yo no entiendo de lenguajes de programación.


Aquí os dejo 1 texto con la estructura del formato y el btidump.exe con su source sacado de esta página: http://www.amnoid.de/gc

Formato del archivo BTI.
.bti file format
================

Version 1.02

NOTE: Some .bti files are Yaz0-compressed (if the first 4 bytes are 'Yaz0'),
if this is the case, you have to uncompress them. Check out yagcd or
http://www.amnoid.de/gc/ on how to do that.

A bti file stores a single image, but can store several mipmaps. The file
starts with a TextureHeader (which is used in the TEX1 section of
bmd/bdl and jpa files to store textures as well). It looks like this:

struct TextureHeader
{
  u8 format;  //data format - seems to match tpl's format (see yagcd)
  u8 unknown;
  u16 width;
  u16 height;
 
  /*
    from gx.h:
    0: clamp to edge
    1: repeat
    2: mirror
  */
  u8 wrapS;
  u8 wrapT;

  u8 unknown3;
  u8 paletteFormat; //palette format - matches tpl palette format (-> yagcd)
  u16 paletteNumEntries;
  u32 paletteOffset; //palette data


  u32 unknown5;
  u16 unknown6; //prolly two u8s, first is 5 or 1, second 1 most of the time
  u16 unknown7; //0 most of the time, sometimes 0x10, 0x18, 0x20, 0x28
  u8 mipmapCount;
  u8 unknown8;
  u16 unknown9;

  u32 dataOffset; //image data

  //some of the unknown data could be render state?
  //(lod bias, min/mag filter, ...)
};

Offsets are relative to TextureHeader (this is important in bmd/bdl files).
Check the accompanying source code for details.



A ver si lo comprendéis el texto.

Descargar source del btidump.exe http://www.amnoid.de/gc/btidump.zip

De verdad Gracias.
Mala suerte, soy programador pero no entiendo el codigo, si por lo menos supiera el lenguaje en que ha sido programado. siento no poder ayudarte.
Es fácil tio

El lenguaje creo que es C y se trata de una estructura de datos en C llamada struct, pero no es un programa como tal es solo una pequeñisima parte del programa.

Según esto podríamos decir que se trata de una estructura de datos que contiene las texturas de cabecera (TextureHeader).
Cada una de las variables creo que son unsigned integer (llamense enteros positivos o sin signo) y luego estén en diferentes tamaños de 8, 16 y 32 bits mira esto:

u8
u16
u32

y despues de cada tipo de variable (u8, u16, u32) el nombre correspondiente como puede ser "format" o formato, width y height que creo que se refieren al tamaño y altura (no es mi fuerte el inglés).

Espero haberte solucionado la duda.
Yo programe algo parecido tiempo atras con las texturas TX del singstar, tambien utilizando la ingenieria inversa de otro programacion que hacia el proceso contrario. Asi a simple vista las imagenes no tienen ningun tipo de compresion,no? Esque si tienen compresion ya es mas lioso y aparatoso, si son solo una paleta de bits y la imagen es muy sencillo de hacer, solo tienes que crear el Header (es la estructura esa que as puesto) y colocar bien los datos de los pixeles de la imagen por si vinieran desordenados,nada mas.

Yo lo hice en C (es lo mas rapido y facil de programar), y ahora no dispongo de tiempo para nada, pero si te sirve de ayuda mirate como hice con las texturas del singstar y mira si puedes hacer lo mismo para tus texturas, lo encontraras por el foro de ps2 en algun tutorial de crear tu propio singstar.

Siento no poder hacerte el programa, pero estoy muy liado con varios programas de diversas plataformas.

Saludos!
Delian escribió:Mala suerte, soy programador pero no entiendo el codigo, si por lo menos supiera el lenguaje en que ha sido programado. siento no poder ayudarte.


bitelmaniaco escribió:Es fácil tio

El lenguaje creo que es C y se trata de una estructura de datos en C llamada TextureHeader, pero no es un programa como tal es solo una pequeñisima parte del programa.


Y decis que sois programadores? ¬_¬ xDDDDD

Yo lo podria hacer pero:
int tiempodisponible = 0;


xDDD ya lo siento. De todas formas hacer lo que quieres es como tener una ecuacion y pasar datos de un lado a otro de ella, lo que es la estructura la tienes hecha para empezar con un poco de c que sepas xD

salu2
Plata escribió:
Delian escribió:Mala suerte, soy programador pero no entiendo el codigo, si por lo menos supiera el lenguaje en que ha sido programado. siento no poder ayudarte.


bitelmaniaco escribió:Es fácil tio

El lenguaje creo que es C y se trata de una estructura de datos en C llamada TextureHeader, pero no es un programa como tal es solo una pequeñisima parte del programa.


Y decis que sois programadores? ¬_¬ xDDDDD

Yo lo podria hacer pero:
int tiempodisponible = 0;


xDDD ya lo siento. De todas formas hacer lo que quieres es como tener una ecuacion y pasar datos de un lado a otro de ella, lo que es la estructura la tienes hecha para empezar con un poco de c que sepas xD

salu2


pues chico, yo que tú no me reiría tanto, porque has metido bien el gambón...la estructura se llama textureheader, sí...

struct TextureHeader
{
u8 format; //data format - seems to match tpl's format (see yagcd)
u8 unknown;
u16 width;
u16 height;

/*
from gx.h:
0: clamp to edge
1: repeat
2: mirror
*/
u8 wrapS;
u8 wrapT;

u8 unknown3;
u8 paletteFormat; //palette format - matches tpl palette format (-> yagcd)
u16 paletteNumEntries;
u32 paletteOffset; //palette data


u32 unknown5;
u16 unknown6; //prolly two u8s, first is 5 or 1, second 1 most of the time
u16 unknown7; //0 most of the time, sometimes 0x10, 0x18, 0x20, 0x28
u8 mipmapCount;
u8 unknown8;
u16 unknown9;

u32 dataOffset; //image data

//some of the unknown data could be render state?
//(lod bias, min/mag filter, ...)
};


pero vamos, que si no sabes leer, que no pasa nada ;).

un saludo.
Plata escribió:
Delian escribió:Mala suerte, soy programador pero no entiendo el codigo, si por lo menos supiera el lenguaje en que ha sido programado. siento no poder ayudarte.


bitelmaniaco escribió:Es fácil tio

El lenguaje creo que es C y se trata de una estructura de datos en C llamada TextureHeader, pero no es un programa como tal es solo una pequeñisima parte del programa.


Y decis que sois programadores? ¬_¬ xDDDDD

Yo lo podria hacer pero:
int tiempodisponible = 0;


xDDD ya lo siento. De todas formas hacer lo que quieres es como tener una ecuacion y pasar datos de un lado a otro de ella, lo que es la estructura la tienes hecha para empezar con un poco de c que sepas xD

salu2


Epic fail

El código que aporta el primer post, corresponde a una estructura llamada TextureHeader.

Por cierto Delian, se ve claramente que es C hombre!
Yo tengo un problema parecido, pero para un juego viejo online, llamado dragon raja, las imagenes me vienen todas en archivos .dat, pero todavia estoy aprendiendo c [ayay] , asi que no puedo ni abrirlas, se que con la libreria allegro podria, pero estoy realmente perdido. si alguien me puede echar una mano y explicarme como tendria que hacerlo estaria agradecido. P.D mis conocimientos de C son de noob, vamos que he empezado con un par de libros y todavia no me entero de nada.
7 respuestas