Jump to content

Mis Rutinas Graficas


DarIOI

Publicaciones recomendadas

Buenas!

Mucho tiempo que no me pasaba por acá, pero no quiere decir que esté ausente.

Cosas en lo personal, atender la facultad, y los pequeños aspectos de lo cotidiano, me hacen retrasar un proyecto que tengo en mente para ésta comunidad.

Primero que todo quiero que prueben este programita.... es simple, se trata de un visualizador de meshes de un archivo TR4, que se puede observar en dos modos: texturizado y malla ( wireframe ).

La idea es que observen bien como se renderizan los gráficos, si ven algo incorrecto, algún error.

 

Nunca me decidí encarar bien el proyecto; primero estuve en OpenGL para pasarme a Directx 7.0, que luego subí a directx 8.1, luego probé implementarlo en

varios lenguajes; Visual Basic, microsoft Visual c++, Delphi, y ahora estoy preparandolo en el entorno de c++ Builder (tambien de Borland o_O ). Cambié de

paradigmas, de lo procedural para ahora implementarlo en una forma Orientada a Objetos, que me es mucho más fácil entenderlo para mí.

 

La historia ES larga, pero aquí va. Son mis primeros pasos como un programador exitoso. :thumb:

 

PD: Si Natalie o Turbo puedieran verlo, y darme alguna opinión, hay cosas en cuanto a la gráfica que no estoy muy conforme.

TR_Visual_3D.rar

Enlace al comentario
Compartir en otros sitios web

Vale Kali, el borlndmm.dll te lo puedes descargar de aqui.

 

Luego te va a pedir el CC3260mt.dll que lo puedes descargar de aqui

 

Entonces consigues arrancarlo, pero a mi me sale un error:

 

kokomc2.jpg

 

He intentado abrir un archivo .tr4 pero comienzan a salir mensajes de error parecidos a los de la imagen que he puesto y el TR Visual 3D se me cierra.

 

¿A ti te funciona bien, Dario?

Enlace al comentario
Compartir en otros sitios web

Hello dario,

 

Que bueno que al fin de decidistes a dar el siguiente paso; me acuerdo cuanto te rogó turbo para que te involucraras en esta tipo de programacion.

 

Ya probe el programa, a mi no me da error, seguramente ya tenia los dll de borland instalados de algun otro programa, deve ser algun tipo de opcion de compilacion que no te genera un standalone completo de ejecutable, si no que requiere de algunos runtime de borland, bueno eso te pasa por traicionar a Delphi. :)

 

Sin envargo aparte de eso hay otro tipo de problemas, primero la pantalla esta seteada a un tamaño fijo bastante grande, como de 1280 x 1024, talvez no todos tenemos un monitor y una tarjeta bastante buena, pero el problema verdadero es que la la ventana de renderizado no muestra nada, al abrir un tr4 y seleccionar cualquier mesh de la lista es imposible ver algo, el problema parece estar relacionado con la camara y el mouse, pareciera que intentantes dar soporte de zoom o pan ó rotado con el mouse ya que por aproximadamente 10 segundos logré ver un mesh rotando en la ventana cuando estaba moviendo el mouse en las lista de meshes pero despues desaparecio y por mucho que intente no logre volver a ver nada.

 

Si estas usando directinput para capturar el movimiento del mouse ten en cuenta que por defecto el movimiento del mouse es reportado cuando lo mueves incluso para otras tareas como moverse para seklecionar el menu archivo, o moverse para selecionar el mesh, deves restringir la captura del movimiento solo cuando se mueve en el area del viewport; sospecho que lo que esta pasando es que la camara se mueve y se pierde cuando se utiliza el mouse para abrir el tr4.

 

espero una revision de tu programita.

 

see ya

post-1830-1213323282_thumb.jpg

Enlace al comentario
Compartir en otros sitios web

damn!

he estado teniendo estos problemas desde hace ya tiempo, y es lo que me desanima constantemente...

1) el problema de los archivos los soluciono creando un programa standalone ( hay una opcion para hacerlo )

2) lo que reporta luego erogan y Max, es sencillamente raro....

luego lo comprobé yo mismo probando las cosas en otra PC. Creería que el tema radica en que no hay espacio de memoria? problemas al crear el vertex buffer?

debería hacer un chequeo minucioso.

 

