javisantana.com

Reflexiones sobre C++

Siempre me había gustado, entusiasmado diría yo, C++, su notación (probablemente porque venía de C), el que esté orientado a objetos, las excepciones, los templates, la herencia, las funciones virtuales… y mucho más después de leerme (effective c++, more effective c++ y modern c+ design). No es que me haya dejado de gustar, pero quizás es que haya abierto los ojos, me explico, el otro día en clase de Sistemas de tiempo real, estabamos dando una introducción a ADA95. En un primer momento se parecía a VHDL (un lenguaje de descripción HW) en su notación, aunque según avanzó la exposión del profesor me di cuenta de que tenía mucho más puntos en común, y lo mejor, orientados al software. ADA 95 tiene implementada concurrencia builtin, sistemas para la gestión de las contiendas, tareas, además de disponer de características propias de los lenguajes orientados a objetos, tanto las “standard” (herencia, etc), como las de facto (paquetes, operadores de rango, tipos algo más completos). La característica que más me gustó es la implementación de task, puedes tener una tarea con su código y tener ejecutando varias concurrentemente sin tener que preocuparte por threads o fork’s y lo mejor, un sistema para la sincronización muy agradable y eficaz. Quizás ADA95 por ser un lenguaje orientado al tiempo real y por tener una notación muy distinta a C puede que no sea el preferido de muchos (me incluyo) pero me parece un lenguaje bastante potente y muy apropiado para las máquinas que vienen con varios cores. En conclusión, C++ quizás se haya quedado un poco desfasado con respecto a lenguajes como C#, java, python que implementan herramientas mucho más agradecidas y manejables para el programador, aunque para mi sigue siendo el lenguaje más potente :)

En otro orden de cosas, esta mañana me sobraron un par de horas que pude invertir en perder el tiempo en internet. Entre mis búsquedas encontré algunas cosas interesantes:

- Texturas procedurales: visitando http://www.sorgonet.com/modules.php?name=News&file=article&sid=103 encontré un enlace a una página que ya conocía, pero de la cual desconocía el artículo siguiente: “texturas procedurales”
Es posible que no sepas de qué van las texturas procedurales, seguro que google te puede ayudar más que yo pero en resumen son texturas generadas mediante artefactos matemáticos. Quizás algún día ponga mi código de mi generador de texturas. Para ver algún ejemplo de texturas procedurales lo mejor es visitar páginas como esta

GLSL: si no estás muy familiarizado te preguntarás qué es esa puñeta, pues se trata d eun lenguaje que soportan ciertas tarjetas gráficas para poder realizar operaciones a medida en los render con OpenGL. Buscando un tutorial he encontrado el de lighthouse3d, (revisad la página porque tiene detallados tutoriales de opengl), que además de ser bastante buena calidad y comprensible, utiliza un Shader Designer, un programa creado por la empresa de un cyberamigo y del cual he visto su evolución. Me alegra ver como el trabajo duro tiene sus frutos.

saludos

undefined

Bueno, dos shots de la herramienta en la que estoy trabajando últimamente. La verdad es que apenas hay nada de momento debido a que he tenido que ir codeando algunas cosas referentes al ruido y otras cosas. Sin más:

![](http://www.tel.uva.es/~jsanfer/blog/terr_tool1.jpg)
`

La pena es la calidad de las imágenes que no puede ser mayor ya que el servidor donde las alojo no tengo demasiado espacio, aunque eso sí, es muy fiable ;)

`

undefined

Es tarde, sí, y mañana tengo que levantarme pronto, pero creo que este post merece la pena. En el post anterior comentaba que estaba haciendo una aplicación para generación de contenidos procedurales. Llegado un punto de la aplicación me veo en el aprieto de tener que exportar e importar un montón de variables y, la verdad, es una pesadez. Esto me recordó que hace tiempo viendo la web de chaos - componente de farbrauch - y en concreto un artículo sobre, textualmente, “Load&Save” , había una forma interesante de serializar los structs/clases. La verdad que el método es cutre, mejor dicho, poco elegante, incluso leyendo un poco comenta que reserva de entrada 64mb - ahora la memoria es barata -. Aún así el método es efetivo y simple y deduzco por sus comentarios que lo usa en su demo editor .werkkzeug1 - este editor merece un post aparte en mi opinión -.

Con todo esto pensé en crear un serializer basado en esto lo más simple posible y aquí está:

#define SERIALIZER(var,type,ser) do { if(ser.rw) { (var) = *(type*)(ser.mem); ((unsigned char*)ser.mem)+= sizeof(type); } else { *(type*)(ser.mem) = var;((unsigned char*)ser.mem)+= sizeof(type); } } while(0)
struct serializer
{

serializer(bool _rw):
rw(_rw)
{
// 6 megas está bien
if(!rw) base = mem = new unsigned char [ 6*1024*1024];
}
bool rw;
unsigned char *base;
unsigned char *mem;

void Save(const char* file){ }
void Load(const char* file) {}

void debug_dump()
{
int len = mem - base;

unsigned char *p = base;
while(len–)
{
printf(“0x%x “,*p++);
if(!len%20) printf(“\n”);
}
}

};

El código está codeado en poco tiempo y poco testeado. Tiene dos métodos para cargar y guardar en fichero que aún no están implementados y que de momento no he implementado. Tampoco sigo las típicas reglas de código elegante y bien diseñado pero estoy hasta las pelotas, me dedico a hacer cosas que funcionen, y en este caso parece que funciona, y para muestra, un botón:

struct A
{
int a;
int b;
short c;
char d;

A(int seed)
{
a = seed++;
b = seed++;
c = seed++;
d = seed++;
}
void Serialize(serializer& s)
{

SERIALIZER(a,int,s);
SERIALIZER(b,int,s);
SERIALIZER(c,short,s);
SERIALIZER(d,char,s);
}
void print()
{
printf(“%d %d %d %d\n”,a,b,c,d);
}
};
struct B
{
A a;
A b;
B(int o)
:a(o),b(o+1)
{}
void Serialize(serializer& s)
{
a.Serialize(s);
b.Serialize(s);

}
void print()
{
a.print();
b.print();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
serializer s(false);
B a(1);
a.Serialize(s);
s.debug_dump();
a.print();

serializer s2(true);
s2.base = s2.mem = s.base;
printf(“\n”);
B b(0);
b.print();
printf(“\n”);
b.Serialize(s2);
b.print();
return 0;
}

da como salida por pantalla:

C:\temp\serialize\Debug>serialize.exe
0x1 0x0 0x0 0x0 0x2 0x0 0x0 0x0 0x3 0x0 0x4 0x2 0x0 0x0 0x0 0x3 0x0 0x0 0x0 0x4
0x0 0x5
1 2 3 4
2 3 4 5

0 1 2 3
1 2 3 4

1 2 3 4
2 3 4 5

Como conclusión decir que a buen entendedor, pocos printf’s bastan y que tengo que encontrar algún método para que el código quede bien y no me joda los identados

undefined

Hey! hacía ya muchísimo que no posteaba, curiosamente coincide con la fecha en la que dejé de trabajar, bien pensado y a toro pasado es posible que lo que decía mi jefe fuera cierto: pierdo demasiado el tiempo ( espero que ningún jefe lea nunca esto :P).

Repasando un poco los post del blog la verdad es que en poco tiempo las cosas avanzan muchísimo. Empezando por wxPython tengo que decir que ahora windows forms me dan toda la facilidad y además en mi lenguaje favorito, C++ (bueeeno, managed C++), en cuanto a las intros/demos que comentaba ahora hay algunas que pasan con creces a las comentadas y mucho más viendo las ganadoras de scene awards (especial atención a las españolas arise y paradise) o las ganadoras de las breakpoint 2005. Otra cosa que ha cambiado han sido los links que tengo, creo, en la parte derecha. Seguramente no funcionen pero ¿ acaso no dan carisma unos cuantos 404 ?

Lo único que hasta ahora no ha cambiado ha sido mi interés por las demos/intros y en concreto la generación de contenidos procedurales. Precisamente ahora estoy programando una pequeña herramienta, que es con la que he recordado este blog con un tema que trataré en breve, que sirve para generar terrenos - y algo más :) -. Cuando tenga un poco de tiempo subiré alguna imagen.

PD: Ahora da gusto postear desde el portátil, ya no tengo que andar sincronizando varios pc’s con mi - valiosa - información, AH! y sobretodo, con estas teclitas tan suaves xD

undefined

En un momento de aburrimiento estaba mirando la web de nehe -conocido por sus tutoriales de opengl - y vi una noticia - la cual no lei - que tenia una enlace a pouet, pinché y me levó a la tipica pantalla de pouet - ver FAQ de demoscene - donde la gente pone a parir - o no - los trabajos de cada uno. Era una intro de 64k y las imágenes mostraban las típicas imágenes de una intro de 64k con escenas abstractas y figuras raras que no suelen decir nada. La intro de la que hablo es Project genesys. En mi opinión merece la pena verla, a mi me ha parecido espectacular - aunque ya no me afecta nada despues de ver .the .product-. Y todo esto a qué viene? llevo algún tiempo mirando este tipo de intros y me interesan bastante a nivel de programación. Sin embargo no hay demasiados recursos en la red acerca de como programar algo así y mucho menos de lo más interesante, como la síntesis de música, texturas, mallas. Solo hay que echar un vistazo a las peticiones de artículos de Hugi.

Algunos creadores de intros como exceed, farbraush y los creadores de la intro de la que he hablado - Conspiracy - crean un making-of de como han programado la intro. En el caso de project genesys tenemos una making-of y un artículo en cfxweb - atentos a los dos links de gamasutra que da al final -. Otros making of son los de exceed y su heaven7 , una intro que usa raytracing en tiempo real y como no el .the .product de los putos amos farbrausch. En la página personal de kb - miembro de farbrausch - explica como hizo el sintetizador de fr08, aunque no da detalles de su implementación.

Hay por ahí hay desperdigados algunos códigos y documentos de intros de 64k y 4k como por ejemplo partes de una intro de spinningkids en la que muestra como generar texturas, trabajar con fuentes y algunas cosas más. Otro artículo que he encontrado en cfxweb es making a 64k intro y por último el código de una intro de 4k hecha en c++ con sonido incluído.

Para saber más acerca de este tema podeis visitar un montón de webs, las que yo visito habitualmente son escena.org y pouet

Para terminar decir que yo también he hecho algún pinito, aunque pequeño en una compo que hizo codepixel en la que había que hacer un pequeño efecto con perlin noise. Puedes bajarlo aquí - si alguien quiere el código fuente me lo puede pedir por correo en el mail que dejo abajo - aunque te recomiendo que veas las demás producciones y más concretamente iq0 - código fuente incluído -.

saludos

PD: Mi mail es qualopec (at) lycos.es - hasta día de hoy no he tenido ni nu solo mail de spam, veremos ahora…