Jugando con OgreODE

Ya hace un rato empecé a desarrollar un jueguito pedorro de autos con la intensión de aprender a usar Ogre. Al principio pensaba no usar un motor de física hasta que me di cuenta que no me daba :P, por lo que empecé a evaluar opciones.

Sin lugar a dudas la mejor opción que encontré Ageia pero no es libre y no hay SDK para Linux (que es lo que buscaba) por lo que recaí en ODE, mediante OgreODE, que todavía no me convence.

Para empezar tiene problemas con Heighmaps : si usamos un mapa con mucha resolución hace agua en la simulación y si usamos uno de baja resolución anda bien, pero el mapa se ve como un Family Game :). Es por eso que decidí hacer el escenario con un Mesh y modelarlo a mano todo. No es perfecto pero la simulación es bastante mejor en los cambios de altura.

El otro problema, tal vez más grave, es la falta de documentación (tanto de ODE como de OgreODE). La poca que hay es vaga y hay que andar adivinando muchas cosas, sobre todo las unidades que esperan los parámetros. Experimentando un poco sale y veré si más adelante colaboro en el Wiki para completar la documentación.

Por el lado de OgreODE tal vez lo más problemático es que se está buscando maintainer y el actual solo hace bug fixes graves pero no agrega nueva features. Por el lado bueno es que tiene mucho Prefabs: clases que encapsulan objetos comunes automatizando la creación de objetos complejos desde código o desde un XML externo. El que estoy usando es el Prefab de Vehicle que el peor problema que tiene ahora es que las curvas de torque del motor no estan bien implementadas y no anda como uno esperaría (básicamente tengo 1 solo cambio en el motor), tendré que extender las clases por mi cuenta o aportar algun parche :).

Los gráficos del demo que se ve al final del post están hechos por mi (se nota ;-)) con Blender. Nada del otro mundo solo para que se aprecie lo importante del demo que es la física. Todavía queda mucho por investigar, solo espero encontrar el tiempo.

httpv://www.youtube.com/watch?v=wTP9I7R4WjA

Visita a Corrientes

Desde el viernes por la mañana hasta el domingo por la noche estuve en la ciudad de Corrientes en una visita a una ciudad que hace mucho quería ir.

La odisea comenzó el jueves por la noche cuando zarpamos con Alan y Fede en un coche supercama (BTW, rulea) que nos dejó a eso de las 8hs en la terminal de Corrientes. de ahí fuimos directo a la casa de la Tía de Alan donde nos íbamos a hospedar.

El día estaba medio nublado así que empezamos a rezarle a toda deidad conocida para evitar la lluvia, cosa que no resultó porque nos pasamos por agua sábado y domingo, aunque eso no modificó nuestro calendario.

El primer recorrido fue el viernes donde salimos a conocer el centro, una que otra plaza y la costanera, donde comenzamos con la primer ceveza para refrescarnos en un dia medio pesadito y húmedo (eran las 11hs aproximadamente :D). Al regresar nos estaban esperando con ñoquis caceros con estofado, que estaba tan tan tan rico que no daban ganas de dejar de comer :D. Durante el almuerzo terminamos de conocer a parte de la flia de Alan, sus sobrinas, tios, primos, etc.

Por la tarde un poco de relax (es como casi todo pueblo del interior, todo el mundo duerme siesta así que mucho no hay para hacer) mirando el partido de Francia-Irlanda por el mundial de Rugby y luego una merecida siesta a fin de estar fresco para la noche. La cena del viernes fue en Kennedy Express, local de comida rápida de la tía de Alan. Si pasan por corrientes, no dejen de visitarlo que hacen unos lomitos que están muy, pero muy buenos :).

La noche correntina comenzó sobre las 12hs con unos fernet en la casa de la Tía Juana (ya la adoptamos como propia!! 🙂 para partir tipo 3 AM hacia el centro. Este horario poco habitual para los que viven en capital, me hizo volver a mi amado Cipolletti, donde también se sale tarde :). La vuelta empezó en el boliche Princesa y después fuimos a dos bares/pubs/discos más. Entre cerveza, fernet y charlas, fue una noche muy divertida.

El sábado amanecimos con olor a asado. Un pechito de cerdo a la parrilla, achuras, ensalada y como no podía faltar, una rica birra bien helada para calma la sed. Comimos, oh!, vaya juego de palabras, como cerdos :). Los preparativos ya estaban dados para el partido de Argentina en el mundial de Rugby : proyector gigante, chipancitos rellenos de muzzarella, torta de chocolate y dulce de leche, cafe y mucha gente :). Los Pumas arrasaron a un equipo débil, pero eso hizo más divertido el espectáculo ;).

Por la noche otra vez la rutina : birra, fernet, varios pubs para terminar en Posta Madero un boliche muy copado donde nos divertimos. Me quedó solo bastante rápido, ya que mis amigos ya habían conquistado uno que otro corazón 😛 y mi noche de suerte había sido el viernes, por lo que a las 7 ya me había ido a dormir. Con poco sueño y con una tarea pendiente me termine despertando a las 11:30 y a las 12:15 estaba mirando TV aburrido (mis amigos dormían, se habían acostado apenas hacía un par de horas). Fue en ese momento que dije : bien, no llueve, vamos a conocer Chaco.

Desde el primer día cuando vi el puente que une Chaco y Corrientes me agarraron ganas de cruzarlo corriendo, es por eso que me puse los cortos, arme la lista de temas en el ipod y me mande por la avenida directo al puente y de ahí hasta Chacho (el recorrido completo en el mapa al final). La idea fue bastante tranca, sobre el puente tuve viento a favor lo que facilitó mucho la subida. La vuelta fue mucho más complicada. Había ráfagas muy fuertes de viento en contra por lo que tuve que hacer un poco de footing en algunas partes para poder avanzar.

Una vez pasada la parte crítica del puente volví al trote hasta el punto de inicio. Según Google Maps habré hecho unos 8km entre ida y vuelta, aunque a mi me parecieron como 50 :D. Debe haber sido el viento en contra. Me resulto gracioso ver a la gente que me miraba raro y no era para menos. Estaba en shorts, remera, corriendo sobre un puente con un viento bastante fuerte y con unos 15 grados máximo de temperatura :D.

El domingo tambi´n paseamos un rato largo, almorzamos en la costanera y luego a la noche emprendimos el viaje de vuelta para Capital. Ahora a volver en verano para disfrutar del sol, la playa, el río, y sobre todo, de las correntinas ;).

UPDATE

Ya subí las fotos acá. Como se ve, tambión visitamos un zoológico de animales abandonados.

WCG 2007

Hoy se realizó la WCG 2007 organizada por mis amigos de 3DG y patrocinada por Samsung, en una competencia de todo el día de Warcraft III donde 16 players se batieron a duelo 1vs1 durante más de 6 hs.

El evento comenzó alrededor de las 11 hs donde se hizo la presentación de los jugadores y sorteos de las partidas dando comienzo el primer match a eso de las 12hs.

Cuando el hambre atacó a la genta apareció el Sushi (y pizza para los inadaptados como yo), en cantidades que parecían casi ilimitadas :). Pero no terminó ahí. Estos eventos son estresantes por lo que había un sector de masajes que la verdad estaba de lujo. Luego de unos 15 minutos quedabas hecho una seda. Para completar la tarde : licuados, café, chocolatada, tortas y medialunas. Hambre no pasamos :).

Ya en el final, luego de la tensión de la final un brindis con champagne, entrega de premios y los sorteos. Un evento que por suerte salió muy bien, pese a que hubo poco tiempo para organizarlo.El ganador, y acreedor de un viaje a Seattle para la final, fue Mr Tutu quién le ganó a Capoch en un partido tirante.

Este año fue especial para mi, ya que a diferencia de otros años estuve como parte del Staff colaborando para que el evento salga 10 puntos. Espero poder colaborar nuevamente en otra oportunidad ya que la pase realmente bien.

Call for Ideas

El próximo 14 estamos realizando las Jornadas 2007 del LUGFI como regalo de nuestros cinco añitos de vida. Por mi parte voy a estar dando una charla sobre Juegos bajo Linux.

Bien, ahora el mangazo. Yo tengo bastante claro que me gustaría escuchar a mi y a los de mi «clase» (es decir, adictos, de esos que pasamos varias horas por día jugando), pero me gustaría que si alguno está leyendo, me diga que tipos de juegos le interesa, o que cosas les gustaría saber si se puede, etc. En lo posible dentro del marco del FLOSS ;).

Yo mientras sigo jugando un rato 🙂

Aryentains + Caminito

Este fin de semana aproveché que vino Jorge desde Cipolletti para tachar algunas cosas de mi «TODO social» :).

La primera fue el domingo por la noche que fuimos a ver Aryentains II, donde Jean Pierre Noher, Coco Sily, Daniel Arñoz y Roly Serrano interpretan cuentos de Fontanarrosa. Una excelente obra a un precio increíble 😛 (nosotros fuimos con un 2×1 de la Rock & Pop :D, pero igual no es caro). El estilo es muy similar a los cuentos que hacen los jueves a la noche por canal 7.

Hoy lunes fue más «emotivo». Luego de 10 años de vivir en Capital y estudiar en San Telmo, hice unas cuadras más y conocí el famoso «Caminito» de La Boca :). El día acompaño con un lindo sol, clima cálido y el paseo estaba lleno de gente. Muchas casas pintadas de colores locos, algunos cuadros copados (aunque se comieron un payaso y lo que piden por un oleo es ridículo :D) y gente de todos lados que hablaban «raro».

Para completarla y ya que estabamos ahí, nos fuimos a conocer el Museo de la Pasión Boquence. Ahí me esperaba mucho más: si bien tiene data copada (aunque ambos somos de River, el fútbol es idioma universal :)), copas y boludeces histéricas, el Museo en si es 4 puntos.

Entramos a la «super» proyección 360 que «te hace sentir como un jugador adentro de la cancha» y la verdad que es bastante pedorro :D, 6 pantallas planas, 6 proyectores, sonido Dolby 5.1 y una filmación bastante trucha, pero por $5 que nos salió entrar, no es tan terrible :).

La habitación del niño

La habitaci�n del ni�oAnoche vi esta excelente película de Álex de la Iglesia, parte saga de seis películas denominada «Películas para no dormir«. Hace mucho que una película de Horror (o sería Terror en castellano?) no me hacía sobresaltar tantas veces seguidas :), no se si será que estaba muy relajado esperando algo mucho más tranca o si Álex es demasiado bueno haciendo cine :).

La peli trata de una pareja que se muda a una casa con su bebé y de pronto el protagonista empieza a escuchar voces por el intercom que tiene para escuchar si su hijo llora.

Son seis películas en total :

  • La habitación del niño, de Alex de la Iglesia
  • Adivina quién soy, de Enrique Urbizu
  • Regreso a Moira, de Mateo Gil
  • Cuento de Navidad, de Paco Plaza
  • La Culpa, de Chicho Ibañez Serrador
  • Para entrar a vivir, de Jaume Balagueró

Aunque no me fijé si ya fueron todas editadas en DVD. Muy recomendable para una noche oscura con luna nueva :).

Publicado en DVD

Finding Boost – Primera parte

Hace varios días que Matías anda pregonando lo bueno que es C++ y lo bueno que es Boost, y trata de evangelizarnos a todos en el LUGFI, donde, creo que no estoy errado, todos odiamos C++ por una u otra razón :).

Los flames en el IRC se hicieron largos, y antes de seguir opinando lo mismo que sostenía me decidí a probarlo un poquito a ver que onda. Quiero dejar en claro que mantengo mi postura. Si bien encontre en boost algunas herramientas muy útiles, no considero que C++ es «programar como se programa en boost», y C++ sigue siendo horrible :). Más fácil/lindo quedará todo con boost, pero no cambia la raíz de mi enemistad con el lenguaje base.

Para probar todo esto decidí reflotar un proyecto que hice hace muchos muchos años llamado GCP (Gazer Compiler Plus, muy original, no?), que no creo haber publicado nunca y que no verá la luz. El proyectito tenía como objetivo implementar un un algoritmo para resolución de ecuaciones utilizando notación polaca. Todo lo que está arriba es para que tenga sentido. Hay un lenguaje definido (básicamente un gwbasic recortado) que compila a un bytecode, y éste último se ejecuta en una máquina virtual de un solo registro.

Lo primero que rescato al pasar de C a C++, es obviamente el uso de la STL. Manejar una lista, una pila y los strings son mucho menos dolorosos. El primer problema que ya me disgustó fue al momento de abrir un archivo y leerlo línea a línea, debiendo utilizar la siguiente sentencia :

getline(file, line);

¿Qué tiene de malo?, que es un hack horrible, porque el método file.getline no soporta string!. Digo yo, costaba mucho tener el prototipo string file.getline() ?

Luego llegú el turno de usar boost. Lo primero que me encontré fue que necesitaba algo para castear de string a int, que no sea atoi 🙂 y encontré boost::lexical_cast, un template muy cómodo y que tira una hermosa exception cuando algo falla para poder manejar el error con un try/catch. Un mini ejemplo :

    int tmp = boost::lexical_cast("125");

El siguiente paso fue reemplazar mi string tokenizer por algo más copado, así que decidí usar boost::tokenizer, y fue mi primer pared. Lo que yo estaba usando era lo siguiente, sacado de la documentación oficial :

    tokenizer tok(line) ;

Claro que todo lo que reluce no es oro, por lo que eso no anduvo. La razón es que al parecer alguien dentro de boost dijo : «separemos por espacios por default, y borremos todo lo que no sea alfanumérico». Lo que yo tenía que separar era algo como «let y = y + 1», por lo que mi signo igual desaparecía mágicamente, lo que tarde como media hora en darme cuenta y recurrí a matias en busca de ayuda. El truco estaba en definir tu propio tokenizer que haga lo que vos quieras, de la siguiente manera :

   typedef tokenizer< char_separator > MyTokenizer;
   MyTokenizer tok(line, char_separator(" "));
   MyTokenizer::iterator token;

Yo seguiré insistiendo que es un comportamiento no esperado para un tokenizer default :), más aún si en la documentación no lo aclaran. Otro problema que encontré, que no me gustó nada, es que me desayuné que los amigos de C++/boost hacen assert y te hacen explotar el programa de onda ;). La «excusa» de matias es que «esa condición es un bug y deberías arreglarlo», en lo que estoy en parte de acuerdo. Pero explotar mi programa no va a hacer que lo arregle más rápido :). La política de manejo de errores «irrecuperables» (en este caso era incrementar un iterador pasado su fin) no es de mi agrado, prefiero sacrificar esa «performance» extra de C++ por la libertad de mi C# de hacer las cosas como a mi me gustan :).

Para la salida con formato estuve usando boost::format, y la verdad que printf no tiene nada que envidiarle. La innecesaria utilización del operador «%» como separador de los parámetros en lugar de una simple coma, es algo que no entiendo. Me hace pensar lo mismo que cuando lei sobre Nullable Types en C#, que utilizan una sintaxis confusa como «int? a;».

Y hasta ahí llego mi aventura por el momento. Para completar el post de mis algoritmos me estarán faltando hacer dos cosas :

  • Reemplazar las funciones con ifs/switchs por unos std::map para mapear los códigos de instrucción
  • Cambiar el array de la tabla de memoria interna por boost::bimap para tener un mapa en dos direcciones, útil poder buscar direcciones de memoria de un símbolo o el símbolo en una dirección de memoria de una manera bonita (y según matias, optimizada ;))
  • Ver boost::spirit, que se supone que puedo definir un parser loco para mi lenguaje y no tener que hacerlo a mano como lo quise hacer yo (que como dije antes, la gracia del proyecto era hacerlo a mano). Lo voy a mirar solamente de curioso que soy.

