Old school quake, well not quite but

Discuss anything not covered by any of the other categories.
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Old school quake, well not quite but

Post by revelator »

https://sourceforge.net/projects/cbadva ... p/download

Enjoy ;)

Little list of features

DOT3 normal mapping (no PPL uses player position to get bumpverts).
Stainmaps.
Specular.
Dual pass water warp, emulating shaders.
Ingame models used for HUD and loading screens.
lit support.
Flares on light entities.
Bloom, i set a pretty conservative value for bloom_alpha as a default, but you can set it from the menu if you find other values to look better.
Beefed up particle system, pretty true to the original (oh yeah smoking guns to).
Stencil based heathaze on lava, also uses arb shading.
underwater fog, colors are parsed out of the water textures so it allways looks right.
Particle replacements for the most grizzly by todays standard looking sprites(light globes bubbles and such).
External texture support, TGA + PCX + PNG + BMP.
Skyspheres.
Lumas + fullbrights.
pk3 support.

VM is from bengt jardrups enhanced glquake, it does have a small bug cause it crashes on the rogue mission pack demo. The game plays fine though.
Engine is a bit picky about correct lumas, if something turns up dark and it should not be check if you have a luma texture for the affected model/surf and either fix it or remove it.

I have applied a large deal of the fixes from the tutorial section, so one could call it a community effort :)
The base Engine was MHQuake9 MH's last OpenGL based engine before he started work on D3DQuake,
i know hees not to happy with some of the things in it, but it looks great so would be a shame to let it go to waste.
Productivity is a state of mind.
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Code could use a good overhaul sometime cause it has a problem in fast matches where it stalls a lot because of all the data being pushed through the arrays.
Moving to VBO's would probably be a good starting point, also batching up some of the state changes.

Little addition in next version

Code: Select all

/*
================
R_TurbDepthOn

Utility function,
Newer turn of depth checking,
unless the alpha channel is below 1.0f
================
*/
__forceinline void R_TurbDepthOn(float alpha)
{
    glEnable (GL_BLEND);

    // the Z check is newer needed,
    // when there is no alpha.
    if (alpha < 1.0f)
    {
        glDepthMask (GL_FALSE);
    }
}

/*
================
R_TurbDepthOff

Utility function,
Newer turn of depth checking,
unless the alpha channel is below 1.0f
================
*/
__forceinline void R_TurbDepthOff(float alpha)
{
    glDisable (GL_BLEND);

    // the Z check is newer needed,
    // when there is no alpha.
    if (alpha < 1.0f)
    {
        glDepthMask (GL_TRUE);
    }
}

/*
================
R_TurbShaderOn

Fragment shader waterwarp MrG.
================
*/
__forceinline void R_TurbShaderOn (void)
{
    // added arb shader for non nvidia cards
    if (GL_ExtensionBits & HAS_ARBFRAGMENTSHADERS)
    {
        // values are rgb + alpha but can also be texture coords.
        glClientActiveTexture (GL_TEXTURE1);
        glBindTexture (GL_TEXTURE_2D, r_dst_texture.gltexnum);

        // enable TMU1
        glActiveTexture (GL_TEXTURE1);
        glEnable (GL_TEXTURE_2D);

        // run fragment shader
        glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fragment_programs[F_PROG_WARP]);
        glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST);
        glEnable (GL_FRAGMENT_PROGRAM_ARB);
    }
}

/*
================
R_TurbShaderOff

Fragment shader waterwarp MrG.
================
*/
__forceinline void R_TurbShaderOff (void)
{
    if (GL_ExtensionBits & HAS_ARBFRAGMENTSHADERS)
    {
        // back to TMU0
        glDisable (GL_TEXTURE_2D);
        glActiveTexture (GL_TEXTURE0);

        // kill fragment program
        glDisable (GL_FRAGMENT_PROGRAM_ARB);
    }
}

/*
================
R_DrawTurbFog

Underwater fog.
================
*/
__forceinline void R_DrawTurbFog (void)
{
    gltexture_t *tex;
    msurface_t	*surf;
    glpoly_t	*p;
    float       fogdist;
    float       fogalpha;
    float		*v;
    int			i;

    // if teleports or lava are drawn last they'll leave blending disabled coming in here, so
    // make a potentially redundant state change.  it's only once per frame, so live with it.
    R_TurbDepthOn(fogalpha);

    // default blendfunc for this
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // turn off texturing and ensure we have smooth shading
    glDisable (GL_TEXTURE_2D);
    glShadeModel (GL_SMOOTH);

    // enable vertex pointer - index 0 is the regular verts
    glEnableClientState (GL_VERTEX_ARRAY);
    glVertexPointer (3, GL_FLOAT, sizeof (waterverts_t), &waterarray[0]);

    // enable color array
    glEnableClientState (GL_COLOR_ARRAY);
    glColorPointer (4, GL_FLOAT, sizeof (waterverts_t), &waterarray[7]);

    // draw fog in liquids only
    if (GL_RenderState.waterthisframe)
    {
        // go through the texture list
        for (tex = TextureList; tex; tex = tex->TextureList)
        {
            // nothing chained
            if (!(surf = tex->texturechain)) continue;

           // we are not below water
            if (!(surf->flags & SURF_UNDERWATER)) continue;

            // it ain't liquid
            if (!(surf->flags & SURF_DRAWTURB)) continue;

            // don't put fog on teleports
            if (surf->flags & SURF_DRAWTELE) continue;

             // go through the surfs in the chain
            for (/**/; surf; surf = surf->texturechain)
            {
                // not a volume fit for this
                if (!surf->volumetexture) continue;

                // water surfs have a chained list of polys rather than just 1
                for (p = surf->polys; p; p = p->next)
                {
                    // need to go through each vert in the list to set the colours
                    for (i = 0; i < p->numverts; i++)
                    {
                        // get a pointer to the verts to keep the code more readable
                        v = p->water[i].v;

                        p->water[i].rgba[0] = surf->texinfo->texture->gl_texture->rgba[0];
                        p->water[i].rgba[1] = surf->texinfo->texture->gl_texture->rgba[1];
                        p->water[i].rgba[2] = surf->texinfo->texture->gl_texture->rgba[2];

                        if (surf->flags & SURF_DRAWLAVA)
                        {
                            // constant fog
                            fogalpha = FOG_ALPHA_LAVA_CONST;
                        }
                        else if (surf->flags & SURF_DRAWSLIME)
                        {
                            // constant fog
                            fogalpha = FOG_ALPHA_SLIME_CONST;
                        }
                        else
                        {
                            // distance fog
                            // use the transformed verts to get the dist
                            fogdist = (v[0] - r_origin[0]) * vpn[0] + (v[1] - r_origin[1]) * vpn[1] + (v[2] - r_origin[2]) * vpn[2];

                            if (fogdist < FOG_MINRANGE)
                            {
                                fogdist = FOG_MINRANGE;
                            }
                            else if (fogdist > FOG_MAXRANGE)
                            {
                                fogdist = FOG_MAXRANGE;
                            }
                            fogalpha = 0.3f + (fogdist / FOG_MAXRANGE * FOG_ALPHA_MAX) * 0.5f;

                            // boost alpha a little cos the translucent water can make it hard to see
                            fogalpha *= 1.25f;
                        }
                        p->water[i].rgba[3] = fogalpha;
                    }

                    // draw the vertex array
                    glDrawArrays (GL_TRIANGLE_FAN, p->waterindex, p->numverts);
                }
            }
        }
    }

    // now bring color arrays back to the way they were.
    glDisableClientState (GL_COLOR_ARRAY);

    // kill vertex array
    glDisableClientState (GL_VERTEX_ARRAY);

    // bring texturing back
    glEnable (GL_TEXTURE_2D);

    // turn on Z and bring blend down again.
    R_TurbDepthOff(fogalpha);

    // some brain-dead drivers don;t restore from glColorMask properly, so...
    glColor4f (TURB_NOALPHA_CONST, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST);
}

/*
================
R_DrawWaterSurfaces

Emulated water shaders inc.
================
*/
void R_DrawWaterSurfaces (void)
{
    gltexture_t *tex;
    msurface_t	*surf;
    glpoly_t	*p;
    int			i;
    float		sadd, tadd;
    float		*v;

    // drawing parameters
    vector_t	warp1scale;
    vector_t	warp2scale;

    float		warp2sign;
    float       warpalpha;

    GLenum		WARP1_TEXENV;
    GLenum		WARP2_TEXENV;

    int			Warp1Texture;
    int			Warp2Texture;

    if (!GL_RenderState.waterthisframe) return;

    // back to the world matrix
    glLoadMatrixf (cl_entities[0].mvievmatrix);

    // enable blending
    R_TurbDepthOn(warpalpha);

    // default blendfunc for this
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // enable tmu 1
    glActiveTexture (GL_TEXTURE1);
    glEnable (GL_TEXTURE_2D);

    // enable vertex pointer - index 0 is the regular verts
    glEnableClientState (GL_VERTEX_ARRAY);
    glVertexPointer (3, GL_FLOAT, sizeof (waterverts_t), &waterarray[0]);

	// enable texcoord pointer for textures - index 3 is the st coords for warp 1
    glClientActiveTexture(GL_TEXTURE0);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof( waterverts_t ), &waterarray[3]);

    // lets do some shader magic here :)
    R_TurbShaderOn();

	// enable texcoord pointer for textures - index 5 is the st coords for warp 2
	// added arb shader for non nvidia cards
    glClientActiveTexture(GL_TEXTURE1);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof( waterverts_t ), &waterarray[5]);

    // enable color array
    glEnableClientState (GL_COLOR_ARRAY);
    glColorPointer (4, GL_FLOAT, sizeof (waterverts_t), &waterarray[7]);

   // go through the texture list
    for (tex = TextureList; tex; tex = tex->TextureList)
    {
        // nothing chained
        if (!(surf = tex->texturechain)) continue;

        // it ain't liquid
        if (!(surf->flags & SURF_DRAWTURB)) continue;

        // setup rendering parameters
        // these are actually absolutely excellent
        if (surf->flags & SURF_DRAWLAVA)
        {
            R_TurbDepthOff(warpalpha);

            // because this layer isn't visible, give it a massive size to make rendering it less expensive
            // (actually this doesn't matter cos the texture matrix is ignored here...)
            warp1scale.vec.x = 1.0f / 1024.0f;
            warp1scale.vec.y = 1.0f / 1024.0f;
            warp1scale.vec.z = 1.0f;

            warp2scale.vec.x = 1.0f / 128.0f;
            warp2scale.vec.y = 1.0f / 128.0f;
            warp2scale.vec.z = 1.0f;

            warp2sign = WARPSIGN_POSITIVE;
            warpalpha = TURB_NOALPHA_CONST;

            WARP1_TEXENV = GL_ZERO;     // special - instruct the renderer to ignore fancy stuff here
            WARP2_TEXENV = GL_REPLACE;  // make the 2nd warp a replace texenv also to avoid dual layer madness with lava

            // we could use any old crap for warp1 here..
            Warp1Texture = surf->texinfo->texture->gl_texture->gltexnum;
            Warp2Texture = surf->texinfo->texture->gl_texture->gltexnum;
        }
        else if (surf->flags & SURF_DRAWTELE)
        {
            R_TurbDepthOff(warpalpha);

            warp1scale.vec.x = 1.0f / 64.0f;
            warp1scale.vec.y = 1.0f / 64.0f;
            warp1scale.vec.z = 1.0f;

            warp2scale.vec.x = 1.0f / 24.0f;
            warp2scale.vec.y = 1.0f / 24.0f;
            warp2scale.vec.z = 1.0f;

            warp2sign = WARPSIGN_POSITIVE;
            warpalpha = TURB_NOALPHA_CONST;

            WARP1_TEXENV = GL_REPLACE;
            WARP2_TEXENV = GL_ADD;

            // we could use any old crap for warp1 here..
            Warp1Texture = surf->texinfo->texture->gl_texture->gltexnum;
            Warp2Texture = surf->texinfo->texture->gl_texture->gltexnum;
        }
        else if (surf->flags & SURF_DRAWSLIME)
        {
            R_TurbDepthOn(warpalpha);

            warp1scale.vec.x = 1.0f / 128.0f;
            warp1scale.vec.y = 1.0f / 128.0f;
            warp1scale.vec.z = 1.0f;

            warp2scale.vec.x = 1.0f / 256.0f;
            warp2scale.vec.y = 1.0f / 256.0f;
            warp2scale.vec.z = 1.0f;

            warp2sign = WARPSIGN_NEGATIVE;
            warpalpha = (r_wateralpha.value < TURB_ALPHA_MAX) ? TURB_ALPHA_SLIME_CONST : TURB_NOALPHA_CONST; // if it aint transparent to begin with...

            WARP1_TEXENV = GL_MODULATE;
            WARP2_TEXENV = GL_ADD;

            // we could use any old crap for warp1 here..
            Warp1Texture = surf->texinfo->texture->gl_texture->gltexnum;
            Warp2Texture = surf->texinfo->texture->gl_texture->gltexnum;
        }
        else
        {
            R_TurbDepthOn(warpalpha);

            warp1scale.vec.x = 1.0f / 128.0f;
            warp1scale.vec.y = 1.0f / 128.0f;
            warp1scale.vec.z = 1.0f;

            warp2scale.vec.x = 1.0f / 256.0f;
            warp2scale.vec.y = 1.0f / 256.0f;
            warp2scale.vec.z = 1.0f;

            warp2sign = WARPSIGN_POSITIVE;
            warpalpha = bound(TURB_ALPHA_MIN, r_wateralpha.value, TURB_ALPHA_MAX);

            WARP1_TEXENV = GL_MODULATE;
            WARP2_TEXENV = GL_ADD;

            // we could use any old crap for warp1 here..
            Warp1Texture = surf->texinfo->texture->gl_texture->gltexnum;
            Warp2Texture = surf->texinfo->texture->gl_texture->gltexnum;
        }

        // select texture 0
        glActiveTexture (GL_TEXTURE0);
        glBindTexture (GL_TEXTURE_2D, Warp1Texture);

         // only do this if we're doing dual layer, otherwise it's cheaper to do a very basic render than it
        // would be to change TMU states
        if (WARP1_TEXENV != GL_ZERO)
        {
            glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, WARP1_TEXENV);
            glMatrixMode (GL_TEXTURE);
            glLoadIdentity ();
            glScalef (warp1scale.vecs[0], warp1scale.vecs[1], warp1scale.vecs[2]);
            glMatrixMode (GL_MODELVIEW);
        }

        // select texture 1
        glActiveTexture (GL_TEXTURE1);
        glBindTexture (GL_TEXTURE_2D, Warp2Texture);

        glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, WARP2_TEXENV);
        glMatrixMode (GL_TEXTURE);
        glLoadIdentity ();
        glScalef (warp2scale.vecs[0], warp2scale.vecs[1], warp2scale.vecs[2]);
        glMatrixMode (GL_MODELVIEW);

        // go through the surfs in the chain
        for (/**/; surf; surf = surf->texturechain)
        {
            // water surfs have a chained list of polys rather than just 1
            for (p = surf->polys; p; p = p->next)
            {
                // need to go through each vert in the list to set the warped texcoords
                for (i = 0; i < p->numverts; i++)
                {
                    // get a pointer to the verts to keep the code more readable
                    v = p->water[i].v;

                    // calculate the amount to add for the warp
                    sadd = STSinTable[(int) ((v[surf->warpindex[1]] * 0.025 + realtime) * STMult) & STBitMask];
                    tadd = STSinTable[(int) ((v[surf->warpindex[0]] * 0.025 + realtime) * STMult) & STBitMask];

                    // set the warp verts
                    // fix water warping - derive the texcoords from the verts!!!  mad, but it works!!!
                    // warpindex is precalculated in gl_model.c - use the x2 STSinTable for 8 unit warps
                    p->water[i].warp1[0] = v[surf->warpindex[0]] + sadd;
                    p->water[i].warp1[1] = v[surf->warpindex[1]] + tadd;

                    // warp 2
                    p->water[i].warp2[0] = (v[surf->warpindex[0]] * warp2sign) + sadd;
                    p->water[i].warp2[1] = (v[surf->warpindex[1]] * warp2sign) + tadd;

                    // transparent water, yes we can have both this and fog alpha.
                    p->water[i].rgba[0] = TURB_NOALPHA_CONST;
                    p->water[i].rgba[1] = TURB_NOALPHA_CONST;
                    p->water[i].rgba[2] = TURB_NOALPHA_CONST;
                    p->water[i].rgba[3] = warpalpha;
                }

                // draw the vertex array
                glDrawArrays (GL_TRIANGLE_FAN, p->waterindex, p->numverts);
            }
        }
    }

    // restore state on tmu 0
    glActiveTexture (GL_TEXTURE1);
    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glMatrixMode (GL_TEXTURE);
    glLoadIdentity ();
    glMatrixMode (GL_MODELVIEW);
    glDisable(GL_TEXTURE_2D);

    // restore state on tmu 1
    glActiveTexture (GL_TEXTURE0);
    glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glMatrixMode (GL_TEXTURE);
    glLoadIdentity ();
    glMatrixMode (GL_MODELVIEW);

    // now bring color arrays back to the way they were.
    glDisableClientState (GL_COLOR_ARRAY);

    // kill texcoord arrays
    glClientActiveTexture (GL_TEXTURE1);
    glDisableClientState (GL_TEXTURE_COORD_ARRAY);

    // now bring it down again
    R_TurbShaderOff();

    glClientActiveTexture (GL_TEXTURE0);
    glDisableClientState (GL_TEXTURE_COORD_ARRAY);

    // kill vertex array
    glDisableClientState (GL_VERTEX_ARRAY);

    // now do the turbfog,
    // we had both functions batched up here at one point,
    // but it became a mess to maintain.
    // besides it turns out we can have both,
    // transparent water and transparent fog on the same leaf so :).
    R_DrawTurbFog();

     // potentially redundant if teleports or lava were drawn last and we're not underwater.
    // it's only once per frame so live with it.
    R_TurbDepthOff(warpalpha);

    // some brain-dead drivers don;t restore from glColorMask properly, so...
    glColor4f (TURB_NOALPHA_CONST, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST, TURB_NOALPHA_CONST);
}
Dual layer liquids with fragment shaded water warp and underwater fog.
I went through the code with a sledgehammer and fixed most of the problems
(mostly some oversights in regards to not drawing to Z when there was no alpha channel active) and i cleaned it up a bit in the process by splitting out the fog code into a seperate function + creating a few utility functions for depth checking etc.

Phew so enough for today :) now i need a good nights sleep.
Productivity is a state of mind.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: Old school quake, well not quite but

Post by toneddu2000 »

Unfortunately on my pc doesn't work. It start running, then remains on the dock but without any possibility to make it work or use desktop. I have to use task manager to kill the pid
Meadow Fun!! - my first commercial game, made with FTEQW game engine
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Be sure to not have any pk3 from say darkplaces or other quake engines in id1 folder.
It was compiled with mingw64 against an intel nocona which by this time is a fairly old cpu, but it does support 64 bit instructions so i would not suspect that to be the problem in your case, content from other engines does tend to break it though. Also it might not run X mod, depends on limits which are fairly high in this engine but i havent tested it against say marcher yet. :)
Productivity is a state of mind.
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Image

Image

Image

yup does marcher to :)
Productivity is a state of mind.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: Old school quake, well not quite but

Post by toneddu2000 »

Be sure to not have any pk3 from say darkplaces or other quake engines in id1 folder.
It was compiled with mingw64 against an intel nocona which by this time is a fairly old cpu, but it does support 64 bit instructions so i would not suspect that to be the problem in your case, content from other engines does tend to break it though. Also it might not run X mod, depends on limits which are fairly high in this engine but i havent tested it against say marcher yet. :)
Thanks for answer, revelator. No, I'm using win10 with just pak0,pak1 and gfx.wad. Does it need some cfg?

BTW:screenshots are AWESOME!Great work! Does it support q3bsp too?
Meadow Fun!! - my first commercial game, made with FTEQW game engine
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Thanks :) no special cfg should be needed but check if the firewall is blocking it, i found that happens with a few quake clients. If that does not work ill try a compile with no standard cpu set you can try out.

Realm does not support q3bsp neither does it support md2 md3 or any other format besides standard quake mdl im afraid.
Its pretty minimalistic in that regard but feel free to add it in when i release the source :) still few bugs to iron out (hipnotic crashes when there are loads of lightning, and rogue crashes in the 3'rd demo sequence). I used bengt jardrups enhanced glquake engines VM so theres loads of bugchecking going on behind the scenes, and something seems to trigger atleast a few of the bugchecks, it should not crash though but it is :S. Both the hipnotic and rogue bugs seems to be an illegible server message, and i have a feeling that it might be caused by me changing to strlcpy and having forgot to check if the string was allready null terminated where i replaced the old strcpy calls, so finding the culprit might take a while.

I hope that helps but would be helpfull to know if anyone else is having those problems with it ? :)
Productivity is a state of mind.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: Old school quake, well not quite but

Post by toneddu2000 »

no special cfg should be needed but check if the firewall is blocking it, i found that happens with a few quake clients.
Thanks a lot! Launching it as administrator did the job!
Super cool rotating hud, and quad damage on menu. Looks and feel very similar to original Quake. Great job! I noticed just some flickering issue on mdl animations
Meadow Fun!! - my first commercial game, made with FTEQW game engine
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Could be caused by the bloom effect, try turning it off :)
It still needs some more work since it was originally ported from Q2.
Productivity is a state of mind.
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Btw if you try some really dark mod like zerstoerer use gl_doublelight 1, this will overbright the game making dark mods more playable.
In time ill move all those features into the menu, it also has fitz video menu allready,
but it needs more work cause it wont show correctly unless you use windowed mode.

