Créditos
Todo el código es mío. LWSINTERP.C se basa en la implementación de Ernie Wright, la decodificación JPEG en la biblioteca IJG, y el sonido en FMOD de Firelight Technologies.
La pantalla de presentación de Win32 y los iconos son de Yoyo. Jylam probó la versión de Linux X11, Med y f0st probaron el resto, y Yoz, Xbarr y Fraa aportaron escenas de prueba de LightWave — las mismas personas cuyas escenas acabaron en las demos.
jfyeNG es gratuito para uso no comercial.
Just For Your Eyes NG
jfyeNG es un reproductor de escenas construidas en Newtek LightWave 6.x y 7.x: se le indica un fichero .LWS y reproduce la escena en tiempo real. Es el motor que hay debajo de todas las producciones de PlayStation 2 de Condense de 2002 — PS2Room, Monalisa, Evolution, Lobotomia — y, en su versión de Windows, debajo de Red Line al año siguiente. En abril de 2003 publiqué la herramienta misma.
Los ejecutables del archivo se compilaron el 20 de marzo de 2003 y se presentan como jfyeNG (c) Arnaud Storq 1998-2003: la línea de copyright se remonta a cinco años antes de la publicación.
Plataformas
La documentación menciona tres, y dice de la arquitectura que es «robusta, modulable y portable»:
- Win32 — 95, 98, Me, NT4, 2000 y XP, en dos versiones, una que pasa por OpenGL y otra que renderiza en software
- Linux — X11, mediante Mesa
- PlayStation 2 — EE y GS solamente, sin vector units
El archivo que sobrevive en scene.org, resubido en diciembre de 2012, solo contiene ya las dos versiones de Windows, el archivador, el precalculador, el pack de demostración y la documentación. Las capas de Linux y de PlayStation 2 salieron dentro de las demos y no como ejecutables que cualquiera pudiera descargar.
Lo que leía de una escena
La documentación abre su capítulo de compatibilidad con una advertencia al lector: jfyeNG renderiza en tiempo real, así que no conviene usar las funciones avanzadas de LightWave. Esto es lo que sí leía.
- Escena: tamaño, color del backdrop
- Objetos: motion, dissolve, parent, null objects, deformation, morph mixer (endomorph), pivot point
- Luces (solo en las versiones aceleradas por hardware): luces distant y ninguna otra, intensidad, motion, color
- Cámara: motion, parent, zoom factor
- Superficies, cualquier número por objeto: scrolling, gouraud, additive, double-sided, y el mapping —
- planar
- UV
- cubic
- cylindrical
- spherical
- environment, simulado
- Imágenes: JPG, y TGA en 8, 16, 24 y 32 bits, raw o packed
Gouraud, mapping y additive se combinan libremente: una superficie puede ir en gouraud y en planar mapping a la vez.
Lo que no hacía
Una parte está en la documentación, y el resto te lo dice el propio motor cuando una escena falla al cargar y la pantalla se pone roja:
- los objetos deben ser LWO2, o sea LightWave 6.x en adelante — Error : %s is not a LWO2 file (LW 6.X+) !
- un solo layer por objeto — Error : %s has more than 1 layer !
- ni NURBS ni bones — Error : %s has a bad polyCount definitions ! (Nurbs & Bones are not supported)
- el morphing funciona únicamente con los mappings planar y environment; UV mapping y un endomorph a la vez dejan un warning en el log y se ignoran
- las versiones software y de PlayStation 2 no tienen luz alguna
- las texturas deben ser JPG o TGA
Texturas con scroll
No hay en toda la interfaz ningún parámetro de scroll. Se pone una palabra clave en el nombre del fichero de textura y el motor la lee ahí: SCUP para arriba, SCDN para abajo, SCLT para la izquierda, SCRT para la derecha. Una textura llamada TEXTURE_SCUP.TGA se desplaza hacia arriba.
Archivos y precalculado
Junto al reproductor se distribuyen dos herramientas complementarias, ambas solo para Windows.
jfyeNGArchiver reúne escenas, objetos, texturas, ficheros de precalculado y audio en un único .JNG comprimido. Una escena cargada desde un archivo ya no arrastra las rutas absolutas de la máquina en la que se construyó, y eso es lo que hace distribuible una demo — la alternativa era confiar en que el espectador tuviera su propio C:\LW\LWS\.
jfyeNGPrecacher recorre una escena por adelantado y escribe un .PRK a su lado, con la lista de lo que nunca hará falta dibujar porque otra cosa lo tapa. El reproductor recoge el fichero por su cuenta y escribe Precaching file found en el log, y luego (using precalculation) en pantalla.
La reproducción
La ventana es una playlist y una fila de botones: Add y Remove para las escenas y los archivos, Set LW path para el Content directory de LightWave — se comporta exactamente igual que el de LightWave — Set audio file, una resolución entre 320×240, 512×384, 640×480, 800×600 y 1024×768, y dos casillas, Full-screen y Bilinear. Todo ello queda recordado en jfyeNG.ini, y todo lo que ocurre se escribe en jfyeNG.log.
El sonido pasa por FMOD, que es generoso con los formatos: MOD, S3M, XM e IT, MIDI en .MID, .RMI y .SGT, WAV, MP2 y MP3, Ogg Vorbis, WMA y ASF.
Mientras se reproduce una escena, cuatro teclas hacen algo:
- barra espaciadora — saltar a la escena siguiente
- L — lines mode, la escena en alambre
- S — snapshot, escrito en TGA en el directorio actual
- T — el rótulo de control, que cuenta los frames, indica cuántos triángulos hay en cuántos objetos, y da los fotogramas por segundo
Cuando termina la última escena de la playlist, la playlist vuelve a empezar desde el principio.
El pack de demostración
jfyeNGDemo.JNG es un archivo de 3,2 MB con doce escenas, y es un recorrido bastante fiel de lo que el motor sabía hacer. Cinco de ellas llevan el nombre de un modo de mapping y demuestran exactamente eso — planar, spherical, cylindrical, cubic, environment — con scroll para las texturas con scroll. Las demás son trabajo de verdad: sallefeu, la sala en llamas de Xbarr, aquella con la que se construyó PS2Room; evolution, sacada de la demo de la ronda 7; hotpursuit, un Porsche y un BMW en una carretera en bucle, con las ruedas modeladas aparte de las carrocerías; citrouille; john; y fresco, con diferencia la mayor, ciento doce objetos y texturas para un puente, una torre, una isla, una mariposa y un guardia del Olimpo.
Lo que seguía en la lista
La documentación termina con una lista de tareas pendientes, en el orden de prioridad del autor, que hoy se lee como un balance justo de dónde se detuvo el motor:
gestión de bones · gestión correcta de las luces · un visualizador de bitmaps 2D para billboards · partículas · triangle stripping · un dissolve correcto, ordenando las caras con blending · compresión LZW y RLE en los ficheros .JNG · funcionar como salvapantallas · eliminación de objetos por bounding box · un packer de LWO que quite los chunks sin usar