En lo que llevo de esta experiencia no va mejorando mucho la forma de pensar. Seguramente con bimap levante un par de puntos, pero no creo que mucho más :). El último dato de la noche :

   -rwxr-xr-x 1 gazer gazer 121K jul 27 02:13 ../cpp/gcp
   -rwxr-xr-x 1 gazer gazer  18K jul 27 02:12 gcp

El primero es en C++ (no esta completo el programa, hay cosas que no hace todavía), el segundo en C. Ambos con gcc 4.1.2, -O2, y pasandole un strip por las dudas 🙂 …. Siento que tengo 103kb desperdiciados :D.

Transformers

transformers_conceptual_designs_36.jpgAyer aproveche que estaba al dope en Córdoba y me fui al cine a ver la película de los Transformers (que en el interior estrenó antes que en Capital Federal).

La película es simplemente espectacular :), o por lo menos a mi me dejó con todo lo que esperaba ver : mucha acción; autos increíbles; efectos y detalles impresionantes (las transformaciones dan gusto) y una historia introductoria entretenida.

Por suerte el final da para hacer otra, y espero que se copen y la hagan, ya que tengo ganas de ver otra más :D.

El nuevo Camaro Concept que eligieron para Bumblebee es simplemente espectacular y sería lindo poder comprarlo :P, aunque hay que ser realista y no creo que pueda pagarlo :D.

Jugando con ActionScript 3.0

Estuve jugando con esta nueva versión del lenguaje, que se basa ECMAScript, utilizado por Macromedia Flash (que se introduce en Flash Creative Suite 3 y que creo que todaía no salió al público).

Las mejoras al lenguaje se notan «cuando las papas queman» (por lo menos en las cosas que probé) y han arreglado varios de los problemas de ActionScript 2.0 que eran muy molestos. Algunos detalles :

Runtime Exceptions : Antes cuando ocurria un error en runtime (por ejemplo si llamabamos a un método que no existía) Flash simplemente pasaba de largo para evitar errores «feos» como los que pasan con JS en el browser. Claro, debbugear un problema así es muy molesto, cualquier typo pasa desapercibido. Ahora se pueden activar estos errores.

Sealed Classes : En AS 2.0, uno puede agregarle cualquier cosa a cualquier clase (al estilo de Python) en cualquier momento. Si uno quiere ahora puede «blockear» la clase para que en Runtime no se le pueda agregar nada más. Las ventajas práctica son : minimiza el consumo de memoria ya que no tiene el hash interno para soportar el «dinamismo»; y ayuda a minimizar errores boludos (ya que ahora va a tirar un Runtime Exception por lo dicho anteriormente). De todos modos, podemos usar clases totalmente dinámicas si queremos.

Method closures : Tal vez lo más importante que arreglaron :). Antes había métodos anónimos, pero al invocarlos se perdía el contexto de donde fueron creados, teniendo que guardar uno el entorno donde se ejecutaba. Si bien en AS 2.0 hay un workarround usando la clase Delegate, era molesto. Ahora hay closures de verdad.

ECMAScript for XML : AS 3.0 introduce esta nueva extensión del lenguaje para manipular XML que hablando profesionalmente, le rompe el totó a DOM 🙂 (en comodidad, el resto ni idea :P). Esto hace que uno manipule XML como si fuera un tipo nativo y a la vez es un stream.

Regular expressions : Muy útil 🙂

W3C DOM Events : El manejo de eventos se cambio por un estandar de la W3C. Todavía no vi mucho de como se usa, pero lo veo como un cambio positivo.

MTASC todavía no tiene soporte de AS3, por lo que habrá que esperar para los que quieren la solución libre.

Creo que eso destacaría por ahora. Feliz Día de la Independencia!!! … a no, eso es en el otro pais 😀