@natalie: vos no has tenido problemas, pero no te renderiza nada. Mhhh, no estoy usando direct input. Simplemente utilizo un componente llamado Timer que lo

asocio al evento de Paint, de tal forma que cada vez que dicho evento es llamado por acción del usuario o del sistema el contenido del panel ( que sería el viewport) es redibujado. No estoy utilizando el metodo SetViewport, eso tendrá que ver??

 

Veo que el tema se me complica mucho mas de lo que me había pensado.

Los mantengo al tanto.

Enlace al comentario
Compartir en otros sitios web

...componente llamado Timer que lo

asocio al evento de Paint, de tal forma que cada vez que dicho evento es llamado por acción del usuario o del sistema el contenido del panel ( que sería el viewport) es redibujado.

 

mmm, creo que lo que me dices es que pones un componente TIMER en la forma, defines una cantidad de millisegundos de intervalos en que se estara ejecutando y en ese evento llamas al methodo de re-paint o refresh de la forma para generar un evento ONPAINT. y dentro del evento ONPAINT ejectutas las instrucciones para dibujar el mesh selecionado.

 

Supongo entonces que el mesh se redibuja en el viewport girando automaticamente, por eso necesitas el timer para forzar el redibujado aunque el usuario no toque nada.

 

Seguramente el viewport lo defines y lo creas una sola vez cuando inicias el programa, sinenevargo es importante que agregues esos pasos en una rutina aparte para que pueda ser ejecutada desde cualquier otro lado y en cualquier momento que se necesite; esta rutina debe de incluir al final algo haci como:

 

D3DXMatrixIdentity(Matproj);

D3DXMatrixPerspectiveFovLH( matProj, PI/4, pcontrol.width/pcontrol.height, 0.1,1000);

 

D3DDEV8.SetTransform(D3DTS_PROJECTION, matProj);

 

 

 

En cada evento ONPAINT tienes que llamar la rutina de redibujado que mas o menos debe de tener las siguientes cosas:

 

//definir la posicion, y hacia adonde esta viendo la camara

 

D3DXMatrixLookAtLH( matView^, _v1, _v2, _v3); //eye, at, Up.

D3DDEV8.SetTransform(D3DTS_VIEW, matView^);

 

//limpiar el viewport y comenzar la escena.

D3DDEV8.Clear(0, NIL, D3DCLEAR_TARGET OR D3DCLEAR_ZBUFFER , Wxcolor(pcolor), 1.0, 0);

 

// Begin the scene.

D3DDEV8.BeginScene;

 

//aplicar la matrix del world

D3DDEV8.SetTransform(D3DTS_WORLD, matWorld);

 

//poner los parametros de redibujado iniciales

// Set the stream source.

D3DDEV8.SetStreamSource( 0, VertexBuffer.vbuffer[k].Buffer, VertexBuffer.vbuffer[k].format_size);

// Set the vertex shader.

D3DDEV8.SetVertexShader(VertexBuffer.vbuffer[k].format);

//poner el modo de dibujado, wireframe o texturizado.

D3DDEV8.SetRenderState(d3drs_fillmode,VertexBuffer.vbuffer[k].Fill_mode);

 

//dibujar el vertex buffer. (ó usar un list index).

D3DDEV8.DrawPrimitive( VertexBuffer.vbuffer[k].primitive,triangles_offset, numtriangles);

 

D3DDEV8.EndScene;

 

//presentar la scena!

D3DDEV8.Present( NIL, NIL, 0, NIL) ; //Importante!!, verificar el resultado de esta funcion, si retorna falso entonces el viewport se perdio y hay que recrearlo!;

 

El viewport tambien se deve recrear si el usuario cambia el tamaño del viewport cuando maximiza o cambia el ancho de la forma etc.

Enlace al comentario
Compartir en otros sitios web

Estoy casi seguro que mis rutinas son perfectas, pues las subí porque me andaban bien.

Lo que realmente me tiene muy perdido es que a cada persona le viene con un error distinto... ahora quiero crear un standalone, y resulta que no renderiza, el viewport si se visualiza perfectamente.

 

Estoy metido con C++, porque es el lenguaje que estoy manejando mientras curso en la facultad, y el IDE del Builder es igual al de delphi.

Lo que no tengo idea es la estabilidad que guarda el builder con directx, que sospecho que es el problema. :hello:

 

