Monday, March 22, 2010

Breakpoint 2010

He empezado una prod para la breakpoint'2010. De momento, ni una linea de código (tengo cosas de la universidad por terminar antes), pero he escrito todo el guión, junto con los garabatos más feos hechos nunca por ningún ser vivo. La idea me gusta bastante, y la coherencia entre escenas parece bastante decente. De hecho, si puedo, no voy a tener partes separadas...

Ya veremos como avanza el tema. Como no tengo ningún pantallazo que poner, pongo una de una versión previa la katedra y un palo rojo. Y me quedo tan ancho.


Saturday, March 13, 2010

Vídeo de la Platipus/Incognita en progreso

Como comentaba en la otra entrada, aquí esta el vídeo:


Como comento en la descripción, hay muchos bugs por corregir, pero ya es algo mejor que nada :) Oh, y funciona en Windows Vista sin problemas :D

Obsesiones estupidas

Un buen amigo me comentó un día que envidiaba mi fuerza de voluntad, ya que me meto en mil proyectos, en los cuales acostumbro a invertir bastante tiempo. Mi respuesta fue: "No es que tenga mucha fuerza de voluntad, simplemente soy muy obsesivo". Al igual que aprendiendo, programo sobretodo para luchar contra la sensación de que no puedo hacer algo. Si algo sale mal, lo intento de mil maneras diferentes hasta que sale bien.

Mi ultima obsesión, como casi siempre, salió en un momento de aburrimiento: tenía ganas de ver la Platipus de Incognita. Hacía mucho que no la veía, pero recordaba que en Windows XP ya daba muchos problemas, a saber en Windows Vista. Nada, que la pruebo, y no muestra las primeras escenas, las siguientes las muestra mal, y se ve todo como una mierda. Una persona inteligente, habría encendido el PC de al lado, con Windows XP, pero yo no: porque hacerlo fácil cuando puedes hacerlo difícil, lento y complicado? La solución era clara, buscar el código fuente de la demo, y parchearlo para que funcione en Windows Vista. Es mas, rehacer el renderer y pasarlo a OpenGL.

A pesar que ha dado muchos problemas, ya que tenía parte del código del sistema de demos (porque porté la Mayhem a Windows), este no acababa de cuadrar, ademas de tener que hacer ingeniería inversa del formato de datos (había cambiado ligeramente), tener que implementar el renderer de OpenGL sin saber como va exactamente como va el Direct3D7, y otras cosillas (corrupción de memoria por coger la memoria de un heap, y liberarlo en otro), ahora ya esta al 50%. Hay muchos problemas aún, pero la mayoría son del renderer, lo cual es solucionable.

Lo que mas me preocupa, es que el renderer recibe polígonos pre-transformados, con lo cual falla la corrección de perspectiva, y parece que se este pintando con el software renderer de la Overdose (zas, en toda la boca). A ver si lo termino, y pido permiso a los Incognita para hacerlo publico. Unas capturas y un vídeo, todo muy temporal, así que disculpad los errores :P




PS: El vídeo lo añadiré en otro post, que la conexión desde donde escribo esto es algo inestable.

Thursday, September 24, 2009

Batallitas