Other vars to play with are gl_detail and gl_dot3 and r_vertexlights.
gl_detail just turns on / off detail texturing.
gl_dot3 0 1 or 2 manages bumpmapping a value of one uses standard 2 tmu path while a value of 2 uses 4 tmus. 0 turns off bumpmapping completely.
r_vertexlights toggles between pox interpolated light and vertex shaded light.
there also quite a few developer cvars to help mappers like gl_lockpvs that lets you see where a leaf begins and ends.
Productivity is a state of mind.
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

https://sourceforge.net/projects/cbadva ... p/download

source code for realm :) you will need codeblocks and the mingw64 compiler for an out of the box compile,
if you prefer msvc then you will have to recompile zlib and png yourself and link them in.

A rather glaring bug was fixed which actually turned off lightmap generation on anything but turb texes, the same bug also did scoupulous things to stainmaps.
As a result Realm now looks a bit different ingame (definatly more bright).

I have been hammering on some rather odd bugs with the two mission packs, one causes rogue to crash in the 3'rd demo sequence (deathmatch), and the other
will hard crash hipnotic when entering the room with all the lighting (map 4 i think). So far no luck, i even tried replacing the entire vm with a tried and tested version
and it still crashes in the exact same places :shock: so it might not be related to the VM at all even though i do get an error in rogue telling me that something triggers
a runerror in that mod.

Speedwise i managed to get some small improvements :) this engine is probably not the best to run QdQ on, cause it takes a little while for it to settle, and these demos are so fast that by the time it stabilises we run into a mapload and it has to do all the math again. So still not great on speed demos but for normal gameplay it runs ok.

Im no VM guru so if anyone finds the bug causing those crashes id be happy to know, would be nice to put the lid on them now.
Productivity is a state of mind.
frag.machine
Posts: 2126
Joined: Sat Nov 25, 2006 1:49 pm

Re: Old school quake, well not quite but

Post by frag.machine »

If the bug manifests during demo playback I can't see how it can be related to the VM code. IIRC the VM is not even initialized (let alone running) during demo playback... sounds more like a problem parsing network messages to me.
I know FrikaC made a cgi-bin version of the quakec interpreter once and wrote part of his website in QuakeC :) (LordHavoc)
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Re: Old school quake, well not quite but

Post by revelator »

Probably right, spike mentioned something along that path. I havent been able to get a good debug trace out of it yet though :S
Atleast rogue throws an error alog the line of "illegible server message 80 last message fastupdate" though im not sure what that means (seems to trigger when someone fires the grappling gun).

Hipnotic crashes in game though, with a hard error which i had no luck debugging as of yet, it happens in map4 or 5 in the room with all the lightning flying around.
It triggers the instant where the door to that room opens and the lightning sound starts so it might be related to that, it does not affect the thunderbolt or the rit hammer though.

Sound system uses directsound by design of MH since it was based on his engine,
but i find it hard to believe that something in there should crash it since it works for all the other sounds.
Productivity is a state of mind.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: Old school quake, well not quite but

Post by toneddu2000 »

frag.machine wrote:IIRC the VM is not even initialized (let alone running) during demo playback...
:?: And how's possible that demos run quakec code (weapon,ai, gameplay, etc.) if VM is not initialized? Did I miss something?
Meadow Fun!! - my first commercial game, made with FTEQW game engine
frag.machine
Posts: 2126
Joined: Sat Nov 25, 2006 1:49 pm

Re: Old school quake, well not quite but

Post by frag.machine »

revelator wrote:Probably right, spike mentioned something along that path. I havent been able to get a good debug trace out of it yet though :S
Atleast rogue throws an error alog the line of "illegible server message 80 last message fastupdate" though im not sure what that means (seems to trigger when someone fires the grappling gun).

Hipnotic crashes in game though, with a hard error which i had no luck debugging as of yet, it happens in map4 or 5 in the room with all the lightning flying around.
It triggers the instant where the door to that room opens and the lightning sound starts so it might be related to that, it does not affect the thunderbolt or the rit hammer though.

Sound system uses directsound by design of MH since it was based on his engine,
but i find it hard to believe that something in there should crash it since it works for all the other sounds.
I remember bits of the NetQuake protocol (wrote a small command line tool to mix demos back in the Quake golden years), and messages starting with 0x80 are bitmaksed entity updates. I'd suggest you make a diff on the client parsing routines against vanilla Quake source, it's very likely to be some code snippet failing to correctly parse this kind of message.
I know FrikaC made a cgi-bin version of the quakec interpreter once and wrote part of his website in QuakeC :) (LordHavoc)
Post Reply