15 de noviembre de 2010

Video HD: Rotación pantalla iPad OK

Por fin, tras solventar los "pequeños problemas" con la declaración de funciones de OpenGL, puedo presentar este simple test de rotación de pantalla en iPad.

10 de noviembre de 2010

Compilado de rutina rotación iPad *** 1 FAILED ***

Adjunto el error que muestra GLBasic cuando intento compilar el test de rotacion en iPad/iPhone. Aparentemente parece un problema en la declaracion de OpenGL, aunque en Win32 el programa funciona perfecto.

 _______________________________________
*** Configuration: IPHONE ***
precompiling:
GPC - GLBasic Precompiler V.8.110 SN:5e0cd1c3 - 3D, NET
Wordcount: 231 commands
compiling:
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glGetClipPlane(DGInt, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:733: error: no matching function for call to 'DIMDATA(__GLBASIC__::DGIntArray&, int, __GLBASIC__::GLdouble [4])'
/cygdrive/Q/Compiler/platform/Include/glb.h:803: note: candidates are: void __GLBASIC__::DIMDATA(__GLBASIC__::DGIntArray&, int, DGInt*)
/cygdrive/Q/Compiler/platform/Include/glb.h:805: note:  void __GLBASIC__::DIMDATA(__GLBASIC__::DGNatArray&, int, DGNat*)
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glLoadMatrixd(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:1741: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glLoadMatrixd(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glMultMatrixd(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:1796: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glMultMatrixd(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glVertex2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:2691: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glVertex2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glVertex3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:2771: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glVertex2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glVertex4dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:2851: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glVertex2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glNormal3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:3091: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glNormal3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glIndexdv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:3347: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glIndexdv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glColor3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:3955: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glColor3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord1dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4723: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord1dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4803: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4883: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord4dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4963: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord4dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRasterPos2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5427: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRasterPos2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRasterPos3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5507: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRasterPos3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRasterPos4dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5587: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRasterPos4dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRectdv(__GLBASIC__::DGIntArray&, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5795: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRectdv(const __GLBASIC__::GLdouble*, const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexGendv(DGInt, DGInt, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:6889: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '3' to 'void glTexGendv(__GLBASIC__::GLenum, __GLBASIC__::GLenum, const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glGetTexGendv(DGInt, DGInt, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:6955: error: cannot convert 'DGInt*' to '__GLBASIC__::GLdouble*' for argument '3' to 'void glGetTexGendv(__GLBASIC__::GLenum, __GLBASIC__::GLenum, __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glEvalCoord1dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:7369: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glEvalCoord1dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glEvalCoord2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:7481: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glEvalCoord2dv(const __GLBASIC__::GLdouble*)'

*** FATAL ERROR - Please post this output in the forum
_______________________________________
*** Finished ***
Elapsed: 5.3 sec. Time: 23:01
Build: 0 succeeded.
*** 1 FAILED ***

El enlace que he abierto en el foro para comentar el problema.

Video HD: Test rotación pantalla OpenGL para iPad

Sencillo vídeo en el que se pone a prueba la rotación de pantalla a 180º.

Mi código/muestra es una modificación de la fuente publicada por millerszone (KidNovak) en este hilo del foro GLB.

9 de noviembre de 2010

Fix-It, manifiesto de reparación...

Conocido sobreotodo por gente que utiliza equipos Apple, Fix-It es un referente en lo que a auto-reparaciones de ordenadores y hardware se refiere...

Esta mañana he recibido un correo en el que esta gente notifican el inicio de una nueva campaña en la que la intención es poner de manifiesto la importancia de las reparaciones de hardware... para ello promueven imprimir el póster que se puede encontrar aquí y enviarles una foto donde se muestre dónde se ha expuesto.


En el póster se pueden leer puntos como: "reparar es mejor que reciclar", "reparar salva el planeta", "reparar ahorra dinero" y "reparando aprendes ingeniería", entre otras.

Curiosa iniciativa, cuanto menos.

ACTUALIZADO: Kyle de Fix-It, me envía el enlace de la traducción del poster a otros idiomas.

2 de noviembre de 2010

Pruebas de rendimiento en iPad

Leo en el foro de GLBasic bastantes comentarios acerca del rendimiento de GLBasic en iPad, sobretodo cuando aplicamos un fondo o se trabaja en exceso con el comando DRAWSPRITE entre otros que afectan al buffer de pantalla.

En este hilo se comentan diversas opciones para mejorar el comando CLEARSCREEN y así optimizar el rendimiento del juego.



En mis pruebas el resultado del render SIN aplicar aún el nuevo comando es de unos 19-20 FPS dibujando en bucle lo siguiente:

1- Fondo de pantalla completo (1024x768x133) con un fichero PNG de 256 colores.

2- Un tablero de 15x15 tiles de 32x32 pixels, PNG de 256 colores.

3- Tres bloques de 240x240 pixels, PNG de 256 colores.

4- El tile correspondiente al dado de 60x60 pixels, PNG de 256 colores.

5- Los textos del bloque del dado, también PNG de 256 colores.

6- Las líneas de texto "debug" en blanco.


Para mi entender no está nada mal, aunque sería preferible los 45-60 FPS que se pueden conseguir en un iPhone. Seguiré haciendo pruebas, sobre todo ahora que hay la nueva actualización del lenguaje.

1 de noviembre de 2010

Actuación GLBasic "especial" iPad 8.148

Aparece como "regalo" para Halloween una nueva actualización bastante importante de GLBasic.

En esta ocasión el update modifica un comando, entre otros, dedicado al modo de trabajo del doble buffer de pantalla.

Se trata de CLEARSCREEN, que ahora incluye una nueva opción aún no documentada en el Help. La sintaxis CLEARSCREEN -1 permite mantener el fondo de pantalla como estaba, sin borrarlo con ningún color. Esto permite que nuestro juego pueda funcionar más rápido aún, combinando con LOADBMP y SHOWSCREEN la presentación en pantalla de fondos.

Hay que destacar también otro comando que también añade un parámetro muy bueno; se trata de PRINT, que ahora permite kerning de texto (la separación entre letras).

Definitivamente un upgrade imprescindible. A probarlo!

(fichero log_e.gbas)
// 8.148
// Compiler:
//    Later declared TYPEs cause no more warning.
//    Member functions returning a type work now.
//    LOCAL a[] AS double // works now -> the array was dropped before.
//    BREAK/CONTINUE work inside REPEAT...UNTIL.
//
// Core:
//    Better error messages with GETLASTERROR$ in:
//       LOAD... and OPENFILE
//
//    CLEARSCREEN -1 -> does not clear the backbuffer
//    on SHOWSCREEN. (Faster if you take care of that).
//
//    SHOWSCREEN: Z-Buffer only gets cleared if X_MAKED was used.
//
// iPhone:
//    using GL_EXT_BGRA on iOS 3.x and higher -> slightly faster
//    LOADSPRITE, SAVESPRITE, GRABSPPRITE and USEASBMP.
//
// Pandora:
//    using OpenGL|ES now. Run! Run!
//
// Commands:
//    PRINT supports font kerning with an additional parameter.
//    SPLITSTR can keep empty tokens now.
//
// Editor:
//    Functions within types are coloured keywords now.
//    Replace in selection yields some feedback what it did.
//    iPhone XCode directory will no longer overwrite project
//    and plist files.

Nota: Muchos de estos avances han sido gracias a la inestimable ayuda y colaboración desinteresada de los participantes de Foro de GLB. Seguid así.