Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Temas - tamat

#21
Tengo una clase que deriva de otra, que a su vez deriba de otra:

Texture -> Reource -> Object

El problema surge cuando instancío texture y llamo a un método virtual de texture (que no tienen sus padres) llamado Create, entonces el visual me avisa de que algo raro está pasando porque la pila no encaja bien, entonces debugo y veo que efectivamente al llamar a mi método virtual se me está ejecutando un método totalmente distinto, no el mismo método en la clase padre, directamente uno con parametros y retorno diferente, que obviamente me está dejando la pila hecha un cristo y el visual se da cuenta al ver que no encaja el numero de bytes allocados.

Bien, hasta aquí yo podría pensar - en algun momento he jodido la tabla de funciones virtuales al salirme de algun array o hacer un memset - pero realmente no hay nada raro, creo la instancia, y lo siguiente que hago es llamar al metodo virtual, y los constructores son muy simples, solo ponen a cero las variables (no uso nunca memcpys o memsets, directamente igualo a cero).

Desesperado se me ocurre heredar de Texture una clase Foo, instanciarla y llamar a mi metodo virtual Create, y entonces sí funciona. O sea que Foo sí que deja bien la tabla de funciones virtuales, Texture no.

Intento debugar la tabla para ver si en algun momento se cambia pero en mi tabla de funciones virtuales no sale mi método Create, salen solo los de la clase padre, supongo que el compilador si ve que un metodo no tiene dos implementaciones entonces se ahorra reservarle espacio en la tabla de funciones.

En fin, es desesperante y llevo ya un día perdido con esta chorrada, debería intentar aislar el problema pero es una clase enorme que usa todo mi framework y está jodido.

Si alguien tiene alguna idea se lo agradeceré (aunque como alguien me venga con - has puesto la palabra virtual delante del nombre de la funcion? - me pondré muy tenso... y no quereis que me ponga tenso)
#22
Programación gráfica / Opengl en linux sin ventana
22 de Octubre de 2008, 01:31:35 PM
Resulta que tengo una aplicación en OpenGL que genera N frames y los dumpea a disco. La aplicación se comporta como un comando, tu lo llamas pasandole unos parametros y te genera un output en disco.

Me gustaría que esta aplicación estuviese en un servidor como un servicio (sería llamada desde el servidor http) el problema es que opengl requiere de una ventana para funcionar, sin la cual no se crea el contexto.

Existe alguna manera de lanzar openGL sin tener el sistema de ventanas activado? supongo que no ya que el driver de opengl va adherido al sistema de ventanas pero quizá alguien sepa algun truco.

Gracias
#23
Resulta que tengo una aplicación que va bien en debug y en release va si le doy a F5, pero si en release hago Control F5 entonces veo por consola avisos de problemas con variables (son mensajes mios de control).

Alguien sabe la diferencia entre F5 y Control F5?

Gracias
#24
General Programadores / Newton y aquí nada se mueve
19 de Junio de 2008, 08:36:15 PM
Pues nada, que he tratado de meter Newton en mi juego y aquí nada se mueve.

Primero me lian con que las matrices hay que trasponerlas con respecto a opengl, pero si lo hago entonces todo implosiona.

Si no traspongo entonces aquí nada se mueve, y eso que he puesto gravedades, aceleraciones, etc.

Me tengo que estar olvidando de algo pero miro los ejemplos y es mas o menos lo mismo, voy a hacer un pequeño mapa aquí para ver si veis algo que yo no veo:


//al crear el mundo
// Create the newton world
s_World = NewtonCreate (NULL, NULL);

Vector3 minWorld(-100000,-100000,-100000);
Vector3 maxWorld(100000,100000,100000);
NewtonSetWorldSize(s_World, minWorld.v, maxWorld.v);

//...

//al crear la entidad
//Set the collision
Matrix44 offset;
offset.setTranslation( mesh->center.x, mesh->center.y, mesh->center.z );
physics_collision = NewtonCreateBox (s_World, mesh->halfsize.x, mesh->halfsize.y, mesh->halfsize.z, offset.m);
physics_body = NewtonCreateBody (s_World, physics_collision);
NewtonReleaseCollision (s_World, physics_collision);
NewtonBodySetMatrix(physics_body, model.m );
Vector3 force (0.0f, -100, 0.0f);
NewtonBodySetForce (physics_body, force.v );


//...

//al updatear
NewtonUpdate (s_World, elapsed);

//...

//al pillar la model
NewtonBodyGetMatrix(physics_body, temp.m);
#25
Resulta que estoy teniendo un problema rarisimo con SDL.

