fix .gravity on non-players.
try to fix webgl's mouse cursors on misaligned canvases. fix q2 tent issue. fix bmp screenshots. allow disabling packages via renaming, instead of only deleting. support negative dlights. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5133 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
d980fd74a0
commit
e8c0014b58
16 changed files with 121 additions and 54 deletions
|
@ -2415,6 +2415,13 @@ qboolean SCR_ScreenShot (char *filename, enum fs_relative fsroot, void **buffer,
|
||||||
char ext[8];
|
char ext[8];
|
||||||
void *nbuffers[2];
|
void *nbuffers[2];
|
||||||
|
|
||||||
|
switch(fmt)
|
||||||
|
{ //nuke any alpha channel...
|
||||||
|
case TF_RGBA32: fmt = TF_RGBX32; break;
|
||||||
|
case TF_BGRA32: fmt = TF_BGRX32; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!bytestride)
|
if (!bytestride)
|
||||||
bytestride = width*4;
|
bytestride = width*4;
|
||||||
if (bytestride < 0)
|
if (bytestride < 0)
|
||||||
|
|
|
@ -3426,7 +3426,7 @@ void CLQ2_ParseTEnt (void)
|
||||||
|
|
||||||
case Q2TE_FORCEWALL:
|
case Q2TE_FORCEWALL:
|
||||||
MSG_ReadPos (pos);
|
MSG_ReadPos (pos);
|
||||||
MSG_ReadDir (pos2);
|
MSG_ReadPos (pos2);
|
||||||
color = MSG_ReadByte ();
|
color = MSG_ReadByte ();
|
||||||
P_ParticleTrailIndex(pos, pos2, pt, color, 0, NULL);
|
P_ParticleTrailIndex(pos, pos2, pt, color, 0, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2055,6 +2055,7 @@ typedef struct bmpheader_s
|
||||||
unsigned short Reserved1;
|
unsigned short Reserved1;
|
||||||
unsigned short Reserved2;
|
unsigned short Reserved2;
|
||||||
unsigned int OffsetofBMPBits;
|
unsigned int OffsetofBMPBits;
|
||||||
|
|
||||||
unsigned int SizeofBITMAPINFOHEADER;
|
unsigned int SizeofBITMAPINFOHEADER;
|
||||||
signed int Width;
|
signed int Width;
|
||||||
signed int Height;
|
signed int Height;
|
||||||
|
@ -2074,7 +2075,8 @@ typedef struct bmpheaderv4_s
|
||||||
unsigned int BlueMask;
|
unsigned int BlueMask;
|
||||||
unsigned int AlphaMask;
|
unsigned int AlphaMask;
|
||||||
qbyte ColourSpace[4]; //"Win " or "sRGB"
|
qbyte ColourSpace[4]; //"Win " or "sRGB"
|
||||||
qbyte ColourSpaceCrap[24+4*3];
|
qbyte ColourSpaceCrap[12*3];
|
||||||
|
unsigned int Gamma[3];
|
||||||
} bmpheaderv4_t;
|
} bmpheaderv4_t;
|
||||||
|
|
||||||
qbyte *ReadBMPFile(qbyte *buf, int length, int *width, int *height)
|
qbyte *ReadBMPFile(qbyte *buf, int length, int *width, int *height)
|
||||||
|
@ -2270,17 +2272,11 @@ qboolean WriteBMPFile(char *filename, enum fs_relative fsroot, qbyte *in, int in
|
||||||
outstride = width * (bits/8);
|
outstride = width * (bits/8);
|
||||||
outstride = (outstride+3)&~3; //bmp pads rows to a multiple of 4 bytes.
|
outstride = (outstride+3)&~3; //bmp pads rows to a multiple of 4 bytes.
|
||||||
|
|
||||||
data = BZ_Malloc(2+sizeof(h)+extraheadersize+width*outstride);
|
|
||||||
out = data+2+sizeof(h)+extraheadersize;
|
|
||||||
|
|
||||||
|
|
||||||
data[0] = 'B';
|
|
||||||
data[1] = 'M';
|
|
||||||
h.Size = 2+sizeof(h)+extraheadersize + outstride*height;
|
h.Size = 2+sizeof(h)+extraheadersize + outstride*height;
|
||||||
h.Reserved1 = 0;
|
h.Reserved1 = 0;
|
||||||
h.Reserved2 = 0;
|
h.Reserved2 = 0;
|
||||||
h.OffsetofBMPBits = 2+sizeof(h)+extraheadersize;
|
h.OffsetofBMPBits = 2+sizeof(h)+extraheadersize; //yes, this is misaligned.
|
||||||
h.SizeofBITMAPINFOHEADER = sizeof(h)+extraheadersize;
|
h.SizeofBITMAPINFOHEADER = (sizeof(h)-12)+extraheadersize;
|
||||||
h.Width = width;
|
h.Width = width;
|
||||||
h.Height = height;
|
h.Height = height;
|
||||||
h.Planes = 1;
|
h.Planes = 1;
|
||||||
|
@ -2291,9 +2287,18 @@ qboolean WriteBMPFile(char *filename, enum fs_relative fsroot, qbyte *in, int in
|
||||||
h.TargetDeviceYRes = 2835;
|
h.TargetDeviceYRes = 2835;
|
||||||
h.NumofColorIndices = 0;
|
h.NumofColorIndices = 0;
|
||||||
h.NumofImportantColorIndices = 0;
|
h.NumofImportantColorIndices = 0;
|
||||||
memcpy(data+2, &h, sizeof(h));
|
|
||||||
if (extraheadersize)
|
//bmp is bottom-up so flip it now.
|
||||||
memcpy(data+2+sizeof(h), &h4, sizeof(h4));
|
in += instride*(height-1);
|
||||||
|
instride *= -1;
|
||||||
|
|
||||||
|
out = data = BZ_Malloc(h.Size);
|
||||||
|
*out++ = 'B';
|
||||||
|
*out++ = 'M';
|
||||||
|
memcpy(out, &h, sizeof(h));
|
||||||
|
out += sizeof(h);
|
||||||
|
memcpy(out, &h4, extraheadersize);
|
||||||
|
out += extraheadersize;
|
||||||
|
|
||||||
for (y = 0; y < height; y++)
|
for (y = 0; y < height; y++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -260,7 +260,7 @@ qboolean PM_PurgeOnDisable(package_t *p)
|
||||||
if (p->flags & DPF_DISABLEDINSTALLED)
|
if (p->flags & DPF_DISABLEDINSTALLED)
|
||||||
return false;
|
return false;
|
||||||
//hashed packages can also be present and not enabled, but only if they're in the cache and not native
|
//hashed packages can also be present and not enabled, but only if they're in the cache and not native
|
||||||
if (*p->gamedir && p->qhash && (p->flags & DPF_CACHED))
|
if (*p->gamedir && p->qhash && (p->flags & DPF_PRESENT))
|
||||||
return false;
|
return false;
|
||||||
//FIXME: add basedir-plugins to the package manager so they can be enabled/disabled properly.
|
//FIXME: add basedir-plugins to the package manager so they can be enabled/disabled properly.
|
||||||
//if (p->arch)
|
//if (p->arch)
|
||||||
|
@ -1472,7 +1472,7 @@ static unsigned int PM_ChangeList(char *out, size_t outsize)
|
||||||
else
|
else
|
||||||
change = va(" install %s\n", p->name);
|
change = va(" install %s\n", p->name);
|
||||||
}
|
}
|
||||||
else if ((p->flags & DPF_PURGE) || !(p->qhash && (p->flags & DPF_CACHED)))
|
else if ((p->flags & DPF_PURGE) || !(p->qhash && (p->flags & DPF_PRESENT)))
|
||||||
change = va(" uninstall %s\n", p->name);
|
change = va(" uninstall %s\n", p->name);
|
||||||
else
|
else
|
||||||
change = va(" disable %s\n", p->name);
|
change = va(" disable %s\n", p->name);
|
||||||
|
@ -2285,6 +2285,7 @@ static void PM_StartADownload(void)
|
||||||
static void PM_ApplyChanges(void)
|
static void PM_ApplyChanges(void)
|
||||||
{
|
{
|
||||||
package_t *p, **link;
|
package_t *p, **link;
|
||||||
|
char temp[MAX_OSPATH];
|
||||||
|
|
||||||
if (pkg_updating)
|
if (pkg_updating)
|
||||||
return;
|
return;
|
||||||
|
@ -2331,7 +2332,6 @@ static void PM_ApplyChanges(void)
|
||||||
if (*p->gamedir)
|
if (*p->gamedir)
|
||||||
{
|
{
|
||||||
char *f = va("%s/%s", p->gamedir, dep->name);
|
char *f = va("%s/%s", p->gamedir, dep->name);
|
||||||
char temp[MAX_OSPATH];
|
|
||||||
if (p->qhash && FS_GenCachedPakName(f, p->qhash, temp, sizeof(temp)) && PM_CheckFile(temp, p->fsroot))
|
if (p->qhash && FS_GenCachedPakName(f, p->qhash, temp, sizeof(temp)) && PM_CheckFile(temp, p->fsroot))
|
||||||
{
|
{
|
||||||
if (!FS_Remove(temp, p->fsroot))
|
if (!FS_Remove(temp, p->fsroot))
|
||||||
|
@ -2346,7 +2346,21 @@ static void PM_ApplyChanges(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
for (dep = p->deps; dep; dep = dep->next)
|
||||||
|
{
|
||||||
|
if (dep->dtype == DEP_FILE)
|
||||||
|
{
|
||||||
|
if (*p->gamedir)
|
||||||
|
{
|
||||||
|
char *f = va("%s/%s", p->gamedir, dep->name);
|
||||||
|
if ((p->flags & DPF_NATIVE) && p->qhash && FS_GenCachedPakName(f, p->qhash, temp, sizeof(temp)))
|
||||||
|
FS_Rename(f, temp, p->fsroot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Con_Printf("Disabling package %s\n", p->name);
|
Con_Printf("Disabling package %s\n", p->name);
|
||||||
|
}
|
||||||
p->flags &= ~(DPF_PURGE|DPF_ENABLED);
|
p->flags &= ~(DPF_PURGE|DPF_ENABLED);
|
||||||
|
|
||||||
/* FIXME: windows bug:
|
/* FIXME: windows bug:
|
||||||
|
|
|
@ -7029,7 +7029,6 @@ qboolean CSQC_Init (qboolean anycsqc, qboolean csdatenabled, unsigned int checks
|
||||||
csqc_world.Event_ContentsTransition = CSQC_Event_ContentsTransition;
|
csqc_world.Event_ContentsTransition = CSQC_Event_ContentsTransition;
|
||||||
csqc_world.Get_CModel = CSQC_World_ModelForIndex;
|
csqc_world.Get_CModel = CSQC_World_ModelForIndex;
|
||||||
csqc_world.Get_FrameState = CSQC_World_GetFrameState;
|
csqc_world.Get_FrameState = CSQC_World_GetFrameState;
|
||||||
csqc_world.defaultgravityscale = 1;
|
|
||||||
World_ClearWorld(&csqc_world, false);
|
World_ClearWorld(&csqc_world, false);
|
||||||
CSQC_InitFields(); //let the qclib know the field order that the engine needs.
|
CSQC_InitFields(); //let the qclib know the field order that the engine needs.
|
||||||
|
|
||||||
|
|
|
@ -496,8 +496,7 @@ static void Surf_AddDynamicLightsColours (msurface_t *surf)
|
||||||
|
|
||||||
rad = cl_dlights[lnum].radius;
|
rad = cl_dlights[lnum].radius;
|
||||||
VectorSubtract(cl_dlights[lnum].origin, currententity->origin, lightofs);
|
VectorSubtract(cl_dlights[lnum].origin, currententity->origin, lightofs);
|
||||||
dist = DotProduct (lightofs, surf->plane->normal) -
|
dist = DotProduct (lightofs, surf->plane->normal) - surf->plane->dist;
|
||||||
surf->plane->dist;
|
|
||||||
rad -= fabs(dist);
|
rad -= fabs(dist);
|
||||||
minlight = cl_dlights[lnum].minlight;
|
minlight = cl_dlights[lnum].minlight;
|
||||||
if (rad < minlight)
|
if (rad < minlight)
|
||||||
|
@ -525,16 +524,17 @@ static void Surf_AddDynamicLightsColours (msurface_t *surf)
|
||||||
b = cl_dlights[lnum].color[2]*128;
|
b = cl_dlights[lnum].color[2]*128;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (cl_dlights[lnum].type == 1) //a wierd effect.
|
bl = blocklights;
|
||||||
|
if (r < 0 || g < 0 || b < 0)
|
||||||
{
|
{
|
||||||
for (t = 0 ; t<tmax ; t++)
|
for (t = 0 ; t<tmax ; t++)
|
||||||
{
|
{
|
||||||
td = local[1] - t*surf->lmscale;
|
td = local[1] - (t<<surf->lmshift);
|
||||||
if (td < 0)
|
if (td < 0)
|
||||||
td = -td;
|
td = -td;
|
||||||
for (s=0 ; s<smax ; s++)
|
for (s=0 ; s<smax ; s++)
|
||||||
{
|
{
|
||||||
sd = local[0] - s*surf->lmscale;
|
sd = local[0] - (s<<surf->lmshift);
|
||||||
if (sd < 0)
|
if (sd < 0)
|
||||||
sd = -sd;
|
sd = -sd;
|
||||||
if (sd > td)
|
if (sd > td)
|
||||||
|
@ -543,16 +543,19 @@ static void Surf_AddDynamicLightsColours (msurface_t *surf)
|
||||||
dist = td + (sd>>1);
|
dist = td + (sd>>1);
|
||||||
if (dist < minlight)
|
if (dist < minlight)
|
||||||
{
|
{
|
||||||
blocklights[t*smax + s] += 2*sin(dist/10+cl.time*20)*(rad - dist)*256 * cl_dlights[lnum].colour[0]*3;
|
i = bl[0] + (rad - dist)*r;
|
||||||
greenblklights[t*smax + s] += 2*sin(M_PI/3+dist/10+cl.time*20)*(rad - dist)*256 * cl_dlights[lnum].colour[1]*3;
|
bl[0] = (i<0)?0:i;
|
||||||
blueblklights[t*smax + s] += 2*sin(2*M_PI/3+dist/10+cl.time*20)*(rad - dist)*256 * cl_dlights[lnum].colour[2]*3;
|
i = bl[1] + (rad - dist)*g;
|
||||||
|
bl[1] = (i<0)?0:i;
|
||||||
|
i = bl[2] + (rad - dist)*b;
|
||||||
|
bl[2] = (i<0)?0:i;
|
||||||
}
|
}
|
||||||
|
bl += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*/ {
|
{
|
||||||
bl = blocklights;
|
|
||||||
for (t = 0 ; t<tmax ; t++)
|
for (t = 0 ; t<tmax ; t++)
|
||||||
{
|
{
|
||||||
td = local[1] - (t<<surf->lmshift);
|
td = local[1] - (t<<surf->lmshift);
|
||||||
|
|
|
@ -62,7 +62,7 @@ void R_ForceSky_f(void)
|
||||||
else if (*cl.skyname)
|
else if (*cl.skyname)
|
||||||
Con_Printf("Current per-map skybox is %s\n", cl.skyname);
|
Con_Printf("Current per-map skybox is %s\n", cl.skyname);
|
||||||
else
|
else
|
||||||
Con_Printf("no skybox forced.\n", cl.skyname);
|
Con_Printf("no skybox forced.\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -247,7 +247,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#define SIDEVIEWS 4 //enable secondary/reverse views.
|
#define SIDEVIEWS 4 //enable secondary/reverse views.
|
||||||
|
|
||||||
// #define DSPMODELS //doom sprites (only needs DOOMWADS to generate the right wad file names)
|
// #define DSPMODELS //doom sprites (only needs PACKAGE_DOOMWAD to generate the right wad file names)
|
||||||
#define SPRMODELS //quake1 sprite models
|
#define SPRMODELS //quake1 sprite models
|
||||||
#define SP2MODELS //quake2 sprite models
|
#define SP2MODELS //quake2 sprite models
|
||||||
#define MD1MODELS //quake1 alias models
|
#define MD1MODELS //quake1 alias models
|
||||||
|
@ -262,7 +262,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#define RAGDOLL
|
#define RAGDOLL
|
||||||
|
|
||||||
#define HUFFNETWORK //huffman network compression
|
#define HUFFNETWORK //huffman network compression
|
||||||
#define DOOMWADS //doom wad/sprite support
|
// #define PACKAGE_DOOMWAD //doom wad support (maps+sprites are separate)
|
||||||
// #define MAP_DOOM //doom map support
|
// #define MAP_DOOM //doom map support
|
||||||
// #define MAP_PROC //doom3/quake4 map support
|
// #define MAP_PROC //doom3/quake4 map support
|
||||||
//#define WOLF3DSUPPORT //wolfenstein3d map support (not started yet)
|
//#define WOLF3DSUPPORT //wolfenstein3d map support (not started yet)
|
||||||
|
@ -444,7 +444,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#undef HALFLIFEMODELS
|
#undef HALFLIFEMODELS
|
||||||
#undef RUNTIMELIGHTING
|
#undef RUNTIMELIGHTING
|
||||||
#undef HEXEN2
|
#undef HEXEN2
|
||||||
#undef DOOMWADS
|
#undef PACKAGE_DOOMWAD
|
||||||
#undef MAP_PROC
|
#undef MAP_PROC
|
||||||
#undef Q1BSPS
|
#undef Q1BSPS
|
||||||
#undef Q2BSPS
|
#undef Q2BSPS
|
||||||
|
|
|
@ -199,8 +199,6 @@ struct world_s
|
||||||
double lastchecktime; // for monster ai
|
double lastchecktime; // for monster ai
|
||||||
qbyte *lastcheckpvs; // for monster ai
|
qbyte *lastcheckpvs; // for monster ai
|
||||||
|
|
||||||
float defaultgravityscale; //0 in QW, 1 for anything else (inc csqc)
|
|
||||||
|
|
||||||
/*antilag*/
|
/*antilag*/
|
||||||
float lagentsfrac;
|
float lagentsfrac;
|
||||||
laggedentinfo_t *lagents;
|
laggedentinfo_t *lagents;
|
||||||
|
|
|
@ -1444,7 +1444,8 @@ void GLBE_Init(void)
|
||||||
shaderstate.curentity = &r_worldentity;
|
shaderstate.curentity = &r_worldentity;
|
||||||
be_maxpasses = gl_config_nofixedfunc?1:gl_mtexarbable;
|
be_maxpasses = gl_config_nofixedfunc?1:gl_mtexarbable;
|
||||||
gl_stencilbits = 0;
|
gl_stencilbits = 0;
|
||||||
if (gl_config.glversion >= 3.0 && gl_config_nofixedfunc)
|
#ifndef GLESONLY
|
||||||
|
if (!gl_config_gles && gl_config.glversion >= 3.0 && gl_config_nofixedfunc)
|
||||||
{
|
{
|
||||||
//docs say this line should be okay in gl3+. nvidia do not seem to agree. GL_STENCIL_BITS is depricated however. so for now, just assume.
|
//docs say this line should be okay in gl3+. nvidia do not seem to agree. GL_STENCIL_BITS is depricated however. so for now, just assume.
|
||||||
qglGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER_EXT, GL_STENCIL, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, &gl_stencilbits);
|
qglGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER_EXT, GL_STENCIL, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, &gl_stencilbits);
|
||||||
|
@ -1452,6 +1453,7 @@ void GLBE_Init(void)
|
||||||
gl_stencilbits = 8;
|
gl_stencilbits = 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
qglGetIntegerv(GL_STENCIL_BITS, &gl_stencilbits);
|
qglGetIntegerv(GL_STENCIL_BITS, &gl_stencilbits);
|
||||||
for (i = 0; i < FTABLE_SIZE; i++)
|
for (i = 0; i < FTABLE_SIZE; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5924,7 +5924,7 @@ void Mod_LoadDoomSprite (model_t *mod)
|
||||||
frame.left = -header->xpos;
|
frame.left = -header->xpos;
|
||||||
frame.right = header->width - header->xpos;
|
frame.right = header->width - header->xpos;
|
||||||
|
|
||||||
t[0] = t[1] = max(abs(frame.left),abs(frame.right));
|
t[0] = t[1] = max(fabs(frame.left),fabs(frame.right));
|
||||||
t[2] = frame.up;
|
t[2] = frame.up;
|
||||||
AddPointToBounds(t, mod->mins, mod->maxs);
|
AddPointToBounds(t, mod->mins, mod->maxs);
|
||||||
t[0] *= -1;
|
t[0] *= -1;
|
||||||
|
|
|
@ -841,3 +841,37 @@ r_part TEQ2_BOSSTPORT
|
||||||
scalefactor 0.8
|
scalefactor 0.8
|
||||||
sound "misc/bigtele.wav" 1 0 0 0 1
|
sound "misc/bigtele.wav" 1 0 0 0 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
r_part teq2_heatbeam_steam
|
||||||
|
{
|
||||||
|
count 20
|
||||||
|
colorindex 0xe0 7
|
||||||
|
// magnitude 60
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20 magnitude/3
|
||||||
|
veladd magnitude
|
||||||
|
orgadd magnitude/10
|
||||||
|
spawnorg 4
|
||||||
|
gravity -400
|
||||||
|
scalefactor 0.8
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//this is apparently just a trail effect (palette index specified by netcode)
|
||||||
|
r_part teq2_forcewall
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
scale 0.5
|
||||||
|
alpha 1
|
||||||
|
scalefactor 0.8
|
||||||
|
step 5
|
||||||
|
spawnorg 3
|
||||||
|
randomvel 5
|
||||||
|
die 3 3.5
|
||||||
|
}
|
||||||
|
|
|
@ -2013,10 +2013,6 @@ void Q_InitProgs(void)
|
||||||
|
|
||||||
sv.world.edict_size = PR_InitEnts(svprogfuncs, sv.world.max_edicts);
|
sv.world.edict_size = PR_InitEnts(svprogfuncs, sv.world.max_edicts);
|
||||||
|
|
||||||
if (progstype == PROG_QW)
|
|
||||||
sv.world.defaultgravityscale = 0;
|
|
||||||
else
|
|
||||||
sv.world.defaultgravityscale = 1;
|
|
||||||
#ifdef HEXEN2
|
#ifdef HEXEN2
|
||||||
SV_RegisterH2CustomTents();
|
SV_RegisterH2CustomTents();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -559,10 +559,11 @@ SV_AddGravity
|
||||||
|
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
static void WPhys_AddGravity (world_t *w, wedict_t *ent, const float *gravitydir, float scale)
|
static void WPhys_AddGravity (world_t *w, wedict_t *ent, const float *gravitydir)
|
||||||
{
|
{
|
||||||
|
float scale = ent->xv->gravity;
|
||||||
if (!scale)
|
if (!scale)
|
||||||
scale = w->defaultgravityscale;
|
scale = 1.0;
|
||||||
|
|
||||||
VectorMA(ent->v->velocity, scale * movevars.gravity * host_frametime, gravitydir, ent->v->velocity);
|
VectorMA(ent->v->velocity, scale * movevars.gravity * host_frametime, gravitydir, ent->v->velocity);
|
||||||
}
|
}
|
||||||
|
@ -1331,7 +1332,7 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent)
|
||||||
&& ent->v->movetype != MOVETYPE_FLYMISSILE
|
&& ent->v->movetype != MOVETYPE_FLYMISSILE
|
||||||
&& ent->v->movetype != MOVETYPE_BOUNCEMISSILE
|
&& ent->v->movetype != MOVETYPE_BOUNCEMISSILE
|
||||||
&& ent->v->movetype != MOVETYPE_H2SWIM)
|
&& ent->v->movetype != MOVETYPE_H2SWIM)
|
||||||
WPhys_AddGravity (w, ent, gravitydir, 1.0);
|
WPhys_AddGravity (w, ent, gravitydir);
|
||||||
|
|
||||||
// move angles
|
// move angles
|
||||||
VectorMA (ent->v->angles, host_frametime, ent->v->avelocity, ent->v->angles);
|
VectorMA (ent->v->angles, host_frametime, ent->v->avelocity, ent->v->angles);
|
||||||
|
@ -1455,7 +1456,7 @@ static void WPhys_Physics_Step (world_t *w, wedict_t *ent)
|
||||||
{
|
{
|
||||||
hitsound = -DotProduct(gravitydir, ent->v->velocity) < movevars.gravity*-0.1;
|
hitsound = -DotProduct(gravitydir, ent->v->velocity) < movevars.gravity*-0.1;
|
||||||
|
|
||||||
WPhys_AddGravity (w, ent, gravitydir, 1.0);
|
WPhys_AddGravity (w, ent, gravitydir);
|
||||||
WPhys_CheckVelocity (w, ent);
|
WPhys_CheckVelocity (w, ent);
|
||||||
WPhys_FlyMove (w, ent, gravitydir, host_frametime, NULL);
|
WPhys_FlyMove (w, ent, gravitydir, host_frametime, NULL);
|
||||||
World_LinkEdict (w, ent, true);
|
World_LinkEdict (w, ent, true);
|
||||||
|
@ -2180,7 +2181,7 @@ void WPhys_RunEntity (world_t *w, wedict_t *ent)
|
||||||
gravitydir = w->g.defaultgravitydir;
|
gravitydir = w->g.defaultgravitydir;
|
||||||
|
|
||||||
if (!WPhys_CheckWater (w, ent) && ! ((int)ent->v->flags & FL_WATERJUMP) )
|
if (!WPhys_CheckWater (w, ent) && ! ((int)ent->v->flags & FL_WATERJUMP) )
|
||||||
WPhys_AddGravity (w, ent, gravitydir, ent->xv->gravity);
|
WPhys_AddGravity (w, ent, gravitydir);
|
||||||
WPhys_CheckStuck (w, ent);
|
WPhys_CheckStuck (w, ent);
|
||||||
|
|
||||||
WPhys_WalkMove (w, ent, gravitydir);
|
WPhys_WalkMove (w, ent, gravitydir);
|
||||||
|
|
|
@ -114,7 +114,9 @@ mergeInto(LibraryManager.library,
|
||||||
break;
|
break;
|
||||||
case 'resize':
|
case 'resize':
|
||||||
if (FTEC.evcb.resize != 0)
|
if (FTEC.evcb.resize != 0)
|
||||||
|
{
|
||||||
Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]);
|
Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'mousemove':
|
case 'mousemove':
|
||||||
if (FTEC.evcb.mouse != 0)
|
if (FTEC.evcb.mouse != 0)
|
||||||
|
@ -134,7 +136,10 @@ mergeInto(LibraryManager.library,
|
||||||
Runtime.dynCall('viidddd', FTEC.evcb.mouse, [0, false, event.movementX, event.movementY, 0, 0]);
|
Runtime.dynCall('viidddd', FTEC.evcb.mouse, [0, false, event.movementX, event.movementY, 0, 0]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Runtime.dynCall('viidddd', FTEC.evcb.mouse, [0, true, event.pageX, event.pageY, 0, 0]);
|
{
|
||||||
|
var rect = Module['canvas'].getBoundingClientRect();
|
||||||
|
Runtime.dynCall('viidddd', FTEC.evcb.mouse, [0, true, (event.clientX - rect.left)*(Module['canvas'].width/rect.width), (event.clientY - rect.top)*(Module['canvas'].height/rect.height), 0, 0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'mousedown':
|
case 'mousedown':
|
||||||
|
@ -432,7 +437,7 @@ mergeInto(LibraryManager.library,
|
||||||
'keypress', 'keydown', 'keyup',
|
'keypress', 'keydown', 'keyup',
|
||||||
'touchstart', 'touchend', 'touchcancel', 'touchleave', 'touchmove',
|
'touchstart', 'touchend', 'touchcancel', 'touchleave', 'touchmove',
|
||||||
'dragenter', 'dragover', 'drop',
|
'dragenter', 'dragover', 'drop',
|
||||||
'message',
|
'message', 'resize',
|
||||||
'pointerlockchange', 'mozpointerlockchange', 'webkitpointerlockchange',
|
'pointerlockchange', 'mozpointerlockchange', 'webkitpointerlockchange',
|
||||||
'focus', 'blur']; //try to fix alt-tab
|
'focus', 'blur']; //try to fix alt-tab
|
||||||
events.forEach(function(event)
|
events.forEach(function(event)
|
||||||
|
@ -453,11 +458,11 @@ mergeInto(LibraryManager.library,
|
||||||
window.addEventListener(event, FTEC.handleevent, true);
|
window.addEventListener(event, FTEC.handleevent, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
Browser.resizeListeners.push(function(w, h) {
|
// Browser.resizeListeners.push(function(w, h) {
|
||||||
FTEC.handleevent({
|
// FTEC.handleevent({
|
||||||
type: 'resize',
|
// type: 'resize',
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
var ctx = Browser.createContext(Module['canvas'], true, true);
|
var ctx = Browser.createContext(Module['canvas'], true, true);
|
||||||
if (ctx == null)
|
if (ctx == null)
|
||||||
|
@ -482,7 +487,10 @@ mergeInto(LibraryManager.library,
|
||||||
// Browser.windowedHeight = window.innerHeight;
|
// Browser.windowedHeight = window.innerHeight;
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
Browser.setCanvasSize(window.innerWidth, window.innerHeight, false);
|
{
|
||||||
|
var rect = Module['canvas'].getBoundingClientRect();
|
||||||
|
Browser.setCanvasSize(rect.width, rect.height, false);
|
||||||
|
}
|
||||||
if (FTEC.evcb.resize != 0)
|
if (FTEC.evcb.resize != 0)
|
||||||
Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]);
|
Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]);
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
<meta name=viewport content="width=device-width, initial-scale=1">
|
<meta name=viewport content="width=device-width, initial-scale=1">
|
||||||
<title>FTE QuakeWorld</title>
|
<title>FTE QuakeWorld</title>
|
||||||
<style>
|
<style>
|
||||||
body { background-color:#000000; color:#808080; height:100%;width:100%;margin:0;padding:0;}
|
html,body { background-color:#000000; color:#808080; height:100%;width:100%;margin:0;padding:0;}
|
||||||
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
|
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
|
||||||
div.emscripten { text-align: center; padding:0; margin: 0;}
|
div.emscripten { text-align: center; padding:0; margin: 0;}
|
||||||
div.emscripten_border { padding:0; margin: 0; }
|
div.emscripten_border { padding:0; margin: 0; width:100%; height: 100%;}
|
||||||
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
|
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
|
||||||
canvas.emscripten { border: 0px none; width:100%; height:100%; padding:0; margin: 0;}
|
canvas.emscripten { border: 0px none; width:100%; height:100%; padding:0; margin: 0;}
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue