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 - Tei

#41
General / Mayor Mapa Bsp Que El Hombre Ha Conocido
09 de Abril de 2005, 02:44:23 PM
 Tamaño: 6378.14 Km alto

Screenshots:


Historia:
Una idea absolutamente desquiziada puesta en la practica :D
Recordemos que es un mapa BSP, en un motor que en principio tenia una limitacion de unos 2 km.

Links:
http://forums.inside3d.com/viewtopic.php?p=1458#1458
http://icculus.org/twilight/darkplaces/
#42
General / Tei Visita Anarchy Online
14 de Marzo de 2005, 12:41:09 AM
 El otra dia me hablaron en muy buenos terminos de AO asi que lo baje e instale para echarle un vistazo y matar asi el gusanillo.

Estas son mis impresiones/pensamientos:

- Los efectos de particulas estilo "Final Fantasy" parece que han echo escuela. Sobretodo ese de "implosion de particulas de colorines" para representar algun evento donde se carga de energia y tal.
- Es un puntazo que los modelos desarrollen particulas desde las manos, asi que un formato de modelos sin tags no vale para mucho hoy en dia.
-  Echo de menos cierta interactividad del estilo ..bueno, naves gigantes aterrizando y crateres creados por explosiones o cosas asi.  La gente aun no explota totalmente los motores de campos de algunas, o bien aun no hay maquina suficiente para estas cosas.
- Esto de los morpth, a mi me recuerdan sus origines un raton.  Es xactamente como un mud, pero 3d, en lugar de linea de comandos. De todos modos yo no se si algunos conceptos se han trasladado demasiado literalmente. Me parece que el genero esta un poco estereotipado.
- Donde si ganan estas ostias, es en crear un mundo, con sus paisajes, y sus ciudades ligeramente distintas unas de otras. De todos modos se me hace raro ir andando, en este por ejemplo hay vehiculos, pero son enaneces. ¿Alguna limitacion del codigo de colisiones?.
- He encontrado un crater en un valle donde se esconde la princesa Xena y te la puedes tirar por 300 monedas (naaa.. es broma).
- Interesante como se representan las tormentas en este juego. ¿Que es eso? ¿un lightmap en las nubes? cuando el rayo da en el suelo cerca tuyo se produce una vibacion de la imagen estilo terremotro. Muy sencillo y muy efectivo.
- Echo de menos animales de verdad gigantes, o escenarios de relieve mas acusado (mayor resolucion en los heighfields?).

etc..

Anarchy Online, un mmorph de estilo ultraclasico, quizas incluso demasiado primitivo. Amplio pero quizas algo desbalazado, escenario gigantesco y variado, mucha diversidad en los modelos. Se puede avanzar niveles rapidamente con un poco de ingenieria social (trabajando en grupo).
#43
Proyectos / Xreal
02 de Marzo de 2005, 04:15:59 PM
 Quiero llamar en vosotros la atencion sobre un nuevo motor de Quake:

http://xreal.sourceforge.net/

Esta basado en QFusion, un motor de Quake2 con un set casi completo de features de Quake3.  Y parece ser que añade features estilo Doom3.



No conozco a los tios que lo estan haciendo, pero por comenterios de otros compañeros programadores de motores de quake, parece que estan haciendo un buen trabajo con el codigo.
#44
Proyectos / Arbol Familiar De Motores De Quake.
20 de Febrero de 2005, 07:48:17 PM
 Estoy desarrollando un proyecto de documentacion.

Se trata de dibujar un mapa de familia con todos los motores derivados del codigo fuente de Quake, o que utilizan la tecnologia de quake.

Podeis leer sobre el aqui:
http://www.quakesrc.org/forums/viewtopic.p...?t=4551&start=0

Seguramente me podeis echar una mano, aqui o escribiendo en el FactBook, añadiendo motores que me haya olvidado.


A continuacion algunos recursos que pueden ser interesantes ( para ver la ultima version, ve al enlace de arriba ).

----------------------------------------------------------------------------
VERSION TRAPERA
----------------------------------------------------------------------------



Codigo fuente:
http://telejano.berlios.de/option/quake1map10.svg

----------------------------------------------------------------------------
VERSION GENERADO AUTOMAGICAMENTE
----------------------------------------------------------------------------

http://telejano.berlios.de/option/fam9.1.png

Codigo fuente:
http://telejano.berlios.de/option/fam9.1.dot


----------------------------------------------------------------------------
Contribuciones
----------------------------------------------------------------------------

Here are a list of contributions methods:

-  Use the FactBook, ( FactBook tts somewhat magicall so you may need this manual).
- Edit the quake Engines wikipage.  
- Fill the filler (check the miscelanea )

----------------------------------------------------------------------------
Miscelanea
----------------------------------------------------------------------------

Here the SVG editor needed If you want to make modifications of the vectorial version:
http://inkscape.sourceforge.net
http://inkscape.org/screenshots/

Here its the tool to convert files from dot format to SVG or PNG:
http://www.graphviz.org/

Heres the filler to contribute in the forum:

name of engine:  [             ]
Derived from: [           ]
Also with code from: [             ]
Webpage : [ optional ]

Example:
name of engine:  [ Telejano ]
Derived from: [ TomazQuake  ]
Also with code from: [  Quake2Max, QMB, Darkplaces,..  ]
Webpage : [ telejano.berlios.de ]

Older versions:
http://telejano.berlios.de/option/familytree8.png
http://www.servicios-dpi.com/familytree7.png - mirror
http://telejano.berlios.de/option/familytree6.1.png
http://telejano.berlios.de/option/familytree6.png
http://telejano.berlios.de/option/familytree5.png
http://telejano.berlios.de/option/familytree4.png
http://telejano.berlios.de/option/familytree3.png
http://telejano.berlios.de/option/familitree2.png
http://telejano.berlios.de/option/familytree1.png
http://telejano.berlios.de/option/enginemap1.gif
#45
Proyectos / ¿empiezo Este Projecto O No?
20 de Diciembre de 2004, 04:51:49 PM
Estoy un poco perdido con el tema de hacer un nuevo motor de quake, con un cambio total del netcode.

El caso es el siguiente:

Quake dejo tras de si un motor llamado QuakeWorld que es bastante decente para jugar en internet. Teniendo prediccion de movimiento y toda la pesca minima nacesaria para combatir el lag.