El tema es que no consigo que funcione en los ordenadores de las aulas de PCs de mi uni (mientras que en mi PC funciona sin problemas).

Al ejecutar me salta un error de "El programa no se puede ejecutar y será cerrado" (o algo por el estilo). No me pide ninguna DLL, no me dice nada más, solo eso. Si creo la ventana usando GLUT no hay problema, pero si la creo en SDL no va.

Investigando llegué a una web de msdn donde hablaba de que si el manifest está mal (hace referencia a DLLs con el path erroneo) entonces da ese error.

Pero no hablamos de un exe que movemos de pc en pc, sino de uno compilado en el propio PC con el visual que hay instalado, el manifest debería estar bien, claro que de la instalacion de ese visual te puedes fiar poco ya que es bastante chapucero.

He mirado el manifest pero no veo que mencione ninguna DLL, he probado con el depens pero no sale nada raro.

Total, que he agotado todas las opciones, haga lo que haga siempre me sale ese error, ¿alguien tiene alguna idea?

Muchas gracias.
#26
Resulta que estoy teniendo un problema rarisimo con SDL.

El tema es que no consigo que funcione en los ordenadores de las aulas de PCs de mi uni (mientras que en mi PC funciona sin problemas).

Al ejecutar me salta un error de "El programa no se puede ejecutar y será cerrado" (o algo por el estilo). No me pide ninguna DLL, no me dice nada más, solo eso. Si creo la ventana usando GLUT no hay problema, pero si la creo en SDL no va.

Investigando llegué a una web de msdn donde hablaba de que si el manifest está mal (hace referencia a DLLs con el path erroneo) entonces da ese error.

Pero no hablamos de un exe que movemos de pc en pc, sino de uno compilado en el propio PC con el visual que hay instalado, el manifest debería estar bien, claro que de la instalacion de ese visual te puedes fiar poco ya que es bastante chapucero.

He mirado el manifest pero no veo que mencione ninguna DLL, he probado con el depens pero no sale nada raro.

Total, que he agotado todas las opciones, haga lo que haga siempre me sale ese error, ¿alguien tiene alguna idea?

Muchas gracias.
#27
Off-topic / GTA4: Impresiones...
30 de Abril de 2008, 10:57:35 PM
Despues de tanto buzz y tal creo que estaría bien abrir un thread en el foro sobre GTA4 para que cada uno deje sus impresiones:

Yo despues de un par de horas de juego (que no es nada para poder valorar decentemente un juego así) me quedo con lo siguiente:

- La fisica de los coches es brutal, lo que le da mucha jugabilidad.
- Niko tiene bastante carisma, más que C.J. o Tommy.
- La ciudad está modelada impecablemente.
- Los coches se ven de lujo, mucho poly, multitexturing, ademas los daños quedan perfectos.
- El control es muy cómodo, en seguida lo dominas tanto para conduccion como para ir a pie, aunque el freno de mano es un poco incomodo y el freno normal bloquea la direccion con lo que las ostias estan garantizadas.
- Las animaciones impresionan, no quiere decir que no haya clipping y los fallos típicos, pero el Euphoria del que tanto se habla se nota, si atropellas a alguien tanto el golpe como la manera como se repone el tio son perfectas.

De las cosas negativas pues destacar:

- No es una revolucion, que no os timen, es una version mejorada del GTA:SA. Con sus virtudes y defectos, si no os gustaron los anteriores o os cansasteis rápido en este pasará lo mismo. Quiero decir que sigue siendo hacer misiones de conduccion y pegar tiros, con alguna historia como pretexto, algo que por mucho minijuego que haya se hace pesado.
- Los gráficos estan mejor pero aun así a veces no me convencen, las sombras se ven raras debido a un exceso de oversampling, de noche nada castea shadows, el rango de vision es bastante limitado (sí, se ven rascacielos en la distancia, pero los props de la calle te los cortan a los 100 metros y en adelante te meten un blur en plan DoF).
- Rasca, y bastante (en XBOX360), ademas los efectos gráficos quedan raros, demasiado parpadeo para mi gusto. Habría preferido que bajasen ligeramente la calidad para conseguir algo más limpio.

En resumen, es un buen juego, bien acabado y que no defrauda a los que disfrutaron alguno de la saga.

Update: Espero no haberlo reposteado pero veo que el post no está y al postear me dice que ya lo he posteado...
#28
No es una consulta, es solo para contaros algo que me ha pasado hoy en el trabajo.

Llevamos varios meses desarrollando un sistema de prototipado de aplicaciones gráficas bastante cómodo, el problema es que el bucle de render se especifica con algo parecido a un script lo que consume muchisima CPU, siendo la carga de la CPU la que más afectaba al framerate.

Bien, pues ayer me fijé que misteriosamente, cada N veces que ejecutaba la aplicacion esta pasaba de los estandares 30 fps a unos 90 (sin VSync). Si volvía a ejecutar la aplicacion el comportamiento volvía a ser el de 30 fps.

No entendía a qué podía deberse, así que decidí mirar la carga de los cores del QuadCore, y había algo que no me cuadraba, los 4 cores estaban al 40% durante la ejecución y mi aplicación no hace uso de threads en ningun momento.

Hoy un compañero de trabajo me ha sugerido darle afinidad al proceso para que se ejecute en una unica CPU, y tachan, 90FPS, y la carga de los cores me muestra uno al 100% y el resto casi parados.

Al final hemos forzado por aplicación que use un único core usando: SetThreadAffinityMask(GetCurrentThread(),1);

Deduzco que el problema es que intentaba splitear la aplicacion en los 4 cores y acababa pudriendose en las sincronizaciones de los 4 threads.

Avisados estais!
#29
General Programadores / Get Ticks, milisegundos y contadores
16 de Enero de 2008, 06:22:01 PM
Alguien sabe de alguna buena funcion multiplataforma para conseguir un timer con precision de milisegundos? Yo solía usar getTickCount pero es del api de windows, alguien sabe algo equivalente para gcc?

Gracias
#30
Compos / Compo Interactive Fiction. Juegos a la vieja usanza
11 de Diciembre de 2007, 02:12:50 PM


Veo que la gente de TIGSource ha abierto una competicion sin premios para hacer un text-based game. Podeis leer mas información aqui.

La idea me ha parecido muy sana y agradable, pensada para remover un poco la comunidad sin que la competitividad y la excelencia sean un problema. Una competicion por amor al arte y al alcance de todos donde veamos la mente perturbada que cada uno alberga en su cabeza.

¿Os animais a hacer algo parecido aquí? La idea es coger alguno de los editores que recomiendan allí (algunos incluso son No-coders-requiered) como TADS o Inform7 (o directamente programarlo uno mismo), y hacer un juego conversacional en español que no requiera mas de 10 minutos de juego para completarlo (para que sea factible jugarlos todos), a poder ser que plantee un pequeño reto y en el que se vea reflejada un poco esta nuestra comunidad.

Para no dejar a los grafos fuera cada juego podría tener una caratula de 350x350 que sirva de reclamo.

Pongo como fecha límite la vispera de reyes (5 de Enero para los que creais que son los padres) a las 12 de la noche.

¿Alguien se anima?
#31
XNA / Qué esperar de XNA?
09 de Diciembre de 2007, 11:23:54 PM
Llevo unos dias trasteando con XNA y hay algo que no me queda claro:

Hasta donde se supone que llega o llegará XNA como plataforma? Puedo esperar carga de modelos, colisiones, fisica, sistema de GUI, gestor de recursos, reproduccion de audio? etc, o me tengo que programar yo todas esas cosas?

Llevo años programando mi propio framework en C++ y ahora me he puesto a jugar con XNA y mi pregunta es - merece la pena tirar a la basura mi framework y empezar a usar XNA? o no me va a dar nada que yo ya no tenga?

Gracias
#32
Programación gráfica / glVertexAttribPointer y la Fixed Pipeline
16 de Septiembre de 2007, 11:23:26 PM
Hasta ahora usaba Vertex Arrays pero estoy portandolo a Vertex Buffers (tal vez no use la palabra adecuada).

La cuestion es que antes hacía glVertexPointer y le pasaba la direccion de memoria, y ahora intento usar glVertexAttribPointer pero esa funcion requiere que especifique el stream al que va dirigido, y yo quiero usar la fixed pipeline.

¿Alguien podría decirme qué funcion debo usar? Gracias.
#33
General Programadores / Programando en Mac OS X
12 de Agosto de 2007, 09:58:00 PM
Ha caido un Powerbook G4 en mis manos y me preguntaba si podria compilar mi framework sobre Mac, ya que solo he usado librerias multiplataforma.

El problema es que no consigo adaptarme a OSX, me baje XCode pero como IDE me parece bastante malo, o al menos yo no lo se usar.

Por otra parte todo el rollo de Cocoa y demas me pierde. Yo uso SDL pero no he conseguido ni compilar un hola mundo porque me peta dice al inicializar SDL, claro que lo intente compilando con gcc a pelo y supongo que no es tan sencillo.

Alguien que tenga experiencia programando para Mac (no colson, tu no vales que usas IDEs de pago) me puede echar una mano para saber por donde tirar?

Gracias.
#34
Programación en red / Socket bloqueado
15 de Julio de 2007, 03:12:28 AM
Tengo un problema con mi codigo de red.

Tengo una clase que permite hacer peticiones HTTP, funciona bastante bien para cargar archivos de la red como imagenes. Ayer se me ocurrió intentar hacer un programa que cargue imagenes de flickr, pero resulta que por alguna extraña razon el socket se me queda bloqueado cuando trato de cargar imagenes de flickr, y nunca llega a recibir mensajes, no es cuestion del tamaño porque uso urls de fotos pequeñas y ademas he probado de cargar otras fotos más grandes de otras urls y ningun problema.

Pero si es flickr se me bloquea en el:
bytesRead = recv(Socket, Rover, mDataBufferSize - mDataSize, 0);

No es problema de threads por si alguien pregunta.

He pensado que tal vez uso un GET erroneo, os lo pasteo aquí, pero ya os digo que puedo pillar de cualquier url menos de flickr:

GET /1310/705270960_e57e2ced39_o.jpg HTTP/1.1
Host: farm2.static.flickr.com
Connection: close

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; es-ES; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4


Flickr deja pedir imagenes sin referer así que no creo que necesite poner ninguno, pero aun así, si flickr no quiere enviarme respuesta entonces no debería quedarse colgado en esa funcion.

Cualquier sugerencia será bienvenida.
#35
General Programadores / El post para compartir codigo en C++
24 de Junio de 2007, 08:10:58 PM
Hace tiempo que pienso que estaría bien tener un post para compartir codigo entre la gente del foro, pero en lugar de que la gente publique lo que quiera creo que estaría mejor que la gente pida qué necesita, siempre y cuando se traten de cosas bastante atómicas.

Por ejemplo, una clase cámara, matriz, AABB, cuaternion, httpRequest, lo que sea. Lo cierto es que con el tiempo he ido desarrollando clases para todo en mi framework (aunque algunas pocas las saqué de internet para agilizar).

Si alguien necesita alguna clase y quiere pedirla yo no tengo ningun problema en darla, y me preocupa bien poco la licencia. Tampoco es plan de que todos publiquemos en internet nuestros frameworks (en mi caso está demasiado lejos de ser comprensible por otra persona que no sea yo) pero reconozco que tengo algunas clases que me han quedado chulas.

Dicho esto yo hago la primera solicitud:

Una clase para curvas, necesito que le puedas dar los puntos de control, me es igual si es bezier, spline, o hermite, me conformo con que le pueda preguntar N posiciones y me retorne un vector con los puntos que corresponden a la curva interpolada en N posiciones.

Gracias
#36
Trato de llamar desde C a una funcion definida en el script pero dice que no existe, sin embargo si la llamo desde el script no hay problema.

el script es el siguiente:

function saluda()
io.write("HOLAAA\n")
end

io.write("Hola\n")


y desde C hago lo siguiente:

lua_getglobal(L, "saluda");
status = lua_pcall(L, 0, LUA_MULTRET, 0);


Pero insiste en que llamo a una funcion que es nula. ¿Alguien sabe por qué?
#37
Off-topic / Colson Doing A Blowjob!
08 de Marzo de 2007, 03:52:35 PM
lo siento, tenía que hacer la coña...

(Si Manuel, elegí tu nick porque eres la unica persona que conozco minimamente de aquí)
#38
Programación gráfica / OpenGL de 32 bits de color a 16 bits
17 de Diciembre de 2006, 01:22:33 AM
Estoy haciendo picking renderizando los objetos con colores planos, el problema es que en 32 funciona bien, pero en 16bits lo que guardo en el buffer de color no se corresponde con lo que leo con glReadPixels (lo cual es obvio).

Uso la siguiente linea:

glReadPixels(0, 0, 1,1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)&value );

Necesitaría saber qué hace openGL cuando el colorbuffer tiene una profundidad menor de 32, cómo asigna cada bit de las cuatro componentes (RGBA), qué bits tira, etc.

He hecho pruebas pero no me queda claro, además por alguna extraña razón al leer del canal alpha el resultado no tiene alpha, tal vez sea porque el color buffer solo tiene RGB (no es muy coherente que tenga alpha por otra parte).

Pasteo aquí una prueba que he hecho metiendo valores consecutivos, el primero es el que guardo, el segundo el que leo del buffer:

Citar
****************************
00000000 00000000 00000000 00000011
11111111 00000000 00000000 00001000
----------------------
00000000 00000000 00000000 00000110
11111111 00000000 00000000 00001000
----------------------
00000000 00000000 00000000 00001100
11111111 00000000 00000000 00010000
----------------------
00000000 00000000 00000000 00011000
11111111 00000000 00000000 00011001
----------------------
00000000 00000000 00000000 00110000
11111111 00000000 00000000 00110001
----------------------
00000000 00000000 00000000 01100000
11111111 00000000 00000000 01100011
----------------------
00000000 00000000 00000000 11000000
11111111 00000000 00000000 11000101
----------------------
00000000 00000000 00000001 10000000
11111111 00000000 00000000 10000100
----------------------
00000000 00000000 00000011 00000000
11111111 00000000 00000100 00000000
----------------------
00000000 00000000 00000110 00000000
11111111 00000000 00001000 00000000
----------------------
00000000 00000000 00001100 00000000
11111111 00000000 00001100 00000000
----------------------
00000000 00000000 00011000 00000000
11111111 00000000 00011000 00000000
----------------------
00000000 00000000 00110000 00000000
11111111 00000000 00110001 00000000
----------------------
00000000 00000000 01100000 00000000
11111111 00000000 01100001 00000000
----------------------
00000000 00000000 11000000 00000000
11111111 00000000 11000010 00000000
----------------------
00000000 00000001 10000000 00000000
11111111 00000000 10000010 00000000
----------------------
00000000 00000011 00000000 00000000
11111111 00001000 00000000 00000000
----------------------
00000000 00000110 00000000 00000000
11111111 00001000 00000000 00000000
----------------------
00000000 00001100 00000000 00000000
11111111 00010000 00000000 00000000
----------------------
00000000 00011000 00000000 00000000
11111111 00011001 00000000 00000000
----------------------
00000000 00110000 00000000 00000000
11111111 00110001 00000000 00000000
----------------------
00000000 01100000 00000000 00000000
11111111 01100011 00000000 00000000
----------------------
00000000 11000000 00000000 00000000
11111111 11000101 00000000 00000000
----------------------
00000001 10000000 00000000 00000000
11111111 10000100 00000000 00000000
----------------------
00000011 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00000110 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00001100 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00011000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00110000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
01100000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
11000000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
10000000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
#39
Resulta que en mi cargador de meshes cuando lo ejecutaba en Release el modelo salía orientado de manera distinta de cuando lo ejecutaba en Debug.

Despues de culpar a camaras, shaders y arbol de escena me doy cuenta de que el error está en el cargador, y el problema es el siguiente:

p.set(file.GetFloat(),file.GetFloat(),file.GetFloat());

Esta linea donde extraigo tres floats para cada componente se ejecutaba en diferente orden en Release y en Debug, lo que hacía que la X y la Z estuviesen intercambiadas segun cómo se compilaba.

Ahora ya lo se y hago las llamadas aparte en lugar de hacerlas directamente en el parametro pero para no olvidarme de este posible fallo me interesaria saber si realmente es así siempre, y si existe algun motivo para ello. No acabo de entender qué motivo podría haber para invertir el orden de ejecución de los parametros.

Gracias.
#40
Hace meses que llego mejorando mi sistema de GUI pero hasta ahora no había añadido la opción de que el usuario cierre un dialog, lo he implementado pero ahora tengo el problema de qué pasa cuando se destruye si alguien tiene un puntero a ese widget, me gustaría que lo supiese.

Para solucionar esto se me ocurren muchas opciones (como usar handlers en lugar de punteros o forzar al programador a checkear si existe el objeto de una manera explicita), pero mi framework se caracteriza por usar siempre soluciones elegantes para el programador, y para ello me gusta hacer uso de los recursos que C++ me da, por rebuscados que sean, así me sirve para más adelante.

Estoy seguro de que puedo crear algun tipo de smartpointer, haciendo uso de un template de punteros, en lugar de usar los punteros mismos. Si no lo uso no causa overhead, pero si lo uso entonces al destruirse avisa al smartpointer de que ya no es valido, convirtiendo la direccion en NULL, pero no quiero que cada widget tenga un overhead para eso, no quiero que cada uno tenga una lista de "smartpointers" que lo usan.

Seguro que se puede hacer algo más limpio, tal vez indexarlos en algun tipo de map y que al destruirse los busque y borre la dirección.

Realmente no me interesa solucionar este problema en concreto, pero me gustaría saber qué soluciones aplicais vosotros a casos así.





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.