Hoy toca una de batallitas, estaba viendo demos viejas para recordar tiempos pasados, y he decidido empezar un post sobre tonterías de prods antiguas de Collapse que relativamente poca gente sabe. Allá vamos:
  • Here 2 Stay: Esta prod fue un desastre en todos los sentidos. La poca experiencia, la falta de tiempo y demasiadas ganas de sacar algo, hicieron que mucho trabajo artístico se desechara o se usara mal. A día de hoy aun me sabe mal haberla terminado tal como se terminó. Antes de el apretón pre-deadline, quedamos en mi piso de Barcelona, cosa que por la época hacíamos mucho para preparar prods. Madgoblin recordará seguramente cierta anécdota del fin de semana anterior a la party :P
  • Xmastro 2002: Después de la desastrosa primera prod, esta segunda, una producción navideña, se hizo con la idea de hacer algo sencillo que quedara bonito. Creo que funcionó muy bien, y los objetivos se acabaron cumpliendo. A pesar que acabé odiando la canción de tanto escucharla, y que la nieve era un hack del copón (si os fijáis, se pinta en 2D, y para simular que no es así, se van añadiendo copos a las texturas de la escena 3D).
  • Let yourself go: Posiblemente una de las demos mas divertidas de montar. La mitad la programé en el tren en viajes Reus-Barcelona (la parte del túnel la hice integra en un viaje de hora y media). Al llegar a la party tenía 1 o 2 efectos de forma definitiva, y, como llegué a la party con Dar, hice todos los efectos configurables con teclas, y él los retocó hasta estar a su gusto. Algunos los toqueteé mientras él iba mandando. Fue MUY divertido, en cuestión de 5 horas, hicimos unas 6 partes nuevas. Luego él monto los layers, y montar la demo fue algo mas caótico, porque probaba un nuevo sistema que había diseñado para la prod. Estuve 3 días sin dormir, y cuando presenté la demo, me quedé dormido delante del PC. Dar me despertó para la proyección. Recuerdo que estaba muy dormido y casi no vi nada, pero recuerdo los aplausos a media demo y al final de esta: luego nos fuimos de fiesta toda la noche por Durango, cerrando todos los bares y discotecas que encontramos :P
  • Da Cube 4: Con esta prod empieza la época oscura de Collapse. Parcialmente porque empezamos a hacer las cosas un poco separados. Quizás debería haberme centrado en hacer más las cosas que pedían los artistas y menos lo que me daba la santa gana... La prod salió debido al "pique" con bp/fuzzion para que alguien más se dedicara a 4k. De hecho, ya me había dejado su dropper de .com, así que tenía la parte más complicada (para un principiante) solucionada. La verdad, es que no conté a nadie que estaba preparando la prod, y el primero en verla fue bp: los dos organizábamos la sección de proyección/compos de la bcnparty, y andaba haciendo pruebas a ultima hora y la vio. Aún recuerdo su comentario, el primero sobre la prod: "Sin la música esto no tiene gracia" :P Al final creo que gustó bastante, algún día haré la final (de hecho, una versión mucho mas definitiva lleva años cogiendo polvo en mi HD), si algún músico se anima a hacer versión de la música.
  • HappyNewYearMo 2004: Esta demo se hizo con el motor de b52. Mi participación se limitó a modelar el jarrón que sale en la prod, y una tool rápida para limpiar los ficheros ASE que se usaban en la prod. No me impliqué mucho en el desarrollo, así que poco puedo contar de ella :_(
  • Never Forget: Esta prod la empecé después de cortar con la que entonces era mi novia. De hecho, si leéis el scroller final, hay una referencia escueta al tema. La idea general era reproducir el diseño que shock hizo para la que tenía que ser nuestra primera producción: aun tenía los bocetos que hizo, así que me dediqué a hacer escenas con el raytracer lo más parecidas posibles a estos. A nivel de código, me lancé a portar el raytracer a openGL, para que la interpolación de los quads resultantes del raytracing se hiciera por hardware, aunque la implementación dejaba MUCHO que desear. Otro detalle curioso es que toda la sincro la hice en una noche, mientras me fumaba un paquete y medio de tabaco: no tenía implementado ningún sistema para saltar al final de la producción, asi que cada vez que retocaba alguna cámara o sincronización del final tenía que verla entera. Fue una noche muy larga, pero divertida. También a resaltar que no dije nada a nadie hasta que tuve la prod al 80% (faltaban las texturas, pulir el track, y acabarla): quedé con los Collapse de Barcelona, nos fuimos a comer por el Born, y cuando terminamos de comer, en la misma mesa, abrí el portátil y les enseñé la prod. Me parece que nunca he visto a shock tan sorprendido como ese día :)
Si gusta, sigo explicando historias de las prods, que aun quedan las de 4k, con historias mucho más surrealistas :)

Thursday, August 06, 2009

Puños fuera!

Hace unos días estuve en casa de un amigo que acaba de tener un hijo (técnicamente su pareja, pero ya se entiende). Hacía casi dos años que no nos veíamos, aunque hace mucho que nos conocemos: al irme de Barcelona, habíamos perdido el contacto. Fui a su piso, conocí a su hijo (que entonces hacía 7 días exactos que había nacido) y me invitaron a comer. Su madre preparó unas de las paellas mas espectaculares que puedo recordar. Compartieron lo que tenían conmigo, de forma generosa.

Cuando era pequeño, solíamos ir, con mis padres y los compañeros del club excursionista, bastante de camping. Allí, casi siempre que comíamos se hacia en comunidad, se compartía la comida con todos, y nadie abusaba comiéndoselo todo ni nada parecido.

Y porque cuento todo este rollo personal, cuando os importa un pepino? Pues porque al final de este post hay el código de la ultima prod que hemos hecho slack y yo. He limpiado un poco el código, y ahora debería requerir menos GPU, pudiendo funcionar en aquellas tarjetas que no soporten GLSL 1.2 (o OpenGL 2.1 completo, si lo preferís). Ademas, he reducido el tamaño de la prod a la vez que he añadido soporte decente para resoluciones diferentes y para esconder el ratón.

No he añadido contenido ni he corregido el que había, prefiero trabajar en nuevas prods que no invertir tiempo en esta: únicamente sacamos versión final porque ha sido un trabajo derivado de limpiar el código para publicarlo. De hecho, al poco de publicar este post estaré empezando la nueva prod. Ademas he publicado versión final de la 4k:

- otopoto / Collapse & Gatitos (versión final)
- otopoto / Collapse & Gatitos (código fuente)

Preguntas, insultos y correcciones serán bienvenidas.

Sunday, July 26, 2009

Nueva 4k

Pues eso, hemos terminado una nueva 4k. Las criticas no han sido buenas, y quedamos segundos. Ademas, para añadirle insulto, es la 4k a la que posiblemente he dedicado mas tiempo. Vaya, un fiasco, no? No creáis. Voy a contar porqué.

Hace 2 años exactos, decidí dejar de producir. Acababa de volver de la Euskal, habíamos ganado la competición de 4k, y yo solo podía sentir frustración por la producción con la que habíamos ganado: mucho material reutilizado y hecha con desgana. El hecho que ganara solo añadió insulto al asunto. Ya entonces consideraba seriamente que no producía al nivel que podía hacerlo, al menos en lo que respecta a técnica. Hacer cosas abstractas esta bien una temporada, pero después de unos años...

Decidí dejar de producir hasta que no pusiera todo mi empeño en una producción. Hace algo menos de un año empecé con la versión final de la Let yourself go, ya que creía que merecía un poco de amor antes de olvidarla para siempre. La idea era pillar carrerilla en algo orientado a la demoscene, y luego empezar algo nuevo. Siempre con la idea de volver a producir con ganas, y dar lo que pudiera, al menos a nivel técnico.

Y aunque el resultado de la otopoto no sea el que tenía en la cabeza, y siendo consciente que había muchísimas cosas por pulir, puedo levantar la cabeza alto y sentirme orgulloso de haber trabajado en ella a consciencia. Obviamente, el resultado artístico deja que desear, pero técnicamente tiene detalles interesantes. En la próxima tengo que recordar centrarme mas en la parte artística, como hacía con las producciones mas abstractas.

Solo para notar como las prisas finales hicieron recortar en calidad, comparad los 2 shots siguientes. El primero es el de la prod a una semana de la party, el segundo de la versión presentada en la party:


No mucho mas que comentar al respecto, si alguien quiere mas detalles, que comente y le responderé lo mejor que sepa.

A parte, en esta euskal también di una charla sobre 4k. Hubo cosas que funcionaron muy bien y otras que no. A parte, estaba algo nervioso, pues la sala estaba MUY llena (50-70 personas) y no había ensayado la charla tan a fondo como hubiera querido. Tenéis, de momento, el audio y las diapositivas usadas aquí. A final de verano saldrá el vídeo de la charla, cuando esté disponible ya lo comentaré por aquí.

Friday, July 03, 2009

Hoy, snippets cortos de código

Viendo como OpenGL va a deprecar parte del API (cosa que me parece bien, a ver si conseguimos mejores drivers!), y la costumbre de programar cosas de mas que tenemos algunos, he creído que alguien le seria útil. Funcionan 100% igual que las funciones de la API (misma matriz, etc). Empezaré por el mas trivial (la implementación es directa respecto a la documentación), crear una matriz de proyección ortográfica, con los mismos parámetros que gluOrtho:

   1:  CMatrix4x4 CreateOrtographicProj (float left,   float right, 
   2:                                    float bottom, float top, 
   3:                                    float Near,   float zFar)
   4:  {
   5:   CMatrix4x4 result;
   6:
   7:   float  tx = -(right+left)/(right-left),
   8:          ty = -(top+bottom)/(top-bottom),
   9:          tz = -(zFar+zNear)/(zFar-zNear);
  10:
  11:   result.Set (2.f/(right-left), 0.f,              0.f,               tx,
  12:               0.f,              2.f/(top-bottom), 0.f,               ty,
  13:               0.f,              0.f,             -2.f/(zFar-zNear),  tz,
  14:               0.f,              0.f,              0.f,               1.f);
  15:
  16:   return result;
  17:  }

Como apunte, en todos los snippets de codigo usan ciertas clases matemáticas sencillas que uso, en esta la clase matriz cuadrada de 4 elementos. Si hay alguna duda sobre esto, comentadlo y expando los detalles sobre ellas. A efectos prácticos, podéis suponer que CMatrix4x4::Set (...) es equivalente a ir asignando a un array de floats de 16 elementos: el primer parámetro seria el primer elemento del array, el segundo parámetro el segundo elemento, etc.

En segundo lugar, proyección en perspectiva, equivalente a gluPerspective:

   1:  CMatrix4x4 CreatePerspectiveProj (float fovy,  float aspect, 
   2:                                    float zNear, float zFar)
   3:  {
   4:   float f    = tanf (((fovy/180.f)*(float)M_PI) / 2.0f);
   5:   float div  = (zNear-zFar);
   6:
   7:   f   = IsFloatEqual(f, 0.f) ? FLT_MAX : 1.f / f;
   8:   div = IsFloatEqual(div, 0.f) ? FLT_MAX : 1.f / div;
9:
  10:   CMatrix4x4 result;
  11:
  12:   result.Set (f / aspect, 0.f,   0.f,              0.f,
  13:               0.f,          f,   0.f,              0.f,
  14:               0.f,        0.f,   (zFar+zNear)*div, (2.f*zFar*zNear)*div,
  15:               0.f,        0.f,  -1.f,              0.f);
  16:
  17:   return result;
  18:  }

A comentar, la macro IsFloatEqual solo compara dos números en coma flotante: el método normalmente mas recomendado (pero menos rápido, obviamente), es restarlos, coger el valor absoluto, y comparar si es menor que cierto epsilon. Esto se hace así debido a que por precisión de los numeros en coma flotante, comparar con numeros exactos (por ejemplo, haciendo float == 0.0) es desaconsejable.

Finalmente, el que tiene mas curro, el gluLookAt (sobretodo, porque la documentación obvia ciertos detalles):

   1:  CMatrix4x4 CreateLookAt (const CVector3 &eye,
   2:                           const CVector3 &center, 
   3:                           const CVector3 &up)
   4:  {
   5:   CVector3 f      (center-eye);
   6:   CVector3 upLocal(up);
   7:
   8:   f.Normalize();
   9:   upLocal.Normalize();
  10:
  11:   CVector3 s = f ^ upLocal;
  12:   CVector3 u = s ^ f;
  13:
  14:   s.Normalize();
  15:   u.Normalize();
  16:
  17:   CMatrix4x4 result, translate;
  18:
  19:   result.Set ( s.x,  s.y,  s.z, 0.f,
  20:                u.x,  u.y,  u.z, 0.f,
  21:               -f.x, -f.y, -f.z, 0.f,
  22:                0.f,  0.f,  0.f, 1.f);
  23:
  24:   translate.SetTranslation (eye*-1.f);
  25:
  26:   return result*translate;
  27:  }