éste programita también es una inspiración hacia alguien, y deseo mantener firme el proyecto!

 

explicame natalie:

 

Seguramente el viewport lo defines y lo creas una sola vez cuando inicias el programa, sinenevargo es importante que agregues esos pasos en una rutina aparte para que pueda ser ejecutada desde cualquier otro lado y en cualquier momento que se necesite; esta rutina debe de incluir al final algo haci como:

 

el viewport lo defino con la sentencia:

D3DXMatrixPerspectiveFovLH....

 

y la pongo en el evento OnCreate del form principal, pero ¿donde ó en que caso debería ser llamado nuevamente?

Enlace al comentario
Compartir en otros sitios web

el viewport lo defino con la sentencia:

D3DXMatrixPerspectiveFovLH....

y la pongo en el evento OnCreate del form principal, pero ¿donde ó en que caso debería ser llamado nuevamente?

 

Primero que nada, acabo de probar el segundo test que subistes, a mi este segundo programa me funciona bien, se ve el cuadrado gris centrado en la pantalla, y permanecio ahi todo el tiempo, en mi computadora no se desapareció. incluso tambien automaticamente el cuadrado ajusta su tamaño cuando la ventana se ajusta de tamaño por el usuario; por lo que parece que el comando D3DXMatrixPerspectiveFovLH se ejecuta cada vez que se repinta la forma o tienes capturado el evento ONRESIZE de la forma, esto esta muy bien.

 

Lo que reporta el amigo marcos de que se ve la ecena por un instante y despues desaparece es lo que me paso a mi con tu primer programa, eso esta raro, me pregunto si en el segundo programa tambien estas usando un TIMER para generar un evento ONPAINT; de ser haci trata de cambiar la cantidad de milisegundos; por ejemplo que se repinte la pantalla 24 veces en un segundo, 1000/24 = 42millisegundos; talvez actualmente tenes definido muy poquito tiempo entre repintado y no le estas dando suficiente tiempo para terminar cuando ya se esta ejeutando el siguiente onpaint.

 

Otra cosa: estas usando este comando?

 

D3DDEV8.Present( NIL, NIL, 0, NIL)

 

Esto tiene que estar inmediatamente depues del D3DDEV8.EndScene; sirve para forzar a la tarjeta de video de que muestre la scena en ese punto del programa, de lo contario el directx mostrara la escena cuando le de la gana( es decir muestra la scena solo hasta que vale la pena, dependiendo de si ya tiene un buffer detrabajo con suficientes datos).

 

 

El viewport no solo se crea cuando un programa arranca la primera vez; si no que se tiene que volver a crear incluso varias veces durante el tiempo que el programa este funcionando; ya que por diferentes circustancias el viewport se arruina y deja de funcionar, a este estado se le llama un "device lost"; y el problema es mas serio si creastes las texturas con un flag diferente a D3DPOOL_MANAGED ya que ademas de recrear el viewport tienes que cargar las texturas otra vez.

 

En tu rutina de redibujado despues del D3DDEV8.EndScene deves poner algo como:

 

IF D3DDEV8.Present( NIL, NIL, 0, NIL)<>0 THEN recreateViewports;

 

haz esta prueba con el project1.exe que subistes: ejecuta el programa y mientras esta funcionando ve a las propiedades del desktop en windows y en configuracion cambia la calidad de color de 32bit a 16 bit o cambia la resolucion de la pantalla; despues de hacer eso regresa a ver tu programa y notaras que ya no se ve el poligono con la textura, si no que solo se ve el Tpanel o la forma de la ventana principal. Si logras hacer que tu renderizado sobreviva a un cambio de configuracion de pantalla entonces su programa ya maneja la perdida del device.

 

Que en algunas computadoras tu programa solo se vea un instante y despues se desaparesca podria deverse a que el viewport se arruina una vez al arrancar el programa y ya no se vuelve a restaurar.

 

buena suerte

Enlace al comentario
Compartir en otros sitios web

Crear una cuenta o conéctate para comentar

Tienes que ser miembro para dejar un comentario

Crear una cuenta

Regístrese para obtener una cuenta nueva en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectar

¿Ya tienes una cuenta? Conéctate aquí.

Conectar ahora
×
×
  • Crear nuevo...