Author Topic: Merging Tremulous particle system into an ioQuake3 project?  (Read 7189 times)

JP

  • Posts: 11
  • Turrets: +2/-0
Merging Tremulous particle system into an ioQuake3 project?
« on: February 14, 2008, 06:53:04 am »
Tremulous is quite impressive, you guys did a great job with it.  I'm working on a standalone GPL Quake3-based game of my own (albeit not as ambitious as Tremulous, and very different besides) and was wondering if the devs could give a general estimate of how difficult it would be to merge the particle system code (particles defined in text files, trail-style effects, etc) into the current icculus.org Q3 codebase.  Looking over the source, it seems like there aren't many changes to the renderer, the biggest changes seem to be in cgame.  How cleanly separated out is this system, and are there any really nasty surprises waiting for me should I attempt this?  Obviously I wouldn't be merging in anything gameplay related, and I'm not using anything like Q3A's gameplay, so this would be a strictly tech-level feature merge.

Thanks in advance, and congrats on Tremulous.  Wish I was better at it :/

Edit: just to be clear, if I did integrate Trem's particles into my project, you guys would get mad tall props should my little project ever amount to anything.  It's implicit with the GPL, but I have zero intention of taking credit for you guys' hard work.
« Last Edit: February 14, 2008, 06:57:47 am by JP »

raf

  • Posts: 75
  • Turrets: +0/-0
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #1 on: February 16, 2008, 01:38:59 am »
i'd suggest asking @ irc, chances  to get an answer are better there ;-)

JP

  • Posts: 11
  • Turrets: +2/-0
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #2 on: February 22, 2008, 04:19:17 am »
In-progress.  I'm keeping detailed notes on everything I have to do to get this working, and I'll post it here once I'm done, just in case anyone is ever interested in doing this too.

I've just completed the main part of the merge.  Code compiles with no errors or warnings.  The particles seem to be working - I spawn one when one of my custom projectiles hits a wall and it shows up in-game.

The trails, not so much.  My quick ugly test code to spawn one looks like this:

Code: [Select]
tsh = CG_RegisterTrailSystem( "gfx/puls_trail" );
 
ts = CG_SpawnNewTrailSystem( tsh );
 
if( CG_IsTrailSystemValid( &ts ) ) {
CG_SetAttachmentCent( &ts->frontAttachment, cent );
CG_AttachToCent( &ts->frontAttachment );
}

This happens in cgame/cg_ents.c, during the render function for my custom projectiles.  I know the code runs because the MD3 I set for the projectile shows up, and indeed the trail is considered "valid".  It just doesn't show up.  There are no invisible polys that show up with r_showTris 1, either.

The trail effect and the shader it uses are identical to the Tremulous trail effect called "missileTS", so I'm pretty sure things are fine on the data end.

Any ideas on what could be wrong?  Am I forgetting to do something really basic?  I realize I'm not using Trem's weapons system, so the code is a little junky and not part of a nice system.
« Last Edit: February 22, 2008, 05:32:48 am by JP »

JP

  • Posts: 11
  • Turrets: +2/-0
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #3 on: February 23, 2008, 01:52:13 am »
Hmm, when I changed the above test code to use CG_SetAttachmentPoint and CG_AttachToPoint instead, it worked.  Not sure if that means attaching to centities in general is borked, or if it's something I'm doing wrong.

Without further ado, here's the semi-giant list of things I changed in stock icculus.org Quake3 (svn 1267) to integrate the Tremulous particle and trail systems:

Quote
add new files:
cg_animation.c
cg_attachment.c
cg_particles.c
cg_trails.c

add "outline" shader to one of your .shader data files


Makefile
-------------------
add lines to compile these new files


cgame/cg_local.h
-------------------
forward declaration for particle_t

add struct definitions:
- attachmentType_t
- attachment_t

constants labeled "particle system stuff", eg MAX_PARTICLES

struct definitions:
- pMoveType_t
- pDirType_t
- pMoveValues_t
- pLerpValues_t
- baseParticle_t
- baseParticleEjector_t
- baseParticleSystem_t
- particleSystem_t
- particleEjector_t
- particle_t

constants labeled "trail system stuff", eg MAX_TRAIL_SYSTEMS

struct definitions:
- trailBeamTextureType_t
- baseTrailJitter_t
- baseTrailBeam_t
- baseTrailSystem_t
- trailSystem_t
- trailBeamNode_t
- trailBeam_t

add members to centity_t definition:
lerpFrame_t         lerpFrame;
particleSystem_t   *entityPS;
qboolean         entityPSMissing;
qboolean         valid;
qboolean         oldValid;

add members to cgs_t definition:
qhandle_t         gameShaders[MAX_GAME_SHADERS];
qhandle_t         gameParticleSystems[MAX_GAME_PARTICLE_SYSTEMS];

add to cgMedia_t definition:
qhandle_t      outlineShader;

add to list of cvars:
- cg_depthSortParticles
- cg_bounceParticles
- cg_debugParticles
- cg_debugTrails
- cg_debugPVS
- cg_drawBBOX

prototypes for functions in the 4 new files (cg_animation, etc)

prototype for trap_FS_GetFileList, which Trem uses on the client side


