jueves, noviembre 30, 2006

Irrlicht 1.2

Ha sido liberada la versión 1.2 de este motor gráfico, acompañada de la 0.6 de IrrEdit. Herramienta ésta que ha dado mucho de qué hablar en los foros de Irrlicht, ya que algunos se preguntan por qué se invierte tiempo en esto en vez de dedicarlo a mejorar el motor que en muchos aspectos aún es limitado. Por ejemplo, desde hace tiempo se viene reclamando que se diseñe (e implemente) un formato de modelos y escenarios propio con sus correspondientes exportadores apra las principales aplicacioens de modelado. Irrlicht maneja de forma nativa diversos formatos, pero ninguno de ellos del todo bien.
Me resulta curioso que esta noticia me llegó vía Gamedev.net, que no se caracteriza por su abundancia de noticias sobre software libre. Un punto a favor de Irrlicht.

lunes, noviembre 27, 2006

Mi primera aplicacion con Ogre 3d

Tenía pendiente hacer algo con este motor gráfico, para ver qué tal me iba. Invertí en eso toda la mañana de ayer domingo y nada, tal como me esperaba apenas avancé un poco empezaron las excepciones de todo tipo y tuve que dejarlo por imposible.
El gran problema que veo en el concepto de Ogre es que solamente tienes control de la aplicación cuando el motor te deja. Eso es, antes de iniciar un cuadro o al terminar el cuadro. También cuando estás haciendo entrada por cola (buffered input). Al menos eso es lo que me ha parecido en unas pocas horas de uso. Soy partidario de un enfoque radicalmente opuesto, preferiría llamar al motor solo para que se encargase de refrescar la pantalla y que el control esté en mi manos. Así sé en todo momento dónde estoy parado.
Lo cual no quita que considere a Ogre como el mejor motor LGPL que exista en la actualidad. Pero bueno, hay montones de mujeres bellísimas por ahí y ninguna es mi novia (aún), ¿qué se le va a hacer?

sábado, noviembre 25, 2006

Declarado UTUTO de interés por la Cámara de Diputados

Mis felicitaciones para Daniel, el proyecto UTUTO ha sido declarado de interés por la Honorable Cámara de Diputados de La Nación Argentina. La noticia completa aquí, en el sitio del proyecto.

viernes, noviembre 24, 2006

Blogs

Al fin mi amigo Edwin se ha decidido a meterse en esto de los blogs. Esperemos que este intento sea el definitivo.
Y hablando de eso, me han confirmado la inscripción en el premio 20Blogs, de 20minutos.es. Me he inscrito en las categorías de Mejor blog de juegos y Mejor blog latinoamericano. Por supuesto que no espero ganar nada, el año pasado blogs mejores que éste quedaron por debajo de otros que muy poco o nada tenían que ver con juegos pero que recurrieron a todo tipo de artimañas. Pero un poco de competencia nunca viene mal.

martes, noviembre 21, 2006

Código de enlace

Voy a hacer un aparte para hablar un poco sobre la herramienta que uso para generar el código de enlace entre el intérprete Lua embebido y la aplicación que lo hospeda, en este caso el server.
En mi caso utilizo Lua porque es un lenguaje muy sencillo, medio Pascal, medio C, rápido y con las funcionalidades que necesito. Ahora bien, generar el código necesario para hacer accesibles las clases de C++ a los scripts es una tarea larga, tediosa y susceptible a errores de todo tipo.
Aquí entran los generadores de código, como Swig. Sin embargo, Swig genera código para proporcionar al script Lua la definición de una clase. Si quisiéramos enviar valores, por ejemplo, de dos entidades, habría que usar algún truco extra.
Por suerte hay varias variantes en el caso de Lua, y de ellas, mi preferida es tolua++. Este programita toma un encabezado limpio con algunas directivas específicas y genera el código de enlace que no solo proporciona a Lua la estructura de la clase, sino también funciones para enviar variables al script, variables que pueden ser modificadas.
Supongamos que tenemos el siguiente código en un archivo test.h:

const int C = 10;

class test {
public:
test();
int a,b;
};

El encabezado (o package) para tolua++ sería:

$#include "test.h"

#define C = 10;

class test {
public:
test();
int a,b;
};


Que procesamos con la sintaxis siguiente:

tolua++ -n test -H test_wrap.h -o test_wrap.cpp test.h

Ahora solo necesitamos incluir el encabezado tolua++.h, amén de nuestros dos archivos generados con el código de enlace y por supuesto, enlazar la biblioteca de tolua.
Hacemos disponible la definición de la clase al intérprete Lua:

tolua_test_open(luaVM);

y para enviarle una instancia n de test al script simplemente:

tolua_pushusertype(luaVM,(void*)n,"test");
lua_setglobal(luaVM,"n"); //Aquí le decimos cómo se llamará la variable dentro del script

¿Desventajas? Que necesita linkear una biblioteca extra. Que tolua++ usa scons para compilarse y no make. Pero las ventajas superan con creces estas nimiedades.

lunes, noviembre 20, 2006

Lazo principal del server

En sus inicios el lazo principal del server era más o menos así:

while
{
chequeo de eventos (incluye entrada de paquetes)
revisar la lista de jugadores y ejecutar refrescado si no han sido tocados en 2 segundos
lo mismo para los NPCs
}

Tal esquema, en principio, no es tan malo. Bajo una situación de 1700 entidades NPC consumía un 15-30% de CPU como ya mencioné en una anotación anterior. Sin embargo, una solución más óptima y sencilla de implementear es la siguiente:

while
{
chequeo de eventos (incluye entrada de paquetes)
revisar la lista de jugadores y ejecutar refrescado si no han sido tocados en 2 segundos
revisar solo un NPC e incrementar el iterator para la proxima vuelta del lazo
}

En este caso sólo se verifica/ejecuta una entidad por cada iteración del ciclo principal. La única preocupación es que el servidor pueda garantizar que todas las entidades (NPCs o jugadores) se reciban su refrescado cada dos segundos o cualquiera que sea el intervalo.
Sin embargo, no he podido hacer los mismo para el procesado de jugadores. Aquí la solución no es tan sencilla, ya que en un inicio la lista de jugadores está vacía, situación que podría repetirse más adelante si todos los jugadores se desconectan. Por tanto se requieren algunas verificaciones que aún no me he molestado en elucubrar para evitar iterar una lista vacía y explotar el server. De todas formas, el uso de listas y vectores de STL tendrá que ser descartado más adelante en favor de quadtrees por una razón que explicaré luego.
Se admiten opiniones y sugerencias acerca de cómo optimizar aún más el lazo.

sábado, noviembre 18, 2006

Propuesta

Esto ni yo mismo me lo creo. Una amiga me ha propuesto escribir un guión para una serie de televisión, cosa que por supuesto nunca he hecho ni tengo idea de cómo se hace. La serie sería un anime en 3D, producida en unos estudios que se están formando en Holguín, cerca (relativamente) de aquí. Las únicas condiciones son que sea algo fantástico pero sin caer en lo de siempre. En un principio se pedía que fuera ambientada en las civilizaciones precolombinas o algo así, que se apartara de la visión americana/europea/japonesa pero luego de romperme la cabeza decidí que me era mucho más fácil encontrar una idea original en un mundo creado por mí que lograr hacer encajar una historia fantástica en la era de los aztecas. Tampoco es que las ideas originales estén a patadas por ahí, pero ya veré cómo me las agencio. Eso en caso de que logre salir adelante con esta locura.
Y siguiendo esta misma línea, estén atentos proque pronto tendré una sorpresa por aquí.

viernes, noviembre 17, 2006

SCOURGE 0.16

Desde ayer estaba en Happypenguin, pero recién hoy es que veo el anuncio oficial en el sitio. Ya tenemos la 0.16 de este juego, con las mejoras y ampliaciones de rigor.

SWIG 1.3.30

Ha sido liberada la versión 1.3.30 (rama de desarrollo) de SWIG, una herramienta de desarrollo que genera a partir de un fichero de encabezado de C/C++ el código necesario para hacer que funciones y variables de C/C++ estén disponibles en otros lenguajes.
Nuevo en esta versión: soporte para un nuevo lenguaje, R; soporte para Python 2.5; soporte para directores en C# y otras muchas cosas.

miércoles, noviembre 15, 2006

Double Fusion y Rebellion llevan la publicidad a los juegos

Pues mucho había tardado en llegar, pero ya lo tenemos. Recuerdo que hace un año aproximadamente Funcom realizó una encuesta para estudiar el grado de aceptación por parte de los usuarios de publicidad dentro de Anarchy Online.
Según este artículo de Gamasutra, Double Fusion se ha asociado con la compañía Rival Interactive con base en Virginia y Rebellion del Reino Unido para colocar ingame ads en PRISM, un juego creado para la Guardia Nacional por estos dos desarrolladores. Las opciones son variadas, incluyendo objetos 3D interactivos, videos, ads interactivos con posibilidad de compra en tiempo real.
Es cuestión de tiempo apra que en medio de cualquier juego nos interrumpa un mercader vendiéndonos, además de armaduras y espadas, objetos y servicios del mundo real.

martes, noviembre 14, 2006

Transparencias

Al fin logré solucionar el problema con el blend de OpenGL. Antes el último color utilizado se mezclaba con la textura e incluso rellenaba las áreas que supuestamente debían ser transparentes. La solución es simple: solo tenía que habilitar blend con glEnable(GL_BLEND) pero no definir ninguna función de mezclado. No sé si será la forma correcta pero al menos me funciona.
Aún me quedan por resolver dos problemas muy enojosos, el renderizado de fuentes y una falla de segmentación al crear texturas a partir de una SDL_Surface, que por alguna razón sólo se produce cuando compilo con VC o gcc 4. En gcc 3 el siguiente código:

tmp=IMG_Load("default/dialog_back.png");
glBindTexture(GL_TEXTURE_2D, dialog_back); // 2d texture (x and y size)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tmp->w, tmp->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmp->pixels);


produce una caída total del la aplicación en glTexImage2D.
Para las fuentes estoy intentando usar SDL_ttf y cachear el texto en una textura, pero no he logrado resultados por el momento.

lunes, noviembre 13, 2006

De regreso de las vacaciones

Por desgracia los días de vagancia terminaron. Tuve algunas jornadas de trabajo bastante provechosas, principalmente en el server. He concluido un sistema básico de scripting usando lua y tolua++ para generar el código de enlace entre C++ y el intérprete incrustado. Incluso hice algunas pruebas de carga con 1700 entidades, cada una ejecutando un script con un ciclo y operaciones matemáticas. Antes de optimizar utilizaba entre un 15 y un 30% del CPU. Luego de la optimización bajó bastante, solo me preocupa que con demasiadas entidades y jugadores el server no pueda garantizar que cada una sea atendida cada 2 segundos. Lo que aún no he podido optimizar es el procesado de los jugadores.
También encontré un problema en el código de login, pero persiste otro que ocasiona que las cadenas se envíen con caracteres extra y por lo tanto el server rechaza la solicitud de login.

martes, noviembre 07, 2006

XFCE 4.4 RC2

Hago un alto en mis vacaciones para informarme un p0oco de cómo va el mundo y me encuentro que ayer se liberó el segundo RC de XFCE 4.4, acompañado de libexo 0.3.1.12 rc2 y Thunar 0.5. Pueden consultar el changelog aquí. Los afortunados usuarios de Slackware y Suse ya pueden disfrutar de los correspondientes paquetes.