[Extensión] 3Dit, programar con Bennu 3D usando únicamente las LOCAL de Bennu 2D

Started by Windgate, February 02, 2010, 09:10:21 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Hola a todos,
aquí os dejo una utilidad, un modulo .prg que tiene un PROCESS llamado make_3dit ( )

Ese PROCESS te permite usar: file, graph, x, y, z, angle, size en Bennu 3D exactamente igual que en Bennu 2D, de forma que no tienes que preocuparte de la extraña sintaxis de Bennu 3D.

Aquí un ejemplo de un proceso que usa 3Dit y se mueve, rota, escala, avanza y cambia de gráfico (Textura) usando únicamente las variables LOCAL de Bennu:

PROCESS dummy ( )
BEGIN

make_3dit ( );
file = load_model ( "model/ogre/ogre.md2" );
graph = load_texture ( "model/ogre/ogre001.pcx" );

LOOP

// Moving test along x,y,z axis
IF ( key ( _Q ) )
x++;
ELSEIF ( key ( _E ) )
x--;
END
IF ( key ( _R ) )
y++;
ELSEIF ( key ( _F ) )
y--;
END
IF ( key ( _Z ) )
z++;
ELSEIF ( key ( _X ) )
z--;
END

// Rotation test along y axis
IF ( key ( _A ) )
angle -= 1000;
ELSEIF ( key ( _D ) )
angle += 1000;
END

// Resize test along x,y,z (uniform)
IF ( key ( _C ) )
size++;
ELSEIF ( key ( _V ) )
size--;
END

// Advance test
IF ( key ( _W ) )
advance3d ( 4 );
ELSEIF ( key ( _S ) )
advance3d ( -4 );
END

// Change texture test
IF ( key ( _1 ) )
graph = load_texture ( "model/ogre/ogre001.pcx" );
ELSEIF ( key ( _2 ) )
graph = load_texture ( "model/ogre/ogre002.pcx" );
ELSEIF ( key ( _3 ) )
graph = load_texture ( "model/ogre/ogre003.pcx" );
END

FRAME;
END
END


Y aquí puedes descargar el ejemplo, incluye todas las dll de Bennu 3D, el bgdc, bgdi, con todas las últimas versiones, un RunWin.bat con todo listo para compilar, ejecutar e incluso modificar:

DESCARGAR: http://trinit.es/DescargaDirecta/Bennu3D/3Dit/3Dit%200.0.0.zip

Así que disfrutadlo!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

grisendo

Guau! 3D fácil!! Ahora ya no tengo escusa para meterle mano al 3D!! Gracias Windgate!

Por cierto, veo que angle sólo gira en el eje Y, le podrías meter angle_x, angle_y y angle_z
para darle más posibilidad de movimiento, y size_x, size_y y size_z para estirar (aunque
igual no es muy útil de normal, pero bueno...)

Windgate

Sencillísimo añadir eso, también reutilizaré flags o xgraph para manejar los estados de animación de modelos .md2, controlando que la asignación del mismo estado no provoque un reseteo en el estado de animación, cosa que es tediosa en Bennu 3D pero que con este modulito se puede dejar 100% transparente al programador, que le parecería que está trabajando con toda la amigabilidad del jodido Bennu 2D.

Lo dicho, si gusta saco nueva versión porque ya la tengo en mente, y a ver si nos vamos pasando al 3D ya hombre, que por falta de recursos no será :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

panreyes

MATADLO A KARMAS!!! +1!!!

Mmm... pero hagas lo que hagas, ¿has pensado en como controlar la animación con las locales de bennu?

SplinterGU

wow! impresionante!

pregunta, esto trabaja sin cargar el modulo de video de bennu, cierto? sino genera conflictos entre ambos modulos, es correcto esto?

debo decir que esto es fantastico.

gracias, y te llevaste un karma... ya sin probarlo... ahora lo probare...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

Ya has pensado cómo hacer las animaciones? Has dicho algo sobre el tema que no he entendido, utilizando xgraph y flags, aunque no veo la conexión de dichas variables locales con animaciones en 3D...

Windgate

Ya tengo hecho el control de la animación, facilísimo, uso flags, es que no encuentro otra variable que tenga más relación... xgraph es un POINTER y sería más incordioso... Aunque se podría hacer un mem_alloc... En breve subo la nueva versión, dejadme cenar y tomar una cervezuela :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

wait... como es eso que no encuentras variables? tu modulo deberia ser independiente, crear sus variables y no usar las del video, es mas, no se deberia cargar el modulo de video o si este se carga no deberia usar las mismas variables...

como sea, buen trabajo, voy a ver si lo pruebo de una vez...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

En verdad eso es todo cierto xD
Pero no es un módulo en si, sino un "módulo" para Bennu hecho en Bennu! xD

grisendo

Deja de cenar y de beber cabrón!!! (con cariño)... Y saca ya nueva versión con mejoras rectales :P

Windgate

Reutilizo las LOCAL ya existentes en Bennu para evitar añadir nuevas LOCAL. No veo eficiente abusar de las LOCAL y más aún sabiendo que las que hay no tienen utilidad alguna en Bennu3D.