Este juego sigue teniendo un relativo exito y hay una comunidad de jugones internacional.

No lo se porque mi ingles no es muy bueno, pero creo que todos los programadores de motores de Quake estamos un poco descontentos con la tecnologia de QuakeWorld.  Para no tener que hacer cambios en el servidor, y no molestar a los proxys, y tematicas de estas, solo se han implementado mejoras en el lado cliente, del cual existen muy buenos engines.

Asi que hacer cambios en el netcode es un poco TABU, y nadie se ha atrevido a profundizar demasiado, el legado del pasado es una carga inamovible. Ademas casi cualquier feature que se añada hace que los usuarios se quejen por uno de estos dos motivos:
-  puede ser usado para hacer trampas (y tienes definiciones de "trampas" para todos los gustos)
-  no seria compatible hacia atras con motores del años 1997, o mas bien (porque se puede hacer que los nuevos cambios los ignoren, es dificil, pero se puede hacer) que esos motores no tienen las nuevas features. O algo asi.


Yo me estoy cansando un poco de esta situacion, y en mi motor de Quake normal he realizado cantidad de features que se podrian migrar a QuakeWorld sin mucho trabajo (son dos sabores distintos del mismo motor). Y veo que segun me hago viejo, me queda menos tiempo para dedicar a projectos de software libre, un dia tendre un hijo, y quien sabe si ya no me quedara nada de tiempo.

Me da mucha rabia el estado actual de las cosas, y me gustaria fundir TeamFortress (un mod de QW) con el motor, y optimizar el netcode agnadiendo de mi motor todas las features posibles (copiando y pegando, y hackeando un poco).  Me gustaria hacer un motor "TeamFortress" para jugar a "TeamFortress" con un protocolo orientado a esa tarea, soporte para 64 jugadores,  optimizaciones bestiales de ancho de banda que tengo en mente, mover un poco la fisica al lado cliente (en algunas cositas visuales, como hace half-life2) etc... lo que pueda.

Pero hacer esto romperia el tabu de hacer cambios en el netcode, y quizas podria provocar la division de la comunidad en dos mitades o algo asi.

No se... ¿vosotros como lo veis?

#46
Proyectos / Red De Contactos Para Zaragoza
08 de Noviembre de 2004, 04:37:42 PM
 Hola amigos.

Somos una empresa de Zaragoza dedicada al desarrollo de software y el diseño. Hemos echo algunos contactos con semillas de proyectos bastante interesantes pero no conocemos artistas y desarrolladores que podríamos necesitar para llevar a cabo esos proyectos. Nos interesaría ir haciendo una red de contactos con gente de Zaragoza que puedan desenvolverse bien en labores de desarrollo de videojuegos.

Si hay alguien muy capacitado para desarrollar videojuegos,  que viva en Zaragoza, y que le gustaría que contactaramos con el cuando haya algo mas firme, puede contactar con nosotros de forma personal (no nos envieis CVs, al menos de momento).

comercial arroba servicios guion dpi punto com

Las tareas en las que podria ser necesaria gente son las siguiente:
- Modelador, experiencia en el modelado, animado y diseño de skins.
- Prog. Redes.  experiencia en el trabajo a bajo nivel en redes.
- Prog. 3D,  con experiencia en el trabajo con OpenGL.
- Prog. Linux, Experiencia desarrollando en entorno Linux.

Como somos una empresa joven, nuestra pagina web aun esta en construccion, la podeis vistar aqui:


www.servicios-dpi.com

Mas tarde, y cuando haya un proyecto mas definitivo, podemos poner proponer puestos de trabajo en la seccion de Stratos, pero en realidad nos gustaria mas contar con personas con nombres y apellidos antes de decidir nada, incluso comentaros algunas de nuestras ideas para saber vuestra opinion.
#47
Programación gráfica / Ati Death Perfomance Penalty Found.
30 de Octubre de 2004, 11:14:33 AM
 Un tio de los que trabajan en motores de quake ha encontrado la causa de un penalty gordo que se produce al trabajar con OpenGL sobre tarjetas de ATI.

Aqui esta el post:

http://forums.quakesrc.org/viewtopic.php?t=4183

Este es el texto:
QUOTE ("jitspoe")

It took me a couple days to track this down, but here's what's causing the problem:

float attenuations[3] = { 0.0, 0.0, 1.0 };
glPointParameterfEXT(GL_POINT_SIZE_MIN_EXT, 0.1f);
glPointParameterfEXT(GL_POINT_SIZE_MAX_EXT, 40.0f);
glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, attenuations);


The circle particle things in Q2. Even if no particles are being rendered, just the above initialization code makes the fillrate like 10x's slower. Fortunately they can be disabled:

set gl_ext_pointparameters 0
vid_restart


Should make your framerate 5-10x's higher.
[/quote]
#48
Programación gráfica / ¡toi En Un Cvs!
17 de Septiembre de 2004, 11:12:24 PM
Aunque llevo unos dias muy ocupado con el trabajo, al fin he podido meterme en un proyecto distinto al mio, he estado probando la cosa esta de colaborar con otra gente a traves del CVS.  Despues de.. ¿20 años? trabajando solo, pues es para mi toda una experiencia.  Y tal.
Ademas me esta gustando migrar features, que es lo que estoy haciendo, sale codigo de mucha mas calidad cuando lo escribes por segunda vez :D, eso que llaman "reformular" por ahi.

en sourceforge soy Tei, y en el motor que estoy haciendo commits es el ezQuake, aunque solo estoy empezando :D

Si esto del CVS me gusta, igual me meto en mas proyectos, incluso intento revificar alguno que valga la pena :D
#49
Programación gráfica / Enlaces A Papers Y Otras Mandangas
27 de Enero de 2004, 07:10:45 PM
En una de esas que uno pilla costumbre y luego no lo deja aunque seguir no tenga gran sentido, voy coleccionando enlaces a paginas sobre programacion 3D.   El caso es que la ultima direccion que he encontrado no solo es buena, sino que es como 6 veces mejor que otra, y encima esta en ingles y castellano (posiblemente sea incluso de un español).

La susodicha es esta:
http://www.salleurl.edu/~manuellv/Public/e...ish.2125.1.html

Tiene unas cuantas secciones importantes, como los enlaces a papers de PVS, BSP, etc...

Y como se ve que estaba en racha, encontre ese mismo dia esta otra pagina, que es ooootra coleccion de fichas sobre motores 3D, que ya existian un par de paginas muy buenas, pero eran con marcos, y estaban un poco pasadas, esta parece un proyecto mas joven y quizas mas activo.

http://www.3dengines.net/feat/?f=42

Y como no hay dos sin tres, os pongo el enlace a The Linux Game Tome, que es otra fuente buena a motores  y proyectos interesantes.

http://www.happypenguin.org/news

Yo estas cosas las voy apuntando en una pagina de la wiki de Telejano. Es una guarrerida, un poco como apuntarse las cosas en un pañuelo, o servilleta de bar, pero ahi estan por si alguien con demasiado tiempo libre y ganas de aprender 3D colisiona con la bbox de mi wiki.

http://telejano.berlios.de/wiki3/index.php...Friends%20Sites




#50
General / Screenshots2divx
19 de Agosto de 2003, 03:11:45 PM
 Gueenas.

Mi maquina es una windows2000 con la ultima version de cygwin. Estoy aprendiendo a hacer videos, y utilizo mayormente software libre:

animmaker (compila un avi) y mplayer (me corrigue el avi con el filtro copy...)

..no es que tenga ninguna alergia a otro tipo de software, tambien me he puesto (sin mirar mucho)  VideMach, que este me coge todos los filtros que hay en mi equipo.

El caso es que me surgen algunas dudas:

- Alguien tiene compilado mplayer para cygwin de forma que puede usar muchos filtros? yo no tengo mas que el copy y otro par mas "dummies", nada que comprima. Me interesarian esos binarios (Siempre es mejor que darse contra la cabeza para compilarlos, etc..). ¿Que fichero de filtros.conf teneis? tras make install no me creo ningun fichero filters.conf asi que esta vacio,ni puñetera idea del formato ni nada.

- ¿Que puñeteros filtros son recomendables? me aparecen puñeteros quincemil filtros en VideoMach, algunos de divx, otros de intel, etc muchos...

Haciendo el tonto con la tecla de "screenshot" de quake he echo un avi tontorron con todo esto que os cuento, esta aqui:

http://telejano.berlios.de/option/testzero.avi

en este video salgo yo pacificamente paseandome por cs_siege en Telejano, es como bastante trapero porque lo he echo ejecutando screenshot cada 0.1 segundos, y hay como un millon de formas mejores...

luego lo he pasado por animmaker que me compila las imagenes,
lo que sale pasa por mencoder (de mplayer) para corregir la falta de header,
y luego lo comprimo de 40MB a 3MB con algun puñetero codec...

Seria interesante que me avisara la gente si lo ha podido ver o no.  
#51
Tengo este codigo para poner modo graficos:


BOOL bSetupPixelFormat(HDC hDC)
{
   static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1,    // version number
PFD_DRAW_TO_WINDOW   // support window
|  PFD_SUPPORT_OPENGL  // support OpenGL
|  PFD_DOUBLEBUFFER , // double buffered
PFD_TYPE_RGBA,   // RGBA type
24,    // 24-bit color depth
//32,    // Tei: 24-bit color depth stencil
0, 0, 0, 0, 0, 0,  // color bits ignored
0,    // no alpha buffer
0,    // shift bit ignored
0,    // no accumulation buffer
0, 0, 0, 0,    // accum bits ignored
//32,    // 32-bit z-buffer
24,    // Tei 24-bit z-buffer  (help stencil)
8,    // Tei stencil buffer
//0,    // no stencil buffer
0,    // no auxiliary buffer
PFD_MAIN_PLANE,   // main layer
0,    // reserved
0, 0, 0    // layer masks ignored
   };
   int pixelformat;

   if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 )
   {
       MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
       return FALSE;
   }

   if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE)
   {
       MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
       return FALSE;
   }

//Tei stencil
if ( pfd.cStencilBits )
{
 Con_Printf(" * Stencil buffer Ok.\n");
 gl_stencil = true;
}
else
{
 Con_Printf(" * Can´t force stencil buffer\n");
 gl_stencil = false;
}
//Tei stencil

if (qwglGetExtensionsStringARB)
 Con_Printf(" * Other data '%s'\n", qwglGetExtensionsStringARB(hDC));

   return TRUE;
}


Tengo una tarjeta GeForce4MX y aveces me coge el 640x480 "encogido" al estilo 16x9, como mi vieja commodore 64(que tenia los pixeles mas gordos que altos).
Sin embargo otros motores 3D, algunos tambien de Quake, me cogen bien esto y no me dan este formato tan desagradable. ¿Tendra que ver con el modo que estoy pidiendo? ¿Me dan algun consejo sobre el codigo? ¿Puedo pedir 32 bits de Zbuffer alegremente? Segun he leido por ahi puedes pedir "lo que te de la gana" que windows/tarjeta te daran lo que mas se acerque... ¿es asi?.. ¿Que les parece el codigo?. Blah?

Espera.. me parece que meti la pata en la estructura.. ¿o no?.
#52
General / Alhambra-eidos, Mi Odisea Con Esta Gente.
11 de Julio de 2003, 07:12:55 PM
Hace poco me compre en Centro Mail el juego Battlefield 1942 y su ampliacion, Road To Rome, para jugar en internet.

Battlefield se me instalo sin ningun tipo de problemas, pero en la caja de Road To Rome me aparecieron dos manuales (con sus correspondientes cd-key) y ninguno de los dos me permitia instalar el juego.  Lo reintente desactivando un par de cosas, pero nada. Volvi a la tienda donde sin ningun problema me lo cambiaron por otro Road to Rome, el cual tampoco aceptaba el CD-KEY.  

Asi que tome el mail del servicio tecnico de EA,  que es stecnico@ea.com  y les conte todo lo que habia ocurrido.  Ellos me contestaron lo siguiente:

Citar
¿Cual es el numero de serie del Battlefield 1942?


Asi que les envie el numero de serie. Aunque les pregunte para que querian ese numero y me contestaron lo siguiente:

Citar
Te he preguntado el numero de serie del primero para comprobar que no era una copia. Si el numero que te viene en la expansion es incorrecto la unica manera de solucionarlo es que vayas a la tienda y te lo cambien por otro o sino nos lo envias a nosotros.

Esto me extraño bastante, pues teniendo todos los numero de serie que he probado.. ¿como pueden dudar si son validos o no?. Ademas parece logico que si dos cd fallan, no es que esten dañados fisicamente, sino que el software (en este caso SecureRom la version que sea) tiene alguna incompatibilidad con mi hardware o software o no es fiel al estandar de grabacion de cedes.

Les explique mis dudas y me puse en sus manos, pero habiendo perdido toda la confianza me volvi al Centro Mail donde les explique todo lo que habia pasado, y fueron extramadamente amables, y sin necesitarlo, me devolvieron el dinero (gracias Centro Mail Zaragoza!!!), ademas de comprender totalmente el problema de forma tecnica.

Al volver a casa, la risa fue bajar el correo y encontrarme la ultima "ayuda" de stecnico@ea.com para mi problema:

Citar
Mandenos el numero de sku del battlefield 1942 por favor, un saludo.

Me ha parecido tan patetico y casposo que he visitado la pagina web de esta gente, del callcenter, y he estado copiando frases al azar:

[...]

Cuando las pymes casperas de este pais creo que ya no pueden sorprenderme mas de su casposidad, van y rizan el rizo. ¡Ole!

Conclusion:
El gasto de ir y volver de la tienda en autobus con un calor de la muerte no me habria pasado con un CD pirateado. Aunque tampoco podria jugar en internet... aunque ¡Para!.. sigo sin poder jugar en internet, al menos a la extension, de la cual tengo felizmente ahora 3 CD-Key que no me valen para nada en absoluto.

update:
he retirado las criticas a su pagina web que, de todos modos, no es que sean de muy buen gusto.  A lo mejor aquello de "trabaje desde su casa, comodamente, sin necesidad de estudios ni nada" es hacer de servicio tecnico para EA.
#53
General / Nuevo motor 3D de Quake!
29 de Mayo de 2003, 03:07:37 PM
                                Algun tipo esta realizando el que podria ser el mejor motor de Quake nunca visto. Tiene mejoras de la IA, un sistema RPG integrado, un sistema de particulas mejorado, iluminacion realista, diplomacia, caracteres conocidos,... y asi una larga lista.

Por favor postea imagenes que te hayan impactado y comentalas.

Aqui esta la pagina:
http://djquake.quakepit.com

posdata:
si va a visitar esta web, recuerde el texto de "guia para autoestopistas galacticos": NO SE ASUSTE.  

si tiene menos sentido que un voor haciendo poesia, le aconsejaria que no visitara esa pagina                                
#54
Dibujo / dibujo
07 de Mayo de 2003, 04:31:50 PM
                                Todo lo que hace por aqui la gente es bastante bueno. Yo hace como bastantes años que tengo lo de dibujar practicamente abandonado. Lo poco que tengo echo lo he regalado o se lo he enseñado a poco gente, aunque otro poco ya lo subi a internet y tal.

Aqui tengo una imagen de algo mio que me he preocupado en escanear y subir a la red:

http://telejano.berlios.de/option/theilax.gif

No es de la calidad de lo que soleis ver por aqui pero supongo que os hara gracia ver que los programadores tambien dibujamos.                                
#55
Programación en red / Tecnica "Reflexion"
02 de Mayo de 2003, 02:53:06 AM
                                Un colega mio me ha hablado de reflexion para hacer juegos en red minimizando el trafico. En lugar de enviar los datos origen,modelo,angulo y shader asociado por la red para cada modelo de una torre lanzamisiles( por ejemplo), envias "torre lanzamisiles, 4 de 5 misiles"... es decir, reflejas en el cliente los datos del servidor que son importantes. Entonces el cliente dibuja esa torre con esos misiles, habiendo necesitado una cantidad de informacion muchas veces menor.
No se si me he explicado bien. El tio que me lo conto es un crack.

¿Ud saben algo de esto?¿Que opinan de la idea?                                
#56
                                Esto es un codigo muy tonto para hacer heighfields en un motor de quake. Dibujo el heighfield mediante una displaylist. ¿Deberia checkar algo antes de hacerlo asi?.
Uso dos texturas combinas que crean un paisaje sicodelico muy efectivo.
..aunque igual se os ocurre un hack o un cambio pequeño para hacer mas oscuros los valles y mas claras las montañas (supongo que podria ser facil).

Yo no soy un gran programador asi que casi cualquier sugerencia que me podais hacer vale su peso en oro.

Por si quereis ver algun screenshot de que genera esto, aqui teneis algo:
http://forum.moddb.com/5/2457/


[pre][tt]

#include "quakedef.h"





#ifndef gl_mtextype

#define gl_mtextype GL_TEXTURE0_SGIS

#endif





/* SGIS_multitexture */

#define GL_SELECTED_TEXTURE_SGIS            0x835C

#define GL_MAX_TEXTURES_SGIS                0x835D

#define GL_TEXTURE0_SGIS                    0x835E

#define GL_TEXTURE1_SGIS                    0x835F

#define GL_TEXTURE2_SGIS                    0x8360

#define GL_TEXTURE3_SGIS                    0x8361



#define XMAX 514

#define YMAX XMAX

#define SYZE (YMAX*XMAX)





typedef struct env_s

{

char filename[MAX_QPATH];       //file path

vec3_t mins, maxs;

int width, height;         //Number of x/y coords

byte heightdata[SYZE];         //The actual coordinates.

#define INGROUND 1

byte flags[SYZE];//

vec3_t rotation, origin, scale;



float texres, detailtexres;

int texture, detailtexture;



float waterheight, wavesize, waveheight;   //At wat height should the (sine-wave) water be based, how broad should the waves be, and how big should they be?

float watertexres, waterdetailtexres;

int watertexture, waterdetailtexture;    //Water textures



int numneighbours;

struct env_s *neighbours[1];      //neighbouring terrains

} env_t;



void ENV_Init(void);

void ENV_Load(model_t *mod, byte *buf);

void ENV_ClipMoveToEntity(edict_t *ent, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t *trace);

void ENV_CheckWater(edict_t *ent);

void ENV_SetContentsColor(vec3_t origin);

void ENV_DrawScene(void);





typedef struct

{

vec3_t rotation, origin;

vec3_t scale;



float terraintexres, terraindetailtexres;

float watertexres, waterdetailtexres;

float waterheight;



char heightmaptexture[32];

char terraintexture[32];

char terraindetailtexture[32];

char watertexture[32];

char waterdetailtexture[32];



int numneighbours;

} env0area_t;





//extern qboolean texcombineable;



cvar_t env_dist = {"env_dist", "8", true};

cvar_t env_detaildist = {"env_detaildist", "1", true};



cvar_t env_z = {"env_z", "-4096", true};

cvar_t env_x = {"env_x", "-4096", true};

cvar_t env_y = {"env_y", "-500", true};





cvar_t env_sx = {"env_sx", "20", true};

cvar_t env_sy = {"env_sy", "20", true};

cvar_t env_sz = {"env_sz", "4", true};



cvar_t env_hiddenworld = {"env_hiddenworld", "0", true};



cvar_t env_sdetail = {"env_sdetail", "40", true};





cvar_t env_stex = {"env_stex", "1", true};

cvar_t env_compiled = {"env_compiled", "1", true};//compile mode



env_t terrain;







void R_SetEnvTerrain (char *name)

{

strcpy(terrain.filename, name);



ENV_Load(cl.worldmodel, COM_LoadTempFile(terrain.filename));//Tei: Load the env

}



void LoadEnv_f (void)

{

// int k;//,j,len;



switch (Cmd_Argc())

{

case 1:

 if (terrain.filename[0])

  Con_Printf("Current env: %sn", terrain.filename);

 else

  Con_Printf("Error: No env has been setn");

 break;

case 2:

 R_SetEnvTerrain(Cmd_Argv(1));





 break;

default:

 Con_Printf("Usage: loadenv envnamen");

 break;

}

}





void Env_Print_f (void)

{

Con_Printf("x/y/z: %f %f %fn",env_x.value,env_y.value,env_z.value);

Con_Printf("sx/sy/sz: %f %f %fn",env_sx.value,env_sy.value,env_sz.value);





}





void ENV_Init(void)

{

//CVar initalisations and such

Cvar_RegisterVariable(&env_dist);

Cvar_RegisterVariable(&env_detaildist);



Cvar_RegisterVariable(&env_x);

Cvar_RegisterVariable(&env_y);

Cvar_RegisterVariable(&env_z);



Cvar_RegisterVariable(&env_sx);

Cvar_RegisterVariable(&env_sy);

Cvar_RegisterVariable(&env_sz);



Cvar_RegisterVariable(&env_sdetail);

Cvar_RegisterVariable(&env_stex);

Cvar_RegisterVariable(&env_hiddenworld);//dont use world bmodel

Cvar_RegisterVariable(&env_compiled);





Cmd_AddCommand ("loadenv",LoadEnv_f);

Cmd_AddCommand ("env",Env_Print_f);

}





void ENV_LoadENV(model_t *mod, byte *buf)

{

// int j,k;

int x,y,pc;

vec3_t org;

char hacked[MAX_QPATH];



if(!buf)

 return;



//Init



if(!mod)

{

 Con_Printf("Not env model loaded errorn");

 return;

}





if (mod->environment)

{

 Con_Printf("Model already has enviromentn");

 return;

}



COM_FileBase(mod->name,hacked);

COM_StripExtension(hacked, hacked);

Con_Printf("mod name %sn",hacked);





VectorCopy(vec3_origin, terrain.rotation);

VectorCopy(vec3_origin, terrain.origin);





terrain.width = XMAX;

terrain.height = YMAX;



terrain.texture = loadtextureimage(va("terra/terra_%s",hacked),  true,true);

terrain.detailtexture = loadtextureimage( va("terra/detail_%s",hacked), true,true);



//terrain.watertexture = loadtextureimage( "terra/water.jpg",  true,true);

//terrain.waterdetailtexture = loadtextureimage( "terra/cubemap.tga",   true,true);



terrain.texres = 128;//area->terraintexres;

terrain.detailtexres = 16;//area->terraindetailtexres/10;

terrain.watertexres = 8;//area->watertexres/80;

terrain.waterdetailtexres = 8;// area->waterdetailtexres/20;

terrain.waterheight = 25;//65//area->waterheight;



terrain.scale[0] = 256.0f;

terrain.scale[1] = 256.0f;

terrain.scale[2] = 4;//3.0f



//terrain.origin[0] = terrain.width * terrain.scale[0] * 0.5 * (-1);

//terrain.origin[1] = terrain.height * terrain.scale[1] * 0.5 * (-1);



VectorCopy(vec3_origin, terrain.mins);

terrain.maxs[0] = terrain.origin[0] + terrain.scale[0] * terrain.width;

terrain.maxs[1] = terrain.origin[1] + terrain.scale[1] * terrain.height;

terrain.maxs[2] = terrain.origin[2] + terrain.scale[2] * 256;



/*

for (j=0;j<XMAX;j++)

 {

  for (k=0;k<XMAX;k++) Con_Printf("%d ",buf[j+k*XMAX]);

  Con_Printf("|n");

 }

*/



//Con_Printf("size: %dn",SYZE);

//strncpy(terrain.heightdata,buf,SYZE);



memcpy(terrain.heightdata,buf,SYZE);



/*

for(x=0;x<XMAX;x++)

{

 for(y=0;y<YMAX;y++)

 {

  org[0] = x * env_sx.value + env_x.value;

  org[1] = y * env_sy.value + env_y.value;

  org[2] = buf[x+y*XMAX] * env_sz.value + env_z.value;



  pc = Mod_PointInLeaf(org, cl.worldmodel)->contents;



  if (pc == CONTENTS_SOLID)

  {

   terrain.flags[x+y*XMAX] = INGROUND;

  // Con_Printf("#");

  }

  else

  {

   terrain.flags[x+y*XMAX] = 0; //force 0's

  // Con_Printf("O");

  }





 }

//  Con_Printf("n");

}

*/



mod->environment = &



//TODO: free buf?

}



void ENV_Load(model_t *mod, byte *buf)

{

if(!buf)

{

 Con_Printf("----- NO buff -----n");

 return;

}



ENV_LoadENV(mod, buf);



Con_Printf("----- ENV Environment loaded -----n");

}





void R_ParticleCircle (vec3_t origin);



void ENV_ClipMoveToEntity(edict_t *ent, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t *trace)

{

env_t *env;

int pos[3];

float lh;

static float lastlh=0;

int i, isplayer= false;





if (ent)

{

 lh = ent->v.mins[2];

}

else

 lh = 0;



//if (ent && lh!=lastlh)

//{

// Con_Printf("[%s] -> %fn",ent->v.model + pr_strings, lh);

// lastlh = lh;

//}



//if (ent && *(ent->v.model + pr_strings)=='p')

// Con_Printf("map!n");

//else

//if (ent)

// Con_Printf("car '%c'n",(ent->v.model + pr_strings));

//else

// Con_Printf("no ent!n");



if (lh==-24)

 isplayer = true;



trace->startsolid = false;

trace->fraction = 1;

trace->allsolid = false;

trace->endcontents = CONTENTS_EMPTY;

trace->ent = ent; //????

VectorCopy(end,trace->endpos);



if (!sv.worldmodel)

 return;



if(!(env = sv.worldmodel->environment))

 return;



for(i = 0; i < 3; i++)

 pos[i] = (trace->endpos[i] - env->origin[i])/env->scale[i];//* env_sx.value;

//pos[0] = (trace->endpos[0] - env->origin[0])/env->scale[0] / env_sx.value;

//pos[1] = (trace->endpos[1] - env->origin[1])/env->scale[1] / env_sy.value;

//pos[2] = (trace->endpos[2] - env->origin[2])/env->scale[2] / env_sz.value;



//pos[1] *= env_sx.value;

//pos[0] *= env_sy.value;



//good hack

pos[2] += lh;//break compatibility for env_sz but is smoother



if(pos[0] < 0 || pos[0] > env->width ||

   pos[1] < 0 || pos[1] > env->height)

   return;



if(pos[2] <= env->heightdata[pos[0] * env->height + pos[1]])

{

 trace->endpos[2] = (env->heightdata[pos[0] * env->height + pos[1]] + env->origin[2])*env->scale[2];

 

 if (trace->endpos[2]>start[2])

 {

  trace->startcontents = CONTENTS_SOLID;

  trace->startsolid = true;

  trace->endcontents = CONTENTS_SOLID;

  //trace->allsolid = true; //??

  trace->fraction = 0;  

 }

 else

 //if (trace->endpos[2]>end[2])

 {

  trace->endcontents = CONTENTS_SOLID;

  trace->startcontents = CONTENTS_EMPTY;

 }





 if (trace->fraction)

  trace->fraction *= abs(start[2] - end[2]) * 1.0f / abs(start[2] - trace->endpos[2]);



 trace->plane.normal[0] = 0;

 trace->plane.normal[1] = 0;

 trace->plane.normal[2] = 1;

}



//trace->endpos[2] -= 1;



if(trace->fraction < 1)

 R_ParticleCircle (trace->endpos);



if (trace->fraction>1)

{

 trace->fraction = 1;

 if(ent )

  ent->v.flags = (int)ent->v.flags & ~FL_ONGROUND;

}

else

if (trace->fraction<0.0000001)

{

 trace->fraction = 0;

 //Con_Printf("Strange colliden");

 if (ent)

  ent->v.flags = (int)ent->v.flags | FL_ONGROUND;

}



//if (isplayer)

// Con_Printf("Frac%fn", trace->fraction);



}



void Old2_ENV_ClipMoveToEntity(edict_t *ent, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t *trace)

{

//Yes, this is crap.

env_t *env;

int pos[3], pos2[3];

int i;

//int offset = 42;

int offset = 0;

float hdata1, hdata2;





trace->startsolid = false;

trace->fraction = 1;

trace->allsolid = false;

trace->endcontents = CONTENTS_EMPTY;

trace->ent = ent; //????



VectorCopy(end,trace->endpos);



if(!sv.worldmodel->environment)

 return;



env = sv.worldmodel->environment;





for(i = 0; i < 3; i++)

 pos[i] = (end[i] - env->origin[i]-mins[i])/env->scale[i];





for(i = 0; i < 3; i++)

 pos2[i] = (start[i] - env->origin[i]-mins[i])/env->scale[i];



if(pos[0] < 0 || pos[0] > env->width ||

   pos[1] < 0 || pos[1] > env->height)

   return;



trace->plane.normal[0] = 0;

trace->plane.normal[1] = 0;

trace->plane.normal[2] = 1;





hdata1 = env->heightdata[pos[0] * env->height + pos[1]]; //hend

hdata2 = env->heightdata[pos2[0] * env->height + pos2[1]]; //hstart



//if (hdata1 != hdata2)

// Con_Printf("h1, %f, h2 %f,n",hdata1,hdata2);// sale: h2 > h1





if(pos2[2] < hdata2)

{

 trace->startsolid = true;  

 trace->allsolid = true;

 trace->fraction = 0;

 trace->endcontents = CONTENTS_SOLID;  

 VectorCopy(start,trace->endpos);

}







if(pos[2] < hdata2)

{

 trace->endpos[2] = (hdata1 + env->origin[2] ) * env->scale[2];

 

 if (trace->fraction)

  trace->fraction *= abs(start[2] - end[2]) * 1.0f / abs(start[2] - trace->endpos[2]);

}





}







void Old_ENV_ClipMoveToEntity(edict_t *ent, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t *trace)

{

//Yes, this is crap.

env_t *env;

int pstart[3], pos2[3];

int i;

//int offset = 42;

int offset = 0;

float heigh;





trace->startsolid = false;

trace->fraction = 1;

trace->allsolid = false;

trace->ent = ent; //????

trace->endcontents = CONTENTS_EMPTY;



//Triing to set the correct endpos[2]

VectorCopy(end,trace->endpos);





if(!sv.worldmodel->environment)

 return;



env = sv.worldmodel->environment;



for(i = 0; i < 3; i++)

 pstart[i] = (end[i] - env->origin[i]-mins[i])/env->scale[i];





for(i = 0; i < 3; i++)

 pos2[i] = (start[i] - env->origin[i]-mins[i])/env->scale[i];



if(pstart[0] < 0 || pstart[0] > env->width ||

   pstart[1] < 0 || pstart[1] > env->height)

   return;



heigh = (env->heightdata[pstart[0] * env->height + pstart[1]] + env->origin[2] + offset)*env->scale[2];

heigh = env->heightdata[pstart[0] * env->height + pstart[1]] + offset;



if(pos2[2] < heigh) //env->heightdata[pstart[0] * env->height + pstart[1]]+offset )

{

 trace->endcontents = CONTENTS_SOLID;

 trace->endpos[2] = heigh;



 if(trace->fraction)

  trace->fraction *= abs(start[2] - end[2]) / abs(start[2] - trace->endpos[2]);



 //Fake plane normal

 trace->plane.normal[0] = 0;

 trace->plane.normal[1] = 0;

 trace->plane.normal[2] = 1;

}



if(pstart[2] < heigh  )

{

 trace->startsolid = true;  

 trace->allsolid = true;

 trace->endcontents = CONTENTS_SOLID;

 trace->fraction = 0;

}



}



void ENV_CheckWater(edict_t *ent)

{



}



void ENV_SetContentsColor(vec3_t origin)

{



}





#if 0



extern int gl_mtexable;

void ENV_DrawPart(env_t *env, int xMin, int xMax, int yMin, int yMax, int stepsize)

{

int x, y, dx, dy;

float tex_x, tex_y;

float tex_dx, tex_dy;

float detailtex_x, detailtex_y;

float detailtex_dx, detailtex_dy;

int heightstep, usedetail;

byte *height;







#define lstep(a) {x = a%stepsize; if(x){a+=x;}else{a+=stepsize;}}

#define hstep(a) {x = a%stepsize; if(x){a-=x;}else{a-=stepsize;}}

lstep(xMin);

hstep(xMax);

lstep(yMin);

hstep(yMax);



dx = (xMax - xMin);

dy = (yMax - yMin);

if(dx <= 0 || dy <= 0)

 return;



usedetail = true; //(gl_mtexable && (env_detaildist.value >= stepsize));

heightstep = env->height * stepsize;

height = env->heightdata + xMin*env->height;



//Terrain

tex_x = env->texres / env->width * xMin;

tex_dx = env->texres / env->width * stepsize;

tex_dy = env->texres / env->height * stepsize;

detailtex_x = xMin * env->detailtexres;

detailtex_dx = env->detailtexres * stepsize;

detailtex_dy = env->detailtexres * stepsize;



#define GL_ADD_SIGNED_EXT                   0x8574



glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);

glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD_SIGNED_EXT);



qglSelectTextureSGIS_ARB(TEXTURE0_SGIS_ARB);

glBindTexture (GL_TEXTURE_2D,env->texture);





qglSelectTextureSGIS_ARB(TEXTURE1_SGIS_ARB);//emulated enable multitexture

glBindTexture (GL_TEXTURE_2D,env->detailtexture);





for(x = xMin; x < xMax-stepsize; x+=stepsize, tex_x += tex_dx, detailtex_x += detailtex_dx, height+=heightstep)

{

 tex_y = env->texres / env->height * yMin;

 detailtex_y = yMin * env->detailtexres;

 glBegin(GL_TRIANGLE_STRIP);

 for(y = yMin; y < yMax; y+=stepsize, tex_y += tex_dy, detailtex_y += detailtex_dy)

 {

  qglMTexCoord2fSGIS_ARB(TEXTURE0_SGIS_ARB, tex_y, tex_x+tex_dx);

  qglMTexCoord2fSGIS_ARB(TEXTURE1_SGIS_ARB, detailtex_y, (detailtex_x+detailtex_dx));

  glVertex3f(x+stepsize, y, height[y+heightstep]);

  qglMTexCoord2fSGIS_ARB(TEXTURE0_SGIS_ARB, tex_y, tex_x);

  qglMTexCoord2fSGIS_ARB(TEXTURE1_SGIS_ARB, detailtex_y, detailtex_x);

  glVertex3f(x, y, height[y]);

 }

 glEnd();

}



// glDepthMask(FALSE);



glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);



}



#else

void ENV_DrawPart(env_t *env, int xMin, int xMax, int yMin, int yMax, int stepsize)

{

int x, y, dx, dy;

float tex_x, tex_y;

float tex_dx, tex_dy;

// float detailtex_x, detailtex_y;

// float detailtex_dx, detailtex_dy;

int heightstep;//, usedetail;

byte *height;

int oldxMin,oldxMax,oldyMin,oldyMax;







oldxMin = xMin;

oldxMax = xMax;

oldyMax = yMax;

oldyMin = yMin;





#define lstep(a) {x = a%stepsize; if(x){a+=x;}else{a+=stepsize;}}

#define hstep(a) {x = a%stepsize; if(x){a-=x;}else{a-=stepsize;}}

lstep(xMin);

hstep(xMax);

lstep(yMin);

hstep(yMax);



// if ( env->flags[xMin+yMin*XMAX] == INGROUND && env->flags[xMax+yMax*XMAX] == INGROUND)

// {

//  R_ParticleStatic (org);

///  return;

// }



dx = (xMax - xMin);

dy = (yMax - yMin);

if(dx <= 0 || dy <= 0)

 return;



//heightstep =512 * stepsize;

heightstep = env->height * stepsize;

height = env->heightdata + xMin*env->height;



//Terrain

tex_x = env->texres / env->width * xMin;

tex_dx = env->texres / env->width * stepsize;

tex_dy = env->texres / env->height * stepsize;

//detailtex_x = xMin * env->detailtexres;

//detailtex_dx = env->detailtexres * stepsize;

//detailtex_dy = env->detailtexres * stepsize;



glBindTexture (GL_TEXTURE_2D,env->texture);

for(x = xMin; x < xMax-stepsize; x+=stepsize, tex_x += tex_dx,  height+=heightstep)

{

 tex_y = env->texres / env->height * yMin;

 //detailtex_y = yMin * env->detailtexres;

 glBegin(GL_TRIANGLE_STRIP);

 for(y = yMin; y < yMax; y+=stepsize, tex_y += tex_dy)

 {



//   glColor3f(1,1,1);



/*

  qglMTexCoord2fSGIS(gl_mtextype, tex_y, tex_x+tex_dx);

  qglMTexCoord2fSGIS(gl_mtextype+1, detailtex_y, (detailtex_x+detailtex_dx));

  glVertex3f(x+stepsize, y, height[y+heightstep]);

  qglMTexCoord2fSGIS(gl_mtextype, tex_y, tex_x);

  qglMTexCoord2fSGIS(gl_mtextype+1, detailtex_y, detailtex_x);

  glVertex3f(x, y, height[y]);

*/



  glTexCoord2f( tex_y, tex_x+tex_dx);

  //glTexCoord2f( detailtex_y, (detailtex_x+detailtex_dx));

  glVertex3f(x+stepsize, y, height[y+heightstep]);

  glTexCoord2f( tex_y, tex_x);

  //glTexCoord2f( detailtex_y, detailtex_x);

  glVertex3f(x, y, height[y]);

 }

 glEnd();

}



//return;



//if (stepsize>1)

// return;



xMin = oldxMin;

xMax = oldxMax;

yMax = oldyMax;

yMin = oldyMin;





lstep(xMin);

hstep(xMax);

lstep(yMin);

hstep(yMax);



dx = (xMax - xMin);

dy = (yMax - yMin);





//heightstep =512 * stepsize;

heightstep =env->height * stepsize;

height = env->heightdata + xMin*env->height;







//Terrain

tex_x = env->detailtexres / env->width * xMin;

tex_dx = env->detailtexres / env->width * stepsize;

tex_dy = env->detailtexres / env->height * stepsize;



glColor4f (1,1,1,1);

glBindTexture (GL_TEXTURE_2D,env->detailtexture);

glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);



