Cajas de diálogo (Dialog boxes)

Started by Windgate, October 23, 2009, 12:52:51 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Que chulos quedan los transparentes  ;)

Drumpi

En el tema de copiar pixels de 32 bits, si que habría que determinar el modo de trabajo, porque si un map_block_copy mezcla los colores ¿cómo haríamos para que un punto del mapa destino quede con un rgba=(255,0,0,128)? es decir, que se ponga rojo semi-transparente, sin mezclarse con el que había antes.
Al igual, tambien es posible que queramos que un pixel verde opaco (0,255,0,255) se mezcle con el rojo semi-transparente (255,0,0,128), dando un (128,,255,0,255)... o aditovo, o sustractivo... ¿o todo eso ya se hace con flags? (hoy estoy espeso).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

Tengo por aqui un borrador de posibles metodos de mezcla, sobre papel.

He llegado a la conclusion de que los R G B se mezclan bien sea por media o bien por media ponderada (Respecto al alpha), tambien que el alpha puede afectar a los RGB de su mapa, que pueden hacerse medias del alpha, que pueden sumarse con limite 255 o bien restarse con limite 0...

Hay muchas formas de hacerlo, pero se hace necesario un flag que indique el metodo.

Por mi parte estoy implementando un map_block_mix ( ) que basado en map_clone y en las funciones de obtencion de color de un pixel hace exactamente lo que necesito. Lo hago como simple prueba, el metodo de mezcla de alphas deberia ser una global o bien un parametro mas, ya que puede hacerse de muchas formas y afectaria al funcionamiento general de Bennu...

Ahora mismo estoy en mi pueblo con wifi "prestado" y de fiesta, pero espero manteneros al corriente. La conclusion es que no es dificil mezclar colores en 32 bits si un flag indica como proceder a ello.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

 media no sirve... que pasa si tengo un alpha en el destino de 0, y un alpha de 128 en el source? eso deberia quedar un alpha de 128... no se puede hacer una media de eso... y que tal si tengo un 128 en el target y un 10 el source? tampoco puedo promediar...

como sea, creo que no es tan simple... que pasa si por ejemplo, tenemos un fantasma que le damos un tiro de pintura, el fantasma un alpha de 64 y la pintura tiene un alpha de 255, en este caso el alpha que deberia quedar en la mancha es de 255...

ahora que tal si a ese mismo fantasma le damos un tiro que le volamos parte, y en el fantasma nos quedan un agujero completamente transparente (alpha 0) y algunos bordes de suavizado, que tendrian que dar alphas entre 0 y 64? aca no puede ir el mismo metodo que el anterior..,

yo creo que deberia usar los mismos flags que ya existen... A_BLEND, S_BLEND, NORMAL... etc... y que el alpha tenga en cuenta dichos valores... el problema esta en el normal...

en el primer caso actuaria con un NORMAL... y en segundo deberia usarse un S_BLEND...

estoy hablando muy en el aire, sin mirar el codigo... asi que puede que este diciendo alguna locura...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

blostec

Quote from: Windgate on October 23, 2009, 10:52:07 PM
¡¡¡PROBLEMA!!! :o

He implementado una funcionalidad interesante, ahora los textos de cada linea se imprimen sobre un gráfico usando write_in_map y map_block_copy, ganando mucho en eficiencia ya que no hay que redibujar los textos a cada frame. A groso modo es así:

FROM current_print = 0 TO current_line;
lines [ current_print ] = write_in_map ( dial.font ,
dial.line [ current_print ] , 1 );
map_block_copy ( file , graph , 0 , current_print*dial.font_height + _OFFSET_DEFAULT ,
lines [ current_print ] , 0 , 0 ,
graphic_info ( file , lines [ current_print ] , G_WIDTH ) ,
graphic_info ( file , lines [ current_print ] , G_HEIGHT ) ,
0
);
END



Que grande eres, me gusta esta manera de mostrar textos. Buen trabajo Windgate, karma más que merecido!

Windgate

#20
He estado haciendo varias muestras sobre papel y veo 3 flags posibles para mezclar pixels con distintas transparencias de origen y destino ( Siento no poder subir la captura ahora mismo ).

Tienes razon, las distintas posibilidades son complejas, a ver si consigo hacer algo palpable y os informo con ejemplo + capturas. Ahora mismo con map_clone y unas funciones basadas en map_get_pixel, rgb, get_rgb y similares puedo solucionar el problema.

EDIT: Muchas gracias Blostec, tengo una buena base pero aun tengo que meter otros detalles al margen del soporte para 32 bits.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

#21
Os dejo la cabecera de la funcion map_block_mix ( ) que estoy implementando, por si quereis ir aportando sugerencias. Se salta la limitacion que tenia map_block_copy ( ) y que no permitia usar graficos de distinto fpg:

FUNCTION int map_block_mix ( int file_o , int graph_o , int ox , int oy , int width , int height ,
int file_d , int graph_d , int dx , int dy , int mode )
BEGIN
graph_o = map_clone ( file_o , graph_o );
graph_d = map_clone ( file_d , graph_d );
       ...


El ultimo parametro mode aportara distintos comportamientos que decidire a medida que vaya haciendo pruebas, tambien podeis sugerir diferentes metodos de mezcla de colores para ese parametro.

EDIT: Por cierto, al usar map_clone asumo que devolvera un entero con el nuevo grafico generado, y estara en la file 0... ¿Como lo veis? Tambien se podrian aportar distintos valores de mode para hacer que se mezcle sobre el grafico original... Se agradecen sugerencias :)
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

Maldita sea, veo que map_put_pixel también trabaja ignorando el alpha... ¿No hay alguna forma "fácil" de saltarse eso o alguna otra función que pueda usar?

Por ahora estaba "reprogramando" el map_block_copy para luego añadirle diferentes métodos de mezcla de alphas, el código lo tengo así:

FROM x = ox TO ox + width; // For all pixels at original map ( x , y )
FROM y = oy TO oy + height;
pixel = map_get_pixel ( 0 , graph_o , x , y );
map_put_pixel ( 0 , graph_d , dx + x - ox , dy + y - oy , pixel );
END
END
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

¿Accediendo al mapa como fichero te refieres o usando alguna otra función de Bennu?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

creo que se refiere a map_get_pixel y map_put_pixel.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Prg

creo que splinter se refiere mediante el buffer del mapa, así accedo yo a la hora de transformar un gráfico a otra profundidad de color.

sería
POINTER MAP_BUFFER ( LIBRERÍA, GRÁFICO ) 
Devuelve un puntero al buffer del gráfico

ya desde aquí con get_rgba(color
  • , &rojo,&verde,&azul,&alpha)
    obtendrás los componentes de color.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

Gracias Prg, es que map_put_pixel y map_get_pixel trabajan en 16 bits, probaré lo que dices.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

splinter_work

me referia a lo que señalo prg.

get y put tambien funcionan con 32bits...

Windgate

¿Quieres decir que map_get_pixel y map_put_pixel tambien funcionan en 32 bits?

Ahora mismo tengo asi la funcion y no me respeta los alpha, al menos al hacer el map_put_pixel me lo hace ignorando el alpha.

¿Puede deberse a que el file 0 al que van todos los mapas que pasan por map_clone es de 16 bits? Quizas sea por eso que no me va...

FUNCTION map_block_mix ( int file_o , int graph_o , int ox , int oy , int width , int height ,
int file_d , int graph_d , int dx , int dy , int mode )
PRIVATE
int pixel;
BEGIN
graph_o = map_clone ( file_o , graph_o ); // We clone maps to avoid overwrite originals
graph_d = map_clone ( file_d , graph_d );
FROM x = ox TO ox + width; // For all pixels at original map ( x , y )
FROM y = oy TO oy + height;
pixel = map_get_pixel ( 0 , graph_o , x , y );
map_put_pixel ( 0 , graph_d , dx + x - ox , dy + y - oy , pixel );
END
END
RETURN graph_d;
END
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es