A ver, destacar de este snippet, que el operador^ de la clase CVector3 equivale a hacer un producto vectorial (cross product), que el método Normalize hace lo inferible del nombre (es decir, normaliza el vector usando su modulo), y que el método SetTranslation de la clase CMatrix4x4, simplemente asigna a una traslación a la matriz (en este caso, al ser una matriz identidad, simplemente creamos una matriz de traslación).

No he explicado a fondo que hace cada parte, para eso tenéis los links a la documentación de OpenGL, y si hay mas preguntas mejor dejad comentarios.

La licencia de este código es la obvia y clásica haced lo que os dé la gana con él. Si encontrais algun bug, comentarlo y aprendemos todos de ello :)

Tuesday, June 16, 2009

Como se creó la Extasik / Collapse & Necrostudios

Iba a hacer un post técnico sobre mi demo-engine, comentando tonterías que estoy haciendo, y las mil paridas que estoy aprendiendo a base de leer más libros de C++ (y darme cuenta que soy un pardillo de C++), pero como no estoy en casa, he preferido contar como surgió la que es, posiblemente, la producción de la que estoy mas orgulloso: la extasik.

Primero empecemos con el contexto de la producción en si:

katedra July 2006
e-fill April 2006
extasik March 2006
ifparty invitation'06 February 2006
xmo06 January 2006
siahtu December 2005

(Ripeado vilmente de pouet)

Como veis, fue una época realmente muy productiva, prácticamente a producción por mes, de las cuales la única que considero flojilla es la siahtu (a pesar que tenia mucho trabajo detrás, no quedo demasiado bien). En medio de todas estas producciones, esta la extasik.

En febrero de 2006, la gente de Bixo me invitaron a la Plugparty. Por ser demoscener no tenia que pagar entrada, pero insistieron que tenía que producir. La Plugparty era una party pequeña, con un publico mayoritariamente gamer, que se hacia en un pueblo tranquilo cerca de Lleida. Como al mes siguiente había la, también ahora, desaparecida ifparty, que organizaba, entre otros, slack, decidí matar dos pájaros de un tiro y hacer una invitación para tal party (diría, si mal no recuerdo, que fue slack quien me instó a hacerlo). Al final la prod dio la temática de la party, y quedó muy resultona. Lo importante es que fue posiblemente la primera colaboración seria con slack (no tendré en cuenta la grevox, ejem), aprendiendo a usar el sinte para sincronizar, tener en cuenta cuanto ocupa y que podía hacer.

Al mes siguiente había la ifparty, a la cual bajaba con los Bixo, y también tenia que llevar prod. Para cambiar mi sistema habitual de rellenar hasta llegar a 4k, esta vez decidí programar todo lo que quería en la prod, y luego sufrir bajándola hasta los 4k. Las inspiraciones principales para la prod fueron The S (que es la obvia) y la menos obvia, VHS. Quería una prod usando mucha sincro, rápida, y con 4 partes diferentes mínimo. Además quería postprods y algo de decoración a parte de lo mostrado en pantalla: evitar fondos negros y/o efectos "limpios", etc.

La prod la empecé hacia el día 6 de marzo, es decir, 2 semanas antes de la deadline. Durante la primera semana y media, se hizo toda la parte grafica, sin optimizar nada (a parte de ciertas obviedades), y sin música ni sincronismo. De hecho, como curiosidad, la prod la probaba con la música de la invitación de la ifparty, y no fue hasta la misma ifparty cuando slack hizo el track para la 4k. Entonces, el martes antes de la party, decidí que ya tenia todo el contenido que deseaba, y que era el momento de empezar a optimizar. Probé de comprimirla con crinkler, para saber cuanto me había pasado de 4k: la prod ocupaba algo menos de 6kb, si no recuerdo mal.

