Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Pulsar LMTools 1.0 Beta 1

Iniciado por Lord Trancos, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Lord Trancos

                                Acabo de liberar la primera beta de mis Pulsar LMTools! :riendo:

Se trata de una serie de herramientas para crear lightmaps.

Ya publique hace unos dias un par de techdemos. En esta ocasion, ademas de la techdemo vienen los programitas para crear los lightmaps y la documentacion necesaria.

Lo podeis encontrar en mi Web :sonriendo:

                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Lord Trancos

                                Parece ser que los de Web1000 han decidido cambiar mi pagina web por una pagina porno :agh:

Os pido disculpas si habeis intentado entrar y os ha salido eso :triste:

Ya esta corregido, http://www.dxlab.tk vuelve a apuntar a mi pagina de geocities. (tal vez tengais que limpiar el cache del navegador)

                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Frodrig

                                Lord,

felicidades por las herramientas, aunque yo no pueda ser objetivo ya que no estoy en un proyecto en el que las tenga que utilizar (de hecho, no estoy ya en ningun proyecto).

Lo que si que te interesara saber es que ahora LMDX ya si que carga mapas, bueno, casi. Me carga sin problemas el archivo "map.x" con el resto "map.1.lmts" y "map.3.lmts" tengo los problemas que siempre te habia comentado. Creo que estoy puede ayudarte.

Un saludo.                                

Lord Trancos

                                Muchas gracias Frodig, justamente te queria preguntar eso :riendo: Creo que me sera de mucha ayuda.                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

ethernet

como molaria q te curraras un tutorial de como se calculan las coordenadas de textura del ligthmap xDDD.

mola el programa y la demo de la fabrica.

saludos

Lord Trancos

                                Gracias ethernet, me alegro q te guste ;)

Ultimamente no tengo muchas ganas de escribir tutos, asi que tendras que conformarte con el codigo fuente, pero como todavia creo que tardare bastante en sacar una version nueva del programa (la cual incluira el codigo fuente), pues te pongo aqui explicaillo el codigo que uso para las coordenadas de textura de los lightmaps. No se, si te parece buena idea incluso podria servir como "codigo de la semana" :) aunque el codigo no me lo he inventado yo :oops:





-------------------



NOTA: Este codigo fuente esta basado en el tutorial y la demo (escrita en VC++) sobre lightmaps por Tobias Johansson.



   http://come.to/polygone

   http://home.bip.net/tobias.johansson1/tut_lightmap.htm



-------------------



const

 X = 0;

 Y = 1;

 Z = 2;



type

 // vector

 P_Vec = ^T_Vec;

 T_Vec = array[0..2] of single;



 PLMTS_Vertex = ^TLMTS_Vertex;

 TLMTS_Vertex = packed record

   x, y, z : single;

   u1, v1, u2, v2 : single;

 end;



procedure CreateLightmap(_triNum: word;

                        _v1, _v2, _v3 : PLMTS_Vertex);



var

 _e1, _e2, _n : T_Vec;

 _nlc : TXYZ;

 _minU, _minV, _maxU, _maxV, _dU, _dV, _s, _dist, _val : single;

 _uv00, _vec1, _vec2, _uvEdge1, _uvEdge2 : T_Vec;

 _resX, _resY : longint;



 // ----------------------------



 procedure getUV1(_p : P_Vec; var _u, _v : single);



 begin

   case _nlc of

     vectX : begin _u := _p^[Z]; _v := _p^[Y]; end;

     vectY : begin _u := _p^[X]; _v := _p^[Z]; end;

     vectZ : begin _u := _p^[X]; _v := _p^[Y]; end;

   end;

 end;



 // ----------------------------



 procedure getUV2(var _u, _v: single);



 begin

   _u := _u - _minU;

   _v := _v - _minV;

   _u := _u / _dU;

   _v := _v / _dV;

 end;



 // ----------------------------



begin

 // Primero obtenemos los bordes (edges) del triangulo

 triTwoEdges(@_v1^, @_v2^, @_v3^, _e1, _e2);



 // Ahora calculamos la normal del triangulo

 _n := triNormal(@_e1, @_e2);



 // Ahora averiguamos cual de los 3 componentes de la normal

 // es mas grande; cuidado con los valores negativos!:

 // usad: abs(_n.x), abs(_n.y) y abs(_n.z)

 _nlc := vectLargestComponent(@_n);



 // Ahora obtenemos lo que podriamos llamar el

 // Bounding-Rectangle 2D (_minU, _minV, _maxU, _maxV)

 // osea un rectangulo con 2D dimensiones (como todos los rectangulos).

 // Imaginate que cogemos el poligono y lo metemos

 // dentro de una caja. Pues este Bounding Box representa

 // la cara mas grande de esa caja.

 getUV1(@_v1^, _v1^.u2, _v1^.v2);

 getUV1(@_v2^, _v2^.u2, _v2^.v2);

 getUV1(@_v3^, _v3^.u2, _v3^.v2);



 _minU := _v1^.u2;

 _minV := _v1^.v2;

 _maxU := _v1^.u2;

 _maxV := _v1^.v2;



 if (_v2^.u2 < _minU) then _minU := _v2^.u2;

 if (_v2^.v2 < _minV) then _minV := _v2^.v2;

 if (_v2^.u2 > _maxU) then _maxU := _v2^.u2;

 if (_v2^.v2 > _maxV) then _maxV := _v2^.v2;



 if (_v3^.u2 < _minU) then _minU := _v3^.u2;

 if (_v3^.v2 < _minV) then _minV := _v3^.v2;

 if (_v3^.u2 > _maxU) then _maxU := _v3^.u2;

 if (_v3^.v2 > _maxV) then _maxV := _v3^.v2;



 // Ahora ajustamos ese Bounding-Rectangle de forma que

 // se ajuste a una rejilla 2D. Las celdas de esa rejilla son cuadradas

 // (misma altura y anchura); tienen el tamaño de LumelSize x LumelSize

 // LumelSize es el tamaño que tendra un pixel de un lightmap

 // en unidades 3D. Por ejemplo; si tienes una pared de 100 unidades

 // de alto y 100 unidades de ancho, y quieres ponerle un lightmap de

 // 10x10 pixels, el lumel size sera 100/10 = osea 10 unidades.

 // Ojo: hay que ajustar el Bounding-Rectangle a la rejilla pero

 // el Bounding-Rectangle "original" tiene que caber completamente

 // dentro del Bounding-Rectangle ajustado.

 _s := Int(_minU / g_LMap_Lumel_Size) * g_LMap_Lumel_Size;

 if _s > _minU then _minU := _s - g_LMap_Lumel_Size else _minU := _s;

 _s := Int(_minV / g_LMap_Lumel_Size) * g_LMap_Lumel_Size;

 if _s > _minV then _minV := _s - g_LMap_Lumel_Size else _minV := _s;



 _s := Int(_maxU / g_LMap_Lumel_Size) * g_LMap_Lumel_Size;

 if _s < _maxU then _maxU := _s + g_LMap_Lumel_Size else _maxU := _s;

 _s := Int(_maxV / g_LMap_Lumel_Size) * g_LMap_Lumel_Size;

 if _s < _maxV then _maxV := _s + g_LMap_Lumel_Size else _maxV := _s;



 // Agrandamos mas aun el tamaño del Bounding-Rectangle. Le ponemos

 // un borde que corresponde a 1 lumel (osea 1 pixel). Esto es para

 // evitar "artifacts" causados por el filtrado bilineal (u otro tipo de

 // filtrado de textura)

 _minU := _minU - g_LMap_Lumel_Size;

 _minV := _minV - g_LMap_Lumel_Size;

 _maxU := _maxU + g_LMap_Lumel_Size;

 _maxV := _maxV + g_LMap_Lumel_Size;



 // Ahora obtenemos las dimensiones del Bounding-Rect

 _dU := _maxU - _minU;

 _dV := _maxV - _minV;



 // Y ahora obtenemos el tamaño del lightmap (en pixels)

 _resX := round(_dU / g_LMap_Lumel_Size);

 _resY := round(_dV / g_LMap_Lumel_Size);



 // Ahora deberiamos de que comprobar si el tamaño del lightmap es

 // aceptable. Ya que si despues queremos meterlo en una textura

 // de 256x256 tendra que caber ahi dentro...



 // Finalmente obtenemos las tan deseadas coordenadas UV

 // (con valores de 0 a 1) para el lightmap.

 // Despues cuando empaquetamos varios lightmaps en

 // una unica textura hay que ajustarlos...

 getUV2(_v1^.u2, _v1^.v2);

 getUV2(_v2^.u2, _v2^.v2);

 getUV2(_v3^.u2, _v3^.v2);



 // Ya tenemos las coordenadas de textura!!! Ahora lo que hago

 // es obtener unos vectores que se usaran para calcular la

 // posicion de cada lumel (un lumel es un pixel de un lightmap)

 // en coordenadas 3D.



 _dist := - vectDot(@_n, @_v1^); // vectDot = producto escalar

 case _nlc of

   vectX : begin

     _val  := - (_n[Z] * _minU + _n[Y] * _minV + _dist) / _n[X];

     _uv00 := vect(_val, _minV, _minU);



     _val  := - (_n[Z] * _maxU + _n[Y] * _minV + _dist) / _n[X];

     _vec1 := vect(_val, _minV, _maxU);



     _val  := - (_n[Z] * _minU + _n[Y] * _maxV + _dist) / _n[X];

     _vec2 := vect(_val, _maxV, _minU);

   end;



   vectY : begin

     _val  := - (_n[X] * _minU + _n[Z] * _minV + _dist) / _n[Y];

     _uv00 := vect(_minU, _val, _minV);



     _val  := - (_n[X] * _maxU + _n[Z] * _minV + _dist) / _n[Y];

     _vec1 := vect(_maxU, _val, _minV);



     _val  := - (_n[X] * _minU + _n[Z] * _maxV + _dist) / _n[Y];

     _vec2 := vect(_minU, _val, _maxV);

   end;



   vectZ : begin

     _val  := - (_n[X] * _minU + _n[Y] * _minV + _dist) / _n[Z];

     _uv00 := vect(_minU, _minV, _val);



     _val  := - (_n[X] * _maxU + _n[Y] * _minV + _dist) / _n[Z];

     _vec1 := vect(_maxU, _minV, _val);



     _val  := - (_n[X] * _minU + _n[Y] * _maxV + _dist) / _n[Z];

     _vec2 := vect(_minU, _maxV, _val);

   end;

 end;



 // vectSubV(a, b) - es una simple resta de vectores (a - b)

 _uvEdge1 := vectSubV(@_vec1, @_uv00);

 _uvEdge2 := vectSubV(@_vec2, @_uv00);



 // una vez tenemos  los vectores _uv00, _uvEdge1 y _uvEdge2

 // podemos calcular el punto 3D que corresponde con cualquiera

 // de los lumels del lightmap.

 // Para ello uso esta funcion:



 function GetPoint(_sx, _sy : single): T_Vec;



 var _u, _v : single;



 begin

   _u := _sx / _lightmap_width;

   _v := _sy / _lightmap_height;



   Result[X] := _uv00^[X] + _uvEdge1^[X] * _u + _uvEdge2^[X] * _v;

   Result[Y] := _uv00^[Y] + _uvEdge1^[Y] * _u + _uvEdge2^[Y] * _v;

   Result[Z] := _uv00^[Z] + _uvEdge1^[Z] * _u + _uvEdge2^[Z] * _v;

 end;





Espero que se entienda todo bastante bien :)                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

ethernet

si, seria muy buena idea para codigo de la semana, animate y mandalo.

Por otro lado no entiendo nada de nada xDD maldito pascal !! ;PP

gracias por el codigo.

saludos

Lord Trancos

                                jejeje resulta curioso q con una firma como esa no lo entiendas xDDD
pero weno, no pasa nada, le hechas un vistazo al ejemplo original en visual C y listos... :) lo q pasa es que no me acuerdo si dicho ejemplo ajustaba el "Bounding Rectangle" a una rejilla ... o si eso fue una mejora mia...  :-?  pero en caso de que no lo tenga te recomiendo encarecidamente que lo añadas, ya que de lo contrario los lightmaps no te encajaran del todo bien... esto lo notarias sobretodo en las sombras.

Weno, mejorare un poco los comentarios y si eso lo enviare :)                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Lord Trancos

                                Weno, como ya he comentado en otra seccion, he sacado un parche (150k) que corrige el bug de los flashes de colores. Asi q Frodig y el resto de la gente q teniais problemas, ahora os deberia ir bien. :)

pos eso, el parche esta en mi web :)                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

ethernet

para cuando el cotw del ligthmap ! ¬¬U

CoLSoN2

                                eso eso!!                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Lord Trancos

                                :oops: Sorry,.... ASAP                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

ethernet


Lord Trancos

                                jop, un poco de paciencia :P                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

ethernet







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.