for(x = xMin; x < xMax-stepsize; x+=stepsize, tex_x += tex_dx, height+=heightstep)

{

 tex_y = env->detailtexres / env->height * yMin;



 glBegin(GL_TRIANGLE_STRIP);

 for(y = yMin; y < yMax; y+=stepsize, tex_y += tex_dy)

 {



  glTexCoord2f( tex_y, tex_x+tex_dx);

  glVertex3f(x+stepsize, y, height[y+heightstep]);

  glTexCoord2f( tex_y, tex_x);

  glVertex3f(x, y, height[y]);

 }

 glEnd();

}

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glColor4f (1,1,1,1);





}

#endif



int ENV_Clamp(int x, int xclamp)

{

if(x < 0) x = 0;

if(x > xclamp) x = xclamp;

return x;

}



extern cvar_t r_cloudz,temp1;





void ENV_DrawScene(void)

{

env_t *env;

double time;

static float lastime = 0;

static compiled = false;

extern float   framesmedium;

extern float latestfps;



if(!cl.worldmodel->environment)

 return;



/*

//Experimental profiler

if (lastime < cl.time)

{

 if (framesmedium>60 && latestfps > 40)

 {

  Cvar_Set("env_dist", va("%f",env_dist.value - 1));

 }

 else

 if (framesmedium<40 && latestfps < 60)

 {

  Cvar_Set("env_dist", va("%f",env_dist.value + 1));

 }

 lastime = cl.time + 1;

}

*/





//

// This can be moved inside the callist, but i fear will damage

// compatibility

//



env = cl.worldmodel->environment;



env->origin[0] = env_x.value;

env->origin[1] = env_y.value;

env->origin[2] = env_z.value;



env->scale[0] = env_sx.value;

env->scale[1] = env_sy.value;

env->scale[2] = env_sz.value;





env->detailtexres = env_sdetail.value;

env->texres   = env_stex.value;





glPushMatrix();

glTranslatef(env->origin[0], env->origin[1], env->origin[2]);

glRotatef (env->rotation[1],  0, 0, 1);

glRotatef (env->rotation[0],  0, 1, 0);

glRotatef (env->rotation[2],  1, 0, 0);

glScalef(env->scale[0], env->scale[1], env->scale[2]);

glColor3f(1,1,1);



if (env_compiled.value)

{

 if (!compiled)

 {

  glNewList(1,GL_COMPILE);

  ENV_DrawPart(env, 0, env->width,  0,  env->height,  env_dist.value);//[-1,  1]x[-1,  1]

  glEndList();



  compiled = true;

  //Con_Printf("GenListn");

 }

 else

   glCallList(1); //14x faster

}

else

 ENV_DrawPart(env, 0, env->width,  0,  env->height,  env_dist.value);//[-1,  1]x[-1,  1]



glPopMatrix();

}



[/tt][/pre]
                               
#57
General Audio / Ozymandias necesita tu musica.
02 de Mayo de 2003, 12:44:52 AM
                                Necesito que alguien me preste musica para un clon del Sim City con ambientacion similar al Dune y toques arcade que estoy haciendo.

Aqui teneis screenshots:
http://mods.moddb.com/1368/

Me podria venir bien estos estilos:
- arabe con toques cyber
- ambiental que interrumpa muy poco, para un background bajito
- un loop que no ralle y sea cañero
- lo que me podais ofrecer                                
#58
Dibujo / solo saludar
24 de Enero de 2003, 10:36:25 PM
                                solo queria saludar a la gente, que hace mucho que no paso por aqui.                                
#59
Proyectos / Telejano
11 de Enero de 2003, 11:08:51 PM
                                Viento en popa a toda vela. [http://telejano.berlios.de]

Saludos a todos los engine coders!.

Tei                                
#60
General / Lo que los usuarios quieren...
01 de Enero de 1970, 01:00:00 AM
                                Ultimamente estoy recibiendo bastante feedback de parte de los usuarios de mi motor 3d (telejano). De echo, y aunque durante años yo he sido la fuerza creativa ahora mismo me bastaria  con hacerles lo que piden(aunque me sigo sacando de la manga temas para sorprender un poco).

He encontrado que esto es lo que quieren los usuarios (en conjunto, que si vas a lo fino hay muchos tipos de):

* buenos sistemas de menus para acceder a todas las opciones, la opcion que no esta en un menu no existe.
* el FPS mas alto posible incluso para resoluciones absurdas que a mi jamas se me ocurriria poner (mucho mas de 1024x768x32.. se te quejan si pillan menos de 70FPS)
* un buen funcionamiento del modo multiplayer
* optimizacion, optimizacion, optimizacion
* cuando algo esta roto, te lo hacen saber :riendo:

Que experiencia tienen con los usarios de su motor 3d?

por cierto, a mi los usuarios me mailean, dejan comentarios en mi web o charlan en los foros (en los que yo tambien charlo), digamos que no me quedo esperando su feedback :riendo:                                





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.