cgame/cg_main.c
-------------------
add to list of cvars, and to list of default values:
- cg_depthSortParticles
- cg_bounceParticles
- cg_debugParticles
- cg_debugTrails
- cg_debugPVS
- cg_drawBBOX

to end of CG_RegisterGraphics, add code marked by comment "register all the server specified particle systems"

to CG_Init, add calls to CG_LoadTrailSystems and CG_LoadParticleSystems just before line that reads:
CG_LoadingString( "sounds" );


cgame/cg_ents.c
-------------------
add new function definitions:
- CG_DrawBoxFace
- CG_DrawBoundingBox
- CG_CEntityPVSEnter
- CG_CEntityPVSLeave

to CG_AddPacketEntities, add:
all code that references the "valid" var of a centity


cgame/cg_marks.c
-------------------
rename particle_s (type particle_t) and MAX_PARTICLES to something else, to prevent conflict with their definition in new code


cgame/cg_players.c
-------------------
rename CG_RunLerpFrame to CG_RunPlayerLerpFrame, in declaration and all usages within this file (there are only 3 or 4), to prevent conflict with their definition in new code


cgame/cg_public.h
-------------------
add CG_FS_GETFILELIST to cgameImport_t definition


cgame/cg_syscalls.c
-------------------
add trap_FS_GetFileList definition


cgame/cg_syscalls.asm
-------------------
add trap_FS_GetFileList to list with a unique number


cgame/cg_view.c
-------------------
add calls to CG_AddParticles and CG_AddTrails in CG_DrawActiveFrame, just ater CG_AddViewWeapon


client/cl_cgame.c
-------------------
add CG_FS_GETFILELIST case to large switch statement in CL_CgameSystemCalls


game/bg_lib.c and bg_lib.h
-------------------
add definition for util function "rint"


game/bg_misc.c
-------------------
add definitions for util functions:
- atof_neg
- atoi_neg


game/bg_public.h
-------------------
add constants: CS_SHADERS, CS_PARTICLE_SYSTEMS, CS_PRECACHES

add definitions for util functions:
- atof_neg
- atoi_neg


qcommon/q_math.c
-------------------
add definitions for util functions:
- VectorMatrixMultiply
- GetPerpendicularViewVector


qcommon/q_shared.h
-------------------
define MAX_GAME_SHADERS and MAX_GAME_PARTICLE_SYSTEMS

add definitions for util functions:
- VectorMatrixMultiply
- GetPerpendicularViewVector


changes to new files (from stock Tremulous version)

cgame/cg_particles.c
-------------------
rename "particles" (type particle_t) and function CG_AddParticles in declaration and all usages within this file to prevent conflict with their definitions in old code

Hope this is useful to someone!
« Last Edit: February 24, 2008, 08:19:52 pm by JP »

JP

  • Posts: 11
  • Turrets: +2/-0
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #4 on: February 24, 2008, 08:23:06 pm »
I figured out why attaching particles to centities wasn't working... I needed to merge the code that sets the "valid" flag in cg_ents.c, and some of Trem's PVS stuff that goes along with it.

So now I've got trails attached to players, etc etc.  Still a lot of placeholder art, but it looks kinda neat:


khalsa

  • Administrator
  • Posts: 597
  • Turrets: +187/-132
    • http://www.mercenariesguild.net
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #5 on: February 25, 2008, 02:33:45 pm »
Looks like some good work there JP. Any way you have a clean patch against ioq3 with just the particle system? I know this will be useful to many others as it's quite nice.

Khalsa
}MG{ Mercenariesguild
ਮਨੁ ਜੀਤੇ ਜਗੁ ਜੀਤਿਆ

JP

  • Posts: 11
  • Turrets: +2/-0
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #6 on: February 26, 2008, 04:53:03 am »
Sadly no, I don't have a single changelist or patch for it - I was rigging up some test code and unrelated gameplay stuff as I was doing this.  However it wouldn't be tough for me to generate one from the notes I took (and be a bit more neat and tidy about it besides).  If my project is successful and/or I have some time in the future, I'll create a patch.

Lately I've been contemplating, as a "someday" project, creating a branch of ioQ3 aimed at indie developers, with all the Q3A content and gameplay removed, just vanilla movement and physics and maybe a few example bits like a simple weapon, world object, avatar etc.  Some of the features Tremulous has added would be great additions to this sort of platform.  Still roughly within the same generation of rendering capabilities, unlike Xreal which is very focused on being modern and super-l337.  Only features like MD5 support that make it easier to make content for... I think it's actually liberating in some ways to work with 2001-era poly counts, no normal maps, etc.

Anyway, I'll definitely promote it if I ever undertake such a project.  I'm totally concerned with getting my game out and awesome first.

khalsa

  • Administrator
  • Posts: 597
  • Turrets: +187/-132
    • http://www.mercenariesguild.net
Re: Merging Tremulous particle system into an ioQuake3 project?
« Reply #7 on: February 26, 2008, 06:14:08 am »
I hope you do, I was planning on putting your patch HERE


Good Luck

Khalsa
}MG{ Mercenariesguild
ਮਨੁ ਜੀਤੇ ਜਗੁ ਜੀਤਿਆ