Resistance is Futile

Subiendo Texturas a OpenSimulator

Una de las tareas que tengo que hacer es poder subir una serie de imagenes como textutras automaticamente a OpenSimulator, asi que me di a la tarea de buscar como hacerlo y hacer un pequeño programa que ilustre los pasos que se deben seguir.

Se deben tener algunas consideraciones antes de comenzar, la primera es con respecto al tamaño de las imagenes, las cuales deben tener un tamaño divisible por dos y deben ser cuadradas o rectangulares respetando ciertas reglas en la relacion del ancho y el alto, tambien se debe tener encuenta que una imagen mayor a 1024 pixeles se considera muy grande y es dificil de cargar en el cliente, se recomiendan tamaños como 256x256, 512x512.

Para mayor informacion :
http://wiki.secondlife.com/wiki/Image_System
Image Sizes for Second Life

Tambien debemos tener encuenta el formato de codificacion de la imagen, ya que el cliente utiliza imagenes JPEG-2000, si se tiene un editor de imagenes que genere este formato es ideal utilizarlo, pero la mayoria de las veces las imagenes a subir estan en formatos PNG,JPG entre otros, por lo que se debe convertir la imagen utilizando por ejemplo la libreria openjpeg.

Imagen a Subir

Imagen a Subir

La textura a utilizar como prueba tiene formato PNG y un tamaño de 512x512

Escribir el Programa :

  • Abrir una consola
  • Crear el directorio para nuestro programa
    mkdir TextureUploader
    cd TextureUploader
  • Copiar las dlls necesarias de la libreria libopenmetaverse compiladas anteriormente
    cp <directorio libopenmv>/trunk/bin/OpenMetaverse.dll .
    cp <directorio libopenmv>/trunk/bin/OpenMetaverseTypes.dll .
    cp <directorio libopenmv>/trunk/bin/OpenMetaverseTypes.dll.config .
    cp <directorio libopenmv>/trunk/bin/OpenMetaverse.StructuredData.dll .
    cp <directorio libopenmv>/trunk/bin/log4net.dll .
    cp <directorio libopenmv>/trunk/bin/openjpeg-dotnet.dll .
  • Crear el programa en C#
    vi TextureUploader.cs

    using System;
    using System.Drawing;
    using OpenMetaverse;
    using OpenMetaverse.Capabilities;
    using OpenMetaverse.Imaging;
     
    public class TexturaUploader {
    	public static void Main(string[] args) {
     
    		// Realizar el login
    		GridClient client = new GridClient();
    		LoginParams loginParams = client.Network.DefaultLoginParams(
    			"Juan","Perez","1234","ImageUploader","0.1");
    		loginParams.URI = "http://192.168.1.3:9000";
    		if(!client.Network.Login(loginParams)) {
    			Console.WriteLine(client.Network.LoginMessage);
    			return;
    		}
     
    		// Convertir imagen a JPEG-2000
    		Bitmap bitmap = (Bitmap) System.Drawing.Image.FromFile("OpenSIM_01.png");
    		byte[] data  = OpenJPEG.EncodeFromImage(bitmap,false);
     
    		// Obtener el identificador del directorio de las texturas
    		UUID folderID = client.Inventory.FindFolderForType(AssetType.Texture);
     
    		// Crear un nuevo item con los datos de la imagen, en el directorio de texturas
    		client.Inventory.RequestCreateItemFromAsset(data,"image01","Image Upload"
    			,AssetType.Texture,InventoryType.Texture,folderID
    			,delegate(CapsClient capsClient, long bytesReceived,
    				long bytesSent, long totalBytesToReceive, long totalBytesToSend) {
    				if(bytesSent &gt; 0)
                                    	Console.WriteLine(String.Format("Texture upload: {0} / {1}",
    						bytesSent,totalBytesToSend));
    			}
    			,delegate(bool success, string status, UUID itemID, UUID assetID) {
                            	Console.WriteLine(String.Format(
                                    	"RequestCreateItemFromAsset() returned: Success={0}, Status={1}, ItemID={2}, AssetID={3}",
                                    	success, status, itemID, assetID));
    			}
    		);
     
    		// Salir
    		client.Network.Logout();
    	}
    }
  • Compilar el programa :
    gmcs -lib:. -r:System.Drawing,OpenMetaverse.dll,OpenMetaverseTypes.dll TextureUploader.cs
  • Ejecutar el programa :
    mono TextureUploader.exe

Al momento de ejecutar el programa una excepcion fue lanzada :
Unhandled Exception: System.DllNotFoundException: libopenjpeg-dotnet-2.1.3.0-dotnet-1

Se debe a que no tenemos la libreria de enlace entre openjpeg y .NET, la busque en la distribucion del la libreria pero no la encontre asi que la descargue de internet al directorio.

  • wget http://opensimulator.org/svn/opensim/trunk/bin/libopenjpeg-dotnet-2.1.3.0-dotnet-1.so

Ahora podemos ejecutar el programa otra vez :

marlonj@blackbox:~/tmp/MyBot$ mono TextureUploader.exe
47 [1] INFO  - No log configuration found, defaulting to console logging
521 [2] INFO  - : Connecting to (192.168.1.3:9000)
673 [3] INFO  - : Received a region handshake for OpenSim Test (192.168.1.3:9000)
752 [4] WARN  - : Received a duplicate of packet #2, current type: ParcelOverlay
1229 [1] INFO  - : Logging out
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 4096 / 91313
Texture upload: 1201 / 91313
RequestCreateItemFromAsset() returned: Success=True, Status=, ItemID=ecd6a5e5-24b9-415b-b57d-07a87c674c65, AssetID=226c7ea3-8f57-4a87-88af-960593dc1db0
6231 [1] INFO  - : NetworkManager shutdown initiated
6232 [1] INFO  - : Caps system for OpenSim Test (192.168.1.3:9000) is aborting

No hay entradas relacionadas.

No Responses to “Subiendo Texturas a OpenSimulator”

Leave a Reply

Powered by WordPress | Designed by Elegant Themes