El módulo de video lo tengo que cargar necesariamente, Bennu3D necesita un set_mode (mod_video) para dibujar la ventana de ejecución.

¿A qué conflictos te refieres Splinter? Fíjate que file y graph toman valores que no corresponden a ningún fpg/map existente, y por tanto no dibujan nada en el buffer 2D, el resultado 3D se muestra correctamente. Esto lo afirmo porque ya hice la prueba y si dibujas en el "buffer de Bennu 2D" y en el "buffer de Bennu 3D" a la vez tienes un parpadeo incesante :D

El módulo funciona muy bien ahora mismo. Quiero subir la nueva versión con el control de animaciones, pero no sólo eso si no que además voy a intentar añadir una función gravity ( ) que con una sóla llamada se ocupe de resolver las colisiones con el mapa... A ver si lo termino para hoy porque después de un día de perros me espera una noche de perros solucionando unos asuntos diversos :(

Informaré, y gracias por los karmas, lo he enseñado a algún alumno joven y ha dicho que le gustaría trabajar el 3D así :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

mientras no se carguen graficos de la forma habitual no tendras problemas... ahora si cargas graficos de bennu, puede que en algun momento haya conflicto...

las locales graph, file, etc, de bennu se crean cuando usas alguno de los modulos de video... si no los usas esas locales no existen, entonces vos podes definir las que quieras...

como sea, cuidado, porque al tener esas variables valor, el runtime de bennu ejecuta y asume un monton de cosas, que no te haya dado problemas ahora no significa que no los de... esta no es la forma prolija de hacerlo...

por otra parte, es un modulo en C o es un modulo en PRG?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

ya veo... es un prg! estaria bueno hacerlo en C como un engine grafico...

muy ingenioso... ;)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Claro, asumo que no se utilizará load_png ni ninguna instrucción de ningún módulo de Bennu que genere maps, ya que cualquier proceso que por casualidades del destino termine con cierto valor de file y cierto valor de graph puede empezar a provocar cosas raras...

En cualquier caso, para carga de maps he creado load_texture, que los carga como texturas para Bennu3D exclusivamente. Como limitación veo que lo más problemático sería intentar combinar buffer de 2D para un menú y luego pasar a buffer 3D... Tengo por ahí un ejemplo en el que probé algo así.

¿Para tener esto en C la opción sería recompilar Bennu o se te ocurre alguna otra cosa Splinter? Ya sabes que propuse hace tiempo un "Bennu para niños" y eso va por el mismo camino :D

Bien, de momento aquí dejo la nueva versión, primero la captura:


Ahora hay gestión hipersencilla de animaciones. Basta con asignar a flags valor 0 para quieto, 1 para andar, 2 para... Consultad la documentación de Bennu3D en el directorio /doc, hay 16 estados de animación distintos en cada modelo md2.

También he añadido en beta la función gravity ( ) que gestiona con una sóla llamada las colisiones con un mapa de terreno, el código resultante con cambio de animación en gravedad apenas se nota.

Y una función load_terrain que carga en una sóla instrucción un mapa de alturas y su textura asociada, devolviendo un identificador.

El nuevo código para implementar todo esto supone 4 sencillísimas lineas de código más (En negrita no puedo ponerlas en negrita) mirad:

PROCESS dummy ( )
BEGIN

make_3dit ( ); // Makes de process compatible with 3dit, let it use local 2d Bennu variables

// Loads a model file and a texture file
file = load_model ( "model/ogre/ogre.md2" );
graph = load_texture ( "model/ogre/ogre001.pcx" );

gravity ( map , 10 );        // Note that map is a GLOBAL with the terrain map loaded with load_terrain

LOOP

// Moving test along x,y,z axis
IF ( key ( _Q ) )
x++;
ELSEIF ( key ( _E ) )
x--;
END
IF ( key ( _R ) )
y++;
ELSEIF ( key ( _F ) )
y--;
END
IF ( key ( _Z ) )
z++;
ELSEIF ( key ( _X ) )
z--;
END

// Rotation test along y axis
IF ( key ( _A ) )
angle -= 2000;
ELSEIF ( key ( _D ) )
angle += 2000;
END

// Resize test along x,y,z (uniform)
IF ( key ( _C ) )
size++;
ELSEIF ( key ( _V ) )
size--;
END

// Advance and animation test
IF ( key ( _W ) )
advance3d ( 4 );
flags = 1;
ELSEIF ( key ( _S ) )
advance3d ( -4 );
flags = 1;
ELSE
flags = 0;
END

// Change texture test
IF ( key ( _1 ) )
graph = load_texture ( "model/ogre/ogre001.pcx" );
ELSEIF ( key ( _2 ) )
graph = load_texture ( "model/ogre/ogre002.pcx" );
ELSEIF ( key ( _3 ) )
graph = load_texture ( "model/ogre/ogre003.pcx" );
END

FRAME;
END
END


DESCARGA: http://trinit.es/DescargaDirecta/Bennu3D/3Dit/3Dit%200.0.1.zip
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Juer, pues esto si que es útil, cada día simplificándonos más la vida a los ignorantes de la tercera dimensión (mira, mamá, soy un dibujo animado ;D).
Lo miraré más tranquilamente cuando tenga tiempo. Karma++.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)