martes, diciembre 12, 2006

XNA Game Studio Express lanzado

Pues eso... El XNA Game Studio Express ha dejado de ser beta y la versión 1.0 ya ha sido lanzada.

De momento sigue siendo requerido el uso de Visual C# 2005 Express y sigue sin haber soporte para Vista.

Por otra parte XACT requiere .NET Framework 1.1 y no funciona bajo Vista.
En fin, toda esa info y más en el readme de Game Studio Expres.

Así que tocará probarlo... claro que yo ahora ando con Vista en el portátil y en el ordenador de casa tengo una tarjeta gráfica que no tiene Vertex Shader 1.1... :(

martes, noviembre 14, 2006

XNA en el Tech·Ed

Hola!
Esta pasada semana, del 07 al 10 de noviembre, se ha celebrado en Barcelona (en el CCIB justo al lado del Fórum) el Tech·Ed 2006: Developers, al cual he asistido en nombre de raona.
Se trata de un evento de Microsoft EMEA destinado a desarrolladores profesionales que trabajen en plataformas Microsoft. Este año se han tratado temas de Office 2007, Windows Vista y el Framework 3.0 entre otros, pero no quiero hablar de eso aquí (estoy recopilando mis opiniones sobre las distintas charlas a las que accedí, opiniones que podréis encontrar en breve en un blog que he abierto a tal fin: techedbyraona.blogspot.com).

De lo que quiero hablar en este post fue, que camuflada entre todas las sesiones de este Tech·Ed había una que se llamaba "Microsoft XNA and the future of game development". La sesión estuvo impartida por Rob Miles, profesor de la universidad de Hull.
Fue una sesión muy introductoria, pero en apenas una hora y cuarto pudimos ver como Rob construía un juego (una especie de arkanoid un poco surrealista todo hay que decirlo, con una barra de pan rebentando tomates a base de quezasos). Mostró en cada momento el código más relevante para gestionar los gráficos (2D), los controles (eso sí, compatibles XInput: era el pad de la XBox 360) y un ejemplo de como mostrar texto por pantalla.
Finalmente hizo una rápida (bueno.... fugaz) introducción a 3D.

La sesión fue interesante pero más que el contenido en sí, lo que más me gustó fue la forma en como presentó la sesión: dado que él es profesor, la sesión fue presentada desde un punto de vista muy académico. Así analizó las facilidades que ofrece XNA para construir Componentes y reutlitzarlos en varios juegos, y el como gracias a XNA, queda el código muy sencillo, orientado a objetos y claro. Eso le permite concentrarse en sus clases en la forma de programar, los algoritmos a usar y el análisis y diseño del juego, en lugar de perder el tiempo explicando complicadas líneas de código sólo destinadas a tener un bucle de juego eficiente, por ejemplo.

Terminó la sesión mostrando su convencimiento de que a largo plazo el futuro de los juegos pasa por XNA (a medio plazo el impacto de rendimiento versus C++ nativo es todavía una losa demasiada pesada, pero a largo plazo con mejor hardware y mejores herramientas de desarrollo las ventajas de productividad y mantenibilidad de XNA versus código nativo, harán que sea planteable usar en gran parte XNA para el desarrollo de juegos comerciales). Por otro lado mencionó que XNA permitirá un mercado emergente de juegos casual, desarrollados por aficionados o pequeños estudios y destinados al XBox-Arcade. Es posible, aunque el importe a pagar para poder desarrollar para XBox-Arcade, aunque no es muy grande puede suponer un freno. En el mundo del PC por su parte ya hay un enorme mercado de juegos casual (en su gran parte freeware), pero también hace tiempo que existen librerías como Allegro o SDL completamente orientadas a jugeos que facilitan mucho la creación. Desde mi punto de vista XNA es superior tanto a Allegro como SDL, aunque obviamente le falla el soporte multiplataforma que ofrecen las dos anteriores... al menos de momento, porque no me extrañaría nada que algún día empezaramos a leer ports de XNA a Linux... ;)

jueves, noviembre 02, 2006

Beta 2 del Game Studio Express disponible

Pues eso!
Ya se puede descargar la Beta 2 del Game Studio Express (GSE).
Más info en la página del GSE.

Al final todavía no hay soporte para Vista :(

Yo todavía tengo que probarla....

jueves, octubre 26, 2006

Buscador personalizado para XNA

Buenas!
Google ha sacado un servicio que permite definir buscadores personalizados. Aprovechando la ocasión he creado un buscador específico para temas de XNA. Lo podéis encontrar a la derecha, donde pone Buscar sobre XNA.
Este buscador usa el motor de Google, limitado a una lista de páginas que he considerado interesantes y relevantes con noticias sobre XNA.
Este post contendrá en todo momento el listado actualizado de páginas las cuales sirven de referencia para mi buscador de XNA.

  1. Blogs sobre XNA
    1. http://letskilldave.com/
    2. http://blogs.msdn.com/tmiller/
    3. http://blog.3deurope.com/
    4. http://blogs.msdn.com/robunoki/
    5. http://xnarocks.spaces.live.com/
    6. http://blogs.msdn.com/mitchw/
    7. http://blogs.msdn.com/mklucher/default.aspx
    8. http://xna-para-torpes.blogspot.com/ (en castellano)
    9. http://msmvps.com/blogs/mykre/
  2. El blog oficial del equipo de XNA
    1. http://blogs.msdn.com/xna/
  3. Página oficial de XNA de Microsoft y forums de XNA
  4. Otras páginas sobre XNA (tutoriales, páginas que he encontrado y considero interesantes)
    1. http://www.xnatutorial.com/
    2. http://www.thezbuffer.com
    3. http://learn-xna.com/default.aspx
    4. http://www.xnadevelopment.com/
    5. http://xna.animered.net/ (en castellano)
    6. http://www.xnaspot.com/
    7. http://www.xnaresources.com/
    8. http://www.ziggyware.com/

En fin, os animo a usarlo y todas las sugerencias serán bienvenidas. Obviamente si alguien considera alguna página interesante que añadir al buscador, que me lo diga y la añado sin ningún problema... especialmente interesante serían páginas en castellano ;)

miércoles, octubre 25, 2006

Beta 2 de XNA Game Studio

Pues eso... según se anuncia aquí, Microsoft va a lanzar la beta 2 del XNA Game Studio.
No menciona las novedades incluídas, ni si habrá soporte para Vista, pero si que dice que esta Beta 2 será muy parecida a la versión final...
Tampoco comenta si se suportará alguna otra versión de Visual Studio que no sea la C# express, aunque yo pienso que no (en un post anterior del mismo blog el equipo de XNA ya justificaba el porque del soporte sólo a Visual C# express y a C# como lenguaje).

lunes, septiembre 18, 2006

Tutoriales sobre XNA Framework

Sí, sí... XNA Framework todavía es muy nuevo y cuesta encontrar buenos tutoriales... pero algo hay ahí afuera...
(Sacados de l blog de Bejnamin Nitschke - http://abi.exdream.com/blog/ )

viernes, septiembre 01, 2006

Mi primera toma de contacto con XNA Game Studio Express!

Ya me he descargado el XNA Game Studio Express y he hecho cuatro pruebas básicas... Poca cosa puedo decir de momento, sólo que:
  1. Debe instalarse sobre Visual C# express. No sirve VS.NET 2005!
  2. Visual C# express y VS.NET 2005 pueden instalarse en la misma máquina
En concreto la máquina donde lo he probado tenía ya instalados un VS.NET 2005, un SQL Server 2005 y el DirectX SDK de Junio (no el de Agosto que es el recomendado y necesario para poder usar XACT Tool).

Instalé el Visual C# Express, lo registré (según recomiendan en las FAQs) e instalé el XNA Game Studio Express. Todo funcionó correctamente :)

Básicamente aparece un icono nuevo en programas (Game Studio Express) que al lanzarlo nos abre el Visual C# Express, el cual tiene varias plantillas nuevas para crear juegos... Existe una plantilla que ya es un juego completo, con sus gráficos, sonidos y (obviamente) código fuente, para que podamos empezar a trastear con él.

En fin... cuando pueda iré dando más información... ;)

miércoles, agosto 30, 2006

XNA Game Studio Express disponible!

Un post rapidillo para comentar sólo que la beta del XNA Game Studio Express ya está disponible para su descarga. La podéis encontrar en http://msdn.microsoft.com/directx/xna/gse/

A ver si esta noche le puedo echar un vistazo y comentar alguna cosilla... :)

jueves, agosto 24, 2006

Un par de cosillas (interesantes) que he leído sobre XNA

He estado leyendo información sobre el Framework XNA y me he encontrado algún par de cosillas interesantes...

  1. Game Loop incorporado: Una de las cuestiones más recurridas en la programación es la creación de un bucle principal de juego eficiente. Pues bien, parece que XNA incorporará un bucle de juego propio: You don't need to worry about render loops any more with the XNA Framework - that's one of the things we take care of for you! Just hook up to the Update and Draw events on our Game object, and off you go.. Sacado del forum de XNA.

  2. El compilador del XNA Game Studio generará MSIL estándar si generamos nuestro juego para la XBox 360 (teóricamente este juego podría ser ejecutado en un PC con el CF, pero a la práctica no va a poder ser porque las referencias del juego apuntarán a la versión de XBox de los assemblies de XNA).

  3. Soporte para teclado incorporado en XInput para Windows y XBox. Soporte para ratón incorporado en XInput sólo para Windows. Leído en los foros de XNA.

miércoles, agosto 23, 2006

DirectX SDK - Agosto 2006

Ya está disponible (desde hace algunos días, cierto) la versión de Agosto del SDK de DirectX.
Las novedades más importantes vienen de la parte unmanaged, de hecho no se esperan novedades para Managed DirectX hasta que salga la beta del XNA Framework.

La novedad más importante de este SDK quizá sea la nueva Technology Preview de Direct3D 10, que esta vez ya sólo funciona en Windows Vista RC1.
Como siempre todas las novedades y detalles del último SDK de DirectX los encontraréis en la página oficial del SDK de DirectX.

lunes, agosto 21, 2006

XNA Game Studio Express

Mucho se está hablando del Framework XNA, que permitirá crear juegos usando .NET que sean compatibles entre XBox 360 y PCs con Windows.
Ahora Microsoft acaba de anunciar la disponibilidad de XNA Game Studio Express. El XNA Game Studio es esencialmente una adaptación de Visual Studio especialmente concebida para la creación de videojuegos (usando el frameork XNA) y cuyo uso será gratuito para crear videojuegos bajo Windows. Además (teóricamente) sólo con recompilar los juegos serán compatibles para la XBox 360, aunque en este caso deberá pagarse.
El XNA Game Studio Express podrá descargarse a partir del 30 de Agosto.

En fin... comentar sólo que como se preveía, la aparición de XNA significa la muerte de MDX... MDX 2.0 que actualmente está en fase beta, no será actualizado ni verá nunca la luz de forma oficial. Los assemblies que actualmente conforman MDX 2.0, serán retirados del SDK de DirectX cuando la beta del XNA Framework sea pública.

jueves, julio 20, 2006

MMmm... Que lío de conceptos y versiones!

Últimamente con la vorágine de novedades que Microsoft nos está obsequiando al respecto de DirectX, hay cantidad de conceptos que están un poco liados (o al menos eso me parece a mi). Después de navegar por esos mundos de dios, he llegado a las siguientes conclusiones:

  1. DirectX: El inicio de todo. Un conjunto de APIs para la programación de videojuegos y aplicaciones multimedia de alto rendimiento en Windows. Su versión actual es la 9.0c.

  2. .NET: Es complicado definir que és .NET. Para nuestros propósitos la podemos entender como la plataforma de desarrollo y ejecución de aplicaciones de Microsoft. Actualmente se encuentra en su versión 2.0. .NET se instala sobre Windows como un componente de sistema más, y es imprescindible para la ejecución de aplicaciones .NET (conocidas como aplicaciones managed).

  3. MDX 1.1: Es la versión de DirectX 9 para la plataforma .NET. Permite crear aplicaciones .NET que usen DirectX 9. MDX 1.1 requiere .NET 1.1. o bien .NET 2.0.

  4. MDX 2.0: Es la segunda revisión de las APIs para .NET de DirectX 9. Eso es importante: MDX 2.0 es DirectX 9, no DirectX 10. Actualmente MDX 2.0 está en fase beta. MDX 2.0 funciona sobre .NET 1.1 y sobre .NET 2.0.

  5. D3DX: Librería que forma parte de DirectX, con un conjunto de rutinas de alto nivel para facilitar la creación de aplicaciones con Direct3D.

  6. DirectX 10: NO existe en la actualidad DirectX 10. Existe una versión de Direct3D 10, que actualmente está en beta. Direct3D 10 aparecerá sólamente en Windows Vista.

  7. WGF (Windows Graphics Framework): El nombre que en teoría recibiría Direct3D en Vista. WFG1.0 sería un Direct3D 9 ligeramente modificado para Vista (finalmente Direct3D 9Ex) y WFG2.0 sería Direct3D 10. Al final nada de nada: En Vista seguiremos hablando de Direct3D y DirectX.

  8. WPF - Windows Presentation Foundation: Anteriormente conocida como Avalon, WPF es la nueva capa de presentación de Windows Vista, que utiliza Direct3D 9Ex para sus propósitos.

  9. XNA Framework: La madre de todo el cotarro. Un nuevo conjunto de APIs que permitirán la creación de aplicaciones managed compatibles entre Windows y XBox 360. MDX 2.0 se integrará dentro de XNA Framework como parte del API gráfica (aunqué serán necesarios cambios, así que el API gráfica de XNA y MDX 2.0 no serán iguales) y algunas de las APIs actuales de DirectX serán sustituídas por otras (entre ellas, DirectSound por XACT y DirectInput por XInput).

En resumen, así es como creo que está el patio en la actualidad...

miércoles, julio 19, 2006

Algunos enlaces sobre el XNA Framework.

Concéis el XNA Framework? Se trata del nuevo Framework orientado a la creación de juegos compatibles entre XBox 360 y Windows. Está basado en .NET (sí, sí han portado el CLR a XBox 360) y su objetivo primordial es facilitar la creación de juegos que sean compatibles con Windows y XBox 360 sin que sea necesario código propio para cada plataforma.

Desde que MS anunció el XNA Framework, varias dudas se han ido planteando: p.ej. qué ocurrirá con Managed DirectX (actualmente MDX 2.0 está en fase beta), o como se gestionarán las diferencias de dispositivos entre plataformas (p.ej. como se gestionarán ratones o teclados que son más propios de PC que de XBox).

Os dejo algunos posts muy interesantes sobre XNA para que les vayais hechando un vistazo si os apetece.

  • Para empezar un post donde Albert Ho habla de XNA Framework. Resumiendolo muy por encima, comenta que MDX pasará a convertirse en el API gráfico de XNA y que DirectSound será reemplazado por XACT y DirectInput por XInput. Lo que no queda muy claro es como podremos gestionar dispositivos no compatibles con XInput desde XNA, p.ej.

  • Una entrevista con Matt Lee. Mucho, mucho no habla de XNA, si acaso cuatro cosillas sobre XNA Build (variación de MSBuild) y XNA Studio (un Visual Studio orientado a la creación de juegos). Pese a no hablar mucho de XNA es una entrevista bastante interesante.

  • Un post de David Weller donde se mencionan algunos de los puntos claves del XNA Framework. Interesante el último punto donde menciona que XNA Framework no admitirá referencias a System.Drawing o System.Windows.Forms. Veremos como impacta esto en el desarrollo de aplicaciones no full-screen en XNA.


En resumen, todavía hay muy poca información sobre XNA y es cierto que quedan muchas dudas en el tintero, pero la verdad es que las noticias que van apareciendo son muy interesantes ;-)

Un par de buenos tutoriales de MDX

Si estais empezando a batallar com Managed DirectX, os recomiendo los siguientes tutoriales:

  1. Tutorial de Managed DirectX de C-Unit. Tienen también un tutorial de DirectX no managed.

  2. Riemer's DirectX Tutorials for C# and C++. La parte de C# es Managed DirectX, la parte de C++ es DirectX tradicional.


Por otro lado en breve empezaré a publicar una serie de posts-tutoriales sobre Managed DirectX. No voy a contar nada que no esté ya publicado por esos mundos de dios, pero intentaré que sea un tutorial fácil de entender, orientado básicamente a programación 2D usando Direct3D y en castellano.

miércoles, julio 12, 2006

[OT] Sintaxis coloreada de VS.NET en blogger

Jejejee... habéis visto el post justo anterior a éste?
Que os parece la sintaxis coloreada del código? ;)

Algunos sistemas de blog (como p.ej. la comunidad clearscreen tienen un sistema de coloreado automático de sintaxis (cosa lógica, pues son sistemas de blogs orientados al desarrollo de S/W), pero blogger no. Y hombre, colorear la sintaxis "a mano" es posible para trozos de código pequeños, pero puede ser un infierno para trozos de código más largos.

Por eso he estado buscando algún sistema para pasar código coloreado de VS.NET a formato HTML, manteniendo los colores... y lo he encontrado aquí. Es un add-in para VS.NET 2005 que añade una opción en el menú contextual llamada Copy as HTML. Además permite establecer bastantes parámetros para personalizar el HTML generado.

O sea que, ahora ya podré colorear los trozos de código que vaya poniendo por ahí! ;)

PD: Si usais blogger y este add-in, ojo si usáis el modo wysiwyg de blogger, ya que tiene la manía de sustituir los   por un espacio en blanco... con lo que se pierden las indentaciones!

El bucle de juego definitivo

El bucle de juego (game loop) es una de las características más importantes de los juegos. Al revés de las aplicaciones de gestión, que estan guiadas por eventos, un juego generalmente tiene cosas que hacer (p.ej. animaciones) aunque el usuario no haga nada.
Un bucle de juego eficiente hará que el juego ocupe menos CPU y por lo tanto indirectamente, pueda generar más fps.

En este post, Tom Miller propone un bucle de juego muy interesante, tanto por su sencillez como por su eficiencia. Se basa en el uso del API Win32 PeekMessage().

Basándome en este bucle de juego he creado una clase que simplemente lo encapsula. El código de la clase (a la que presuntuosamente he llamado GameEngine) es el siguiente:

namespace foo

{

    class GameEngine

    {

        Form1 frm = new Form1();

        public void MainLoop()

        {

            System.Windows.Forms.Application.Idle += new EventHandler(OnApplicationIdle);

            frm.InitializeGraphics();

            System.Windows.Forms.Application.Run(frm);

        }

 

        private void OnApplicationIdle(object sender, EventArgs e)

        {

            while (AppIddle)

            {

                // Update Graphics

                // Render Graphics

            }

        }

 

        private bool AppIddle

        {

            get

            {

                NativeMethods.Message msg;

                return !NativeMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, 0);

            }

        }

    }

}

static class NativeMethods

{

        [StructLayout(LayoutKind.Sequential)]

        public struct Message

        {

            public IntPtr hWnd;

            public IntPtr msg;

            public IntPtr wParam;

            public IntPtr lParam;

            public uint time;

            public System.Drawing.Point p;

        }

 

        [System.Security.SuppressUnmanagedCodeSecurity]

        [DllImport("User32.dll", CharSet = CharSet.Auto)]

        public static extern bool PeekMessage(out Message msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags);

}



Nota: Form1 es el nombre de la clase formulario principal.

Usando esa clase la función Main() quedaría de la siguiente manera:

        [STAThread]

        static void Main()

        {

            // Inicializaciones previas

            GameEngine ge = new GameEngine();

            ge.MainLoop();       

            // Destrucciones finales

        }

    }



Simple, sencillo... y eficaz!

martes, julio 11, 2006

Reiner's Tilesets - recursos gráficos freeware

Si como muchos desarrolladores el tema gráfico no es lo vuestro ;) y buscais recursos gráficos para desarrollar vuestros juegos (2D) echad un vistazo a Reiner's Tilesets. Contiene varios gráficos freeware que podeis usar en vuestros desarrollos... Están orientados a juegos de estrategia o tipo Diablo, aunque hay un poco de todo... :-)

lunes, julio 10, 2006

ColorKey en texturas PCX

En el post anterior puse una posible manera de obtener texturas a partir de archivos PCX. Dado que se usa Texture.FromBitmap, no se puede establecer el ColorKey de la textura, lo que invalida el método para crear Sprites (o lo complica demasiado, vamos).

Los métodos que permiten establecer el ColorKey de una textura están en la clase TextureLoader en los métodos FromStream y FromFile respectivamente.
Así que reescribí el código para cargar la texura usando TextureLoader. Teoricamente no debía ser muy complicado, pues en el MemoryStream tenía la información de la Textura en formato BMP que es uno de los soportados.
El código que probé era:

public Texture TextureFromDIB(uint dib, Device device)
{
uint hmem;
byte[] content;
// open and allocate a memory stream
hmem = FreeImage.OpenMemory(IntPtr.Zero, 0);
bool b = FreeImage.SaveToMemory(FreeImageAPI.FIF.FIF_BMP, dib, hmem, 0);
FreeImage.Unload(dib);
IntPtr ptr = IntPtr.Zero;
int size_in_bytes = 0;
FreeImage.AcquireMemory(hmem, ref ptr, ref size_in_bytes);
content = new byte[size_in_bytes];
Marshal.Copy(ptr, content, 0, size_in_bytes);
System.IO.MemoryStream ms = new System.IO.MemoryStream(content);
Bitmap bmp = new Bitmap(ms, false);
FreeImage.CloseMemory(hmem);
ms.Seek(0, System.IO.SeekOrigin.Begin);
Texture t = TextureLoader.FromStream(device, ms, 0, 0, 0, Usage.SoftwareProcessing, Format.P8, Pool.Managed, Filter.Point, Filter.Point, Color.Magenta.ToArgb());
ms.Close();
return t;
}


Al probarlo mi gozo en un pozo :(
El código me lanzaba una excepción Microsoft.DirectX.Direct3D.InvalidDataException (D3DXERR_INVALIDDATA).
Primero pensé que quizá FreeImage guardaba los datos en alguna variación de BMP que quizá no era soportada por TextureLoader, así que guardé el contenido del MemoryStream en un fichero y intenté cargar la textura usando el mismo método FromStream, pasándole un FileStream apuntando al fichero recién creado: funcionó.

Al final pude dar con el problema: faltaba posicionar el puntero de lectura del MemoryStream al inicio de los datos:

FreeImage.CloseMemory(hmem);
ms.Seek( 0, System.IO.SeekOrigin.Begin );
Texture t = TextureLoader.FromStream(device, ms, ...);

Llamando a Seek justo antes de la llamada a FromStream funcionó todo perfectamente! ;)

sábado, julio 08, 2006

Texturas a partir de archivos PCX

Para el proyecto que estoy desarrollando me intersaba dar soporte a archivos PCX: es decir crear texturas a partir de archivos PCX.

La clase TextureLoader permite cargar una textura a partir de un archivo gráfico, da soporte a varios formatos (entre ellos .bmp, .jpg y .png como más destacados) pero no da soporte a arhivos PCX.
Así pues intenté ver como podía cargar un archivo PCX y crear una textura Direct3D a partir de él.
Para ello el primer paso fue encontrar alguna librería para leer archivos PCX. Estuve buscando por google a ver si encontraba alguna librería .NET (gratuita) para leer este tipo de archivos. No encontré ninguna pero vi que FreeImage tenia un wrapper de C#, así que me decidí utilizarla. Ya había usado FreeImage en proyectos anteriores (con DirectDraw y C++) y me había gustado así que me pareció una buena idea.

La clase Texture tiene un método llamado fromBitmap, que a partir de un objeto System.Drawing.Bitmap crea el objeto Textura correspondiente. Así que en resumen se trataba de obtener un Bitmap a partir de FreeImage.

FreeImage és una librería que trabaja con varios formatos gráficos, pero internamente los convierte todos al formato DIB (Device Independent Bitmap).

El primer paso era cargar la imagen con FreeImage:

uint handle = FreeImage.Load(FIF.FIF_PCX, System.Windows.Forms.Application.StartupPath + @"\..\..\texture.pcx", 0);

Para pasar la imagen del formato DIB interno de FreeImage al formato Bitmap de .NET se me ocurrió utilizar las funciones de memoria de la propia FreeImage. En concreto lo que quería hacer era:
  1. Guardar la imagen en un bloque de memoria en formato Bitmap
  2. Copiar la información en un array de bytes
  3. Crear un objeto Bitmap inicializado con los datos del array de bytes.
El primer problema que me encontré era que el wrapper de C# para FreeImage estaba incompleto: Las funciones de manejo de memoria de FreeImage no aparecían en el wrapper. Por suerte el wrapper no es nada más que un pequeño archivo .cs con las definiciones de P/Invoke de las funciones de FreeImage, así que pude añadir las definiciones que me faltaban:

[DllImport(dllName, EntryPoint = "FreeImage_OpenMemory")]

public static extern FIMEMORY OpenMemory(IntPtr bits, Int32 size_in_bytes);

[DllImport(dllName, EntryPoint = "FreeImage_CloseMemory")]

public static extern void CloseMemory(FIMEMORY stream);

[DllImport(dllName, EntryPoint = "FreeImage_SaveToMemory")]

public static extern bool SaveToMemory(FIF fif, FIBITMAP dib, FIMEMORY stream, int flags);

[DllImport(dllName, EntryPoint = "FreeImage_AcquireMemory")]

public static extern long AcquireMemory(FIMEMORY stream, ref IntPtr data, ref int size_in_bytes);


Una vez añadido esto en el wrapper (y recompilarlo) usé el siguiente código para obtener un objeto System.Drawing.Bitmap:

uint hmem;
int w, h, stride;
byte[] content;
// Obtenemos un buffer de memoria de FreeImage
hmem = FreeImage.OpenMemory(IntPtr.Zero, 0);
// Grabamos la imagen en el buffer de memoria en formato BMP
bool b = FreeImage.SaveToMemory(FreeImageAPI.FIF.FIF_BMP, dib, hmem, 0);
FreeImage.Unload(dib);
// Obtenemos un puntero (unmanaged) al buffer de memoria de FreeImage
IntPtr ptr = IntPtr.Zero;
int size_in_bytes = 0;
FreeImage.AcquireMemory(hmem, ref ptr, ref size_in_bytes);
content = new byte[size_in_bytes];
// Copiamos el contenido del buffer de memoria unmanaged a un byte[]
Marshal.Copy(ptr, content, 0, size_in_bytes);
// Creamos un MemoryStream que apunte al contenido copiado y creamos el Bitmap
System.IO.MemoryStream ms = new System.IO.MemoryStream(content);
Bitmap bmp = new Bitmap(ms, false);
// Cerramos el buffer de memoria de FreeImage (para evitar memory-leaks)
FreeImage.CloseMemory(hmem);
ms.Close();
// Listos.
return bmp;


En este punto el Bitmap está creado, así que ya sólo queda usar el método fromBitmap de la clase Texture y ya tenemos una textura Direct3D lista para usar.

En mi caso para hacer una prueba rápida cogí el Tutorial #5 de Direct3d (muestra un cilindro texturizado) y lo ejecuté dos veces: una con una textura PCX y otra con un archivo BMP convertido (usé Irfanview) a partir del PCX , y comprobé que en ambos casos el resultado era el mismo.

Nota: Aparte del wrapper "oficial" de FreeImage, que se encuentra en su página oficial, encontré otro wrapper que incluía las definiciones de P/Invoke de todas las funciones de FreeImage que le faltan al wrapper "oficial" además de ofrecer algunas funciones helper adicionales. Este wrapper está en http://hauntedhousesoftware.com/blog/Files/FreeImage.cs

miércoles, julio 05, 2006

El comienzo de todo...

Hola a todos!
Al final me he decidido a crear este blog, donde voy a comentar mis experiencias, frustraciones, alegrías y demás sobre Managed DirectX.

Antes que nada... ¿quien soy yo? Pues me llamo Eduard Tomàs, edu para los amigos, y en la actualidad trabajo como director de proyectos para raona. Pero este blog no tiene nada que ver con temas profesionales, si no con uno de mis hobbies: el desarrollo de videojuegos, y más concretamente usando Managed DirectX.

Pues nada... espero que nos sigamos leyendo por ahí ;-)