Bajar el primer kilobyte y medio fue un trabajo bastante lineal y divertido: eliminar redundancias, añadir secciones, quitar burradas, etc. Estuve 3 días casi sin dormir optimizando la producción, de hecho, la noche antes de ir hacia la party (diría que fuimos para allá el sábado por la mañana) no dormí nada. Justo cuando me venían a recoger en coche, la prod bajaba hasta los 4096 bytes (recuerdo estar bastante contento de tener la prod sin sincro ni música, pero cerca de algo presentable).

Acabar la producción en la party fue posiblemente la parte más divertida. Por una parte, me había comprometido con slack a dar una charla sobre las 4k que había/habíamos hecho hasta ese día (que funcionó bastante bien para ser una charla orientada a explicar tonterías internas de cada prod), y aun tenia que conseguir una canción de slack, sincronizar y pulir la prod: todo eso en unas 12 horas. Estuve optimizando mas cosas de la prod hasta el medio día, entonces me fui a comer con bastante gente de la party a un chino, mientras el pobre slack se quedaba en la party haciendo la música de la prod (igualmente se tenia que quedar, al ser organizador).

Cuando volvimos del chino, slack tenia un esbozo bastante final de la música, así que podía empezar a sincronizar y optimizar. Gran parte de la tarde se basó en hacer la sincro con la música y optimizar alguna cosa, aunque no salirse de 4k en este punto fue gracias a slack, pues le dejé muy poco espacio para la música. A media tarde dí la charla (explicar cosas sobre la charla es una historia para otro día), para después seguir con la prod.

Quizás la parte mas remarcable fue terminar la prod en si mismo. Como muchas veces pasa, cuando teníamos la prod terminada y por debajo de 4k, la probamos en la compo machine (que traía una ATI, como no) y el texto se veía mal. Corregí el bug, pero al corregirlo la prod volvió a subir: estábamos al límite de los 4kb, y al hacer cualquier cambio, la compresión de la prod no era tan eficiente y subía bastante (10 bytes, aproximadamente). El principal problema a esas horas es que la deadline era inminente. Por suerte, slack estaba muy liado montando las compos, y yo estaba al final de la sala de la ifparty. Lo que hice fue ir dándole largas (nos pasamos mucho rato pegando gritos de punta a punta), porque sabía que no se levantaría para recorrer los 20 metros, estando hasta arriba de responsabilidades. Así conseguí casi una hora más para terminar la prod, escribir el nfo, el diz, hacer screenshots, etc. Truquillos de party-coding que no viene mal saber :P

Finalmente, unas cuantas curiosidades:

- La llamamos extasik por la canción de Chimo Bayo. Luego le siguió la extanok.
- La escena final fue en principio una sala con columnas y un objeto central (hay un screenshot al final del post). Al final se cambió. La escena que sé usó al final, se referenciaba entre slack y yo como la escena de las tetas. Esto es una referencia oscura a la invitación de la ifparty06, donde la primera se referenciaba como la escena de las p*****.
- El texto que sale en las dos partes finales eran, en principio, el nombre completo de los dos grupos. Por motivos de tamaño se recortó.
- La mayoría de la prod la monté a 320x240, porque mi pobre portátil se moría con los postprods.
- Todos los objetos en la prod son cilindros. El sistema para pintarlo hereda de la grevox, la siahtu y una prod que nunca terminé.
- El fondo de las dos primeras escenas se reutilizó para la e-fill, pero sin rotarlo como hace en esta.
- Gran parte del código gráfico de la extasik se reutilizó para la extanok, por ejemplo la sala y el sistema de dibujado de cilindros.
- Unos meses más tarde, descubrimos el truquillo de truncar floats. La optimización en la extasik es principalmente refactorización de código.

Y unos screenshots de la prod a medio montar. Las imágenes no están desaturadas, el esquema de color lo metí cuando acababa la parte gráfica: