Doom3world

The world is yours! Doom 3 - Quake 4 - ET:QW - Prey - Rage
It is currently Mon May 20, 2013 2:06 pm

All times are UTC [ DST ]




Post new topic Reply to topic  [ 49 posts ]  Go to page 1, 2, 3  Next
Author Message
 Post subject: Tutorial: 3rd Person Cross Hair
PostPosted: Fri Aug 04, 2006 8:07 am 
Offline
has joined the game

Joined: Wed Feb 16, 2005 12:40 am
Posts: 42
Location: Deep in the cold dark pit of Champlin, MN
This tutorial will teach you how to create an accurate 3rd Person cross hair. The cross hair is actually a 2d sprite placed in the game world at a location that will indicate where the player's weapon will strike. The cross hair will work with any camera height and distance, and even works in first person.


Part one: The PlayerCursor class
To create our new cross hair you will need to implement a new class in the D3 SDK. This class will determine where the cross hair should be placed in the game world and will spawn a sprite at that location.
Step One: PlayerCursor.h
Create a new .h file in the GAME folder named PlayerCursor. The variables and functions defined with in PlayerCursor.h should be the same as the code below.
Code:
#ifndef   __PLAYERCURSOR_H__
#define   __PLAYERCURSOR_H__
/*
Created on 4/19/06 by Paul Reed
Draws a cross hair sprite 5 feet from the view origin along a line leading to where
the player's weapon is pointing
*/
class idPlayerCursor {
public:
   idPlayerCursor();
   ~idPlayerCursor();
   void   Draw( const idVec3 &origin,const idMat3 &axis,const char *material );
public:
   renderEntity_t      renderEnt;
   qhandle_t         cursorHandle;
   bool            created;
public:
   void   FreeCursor( void );
   bool   CreateCursor( idPlayer* player , const idVec3 &origin, const idMat3 &axis,const char *material);
   void   UpdateCursor( idPlayer* player ,const idVec3 &origin, const idMat3 &axis);

};
#endif   /* !_PLAYERCURSOR_H_ */



Step Two:PlayerCursor.cpp Basics
Create a new .cpp file in the GAME folder named PlayerCursor and include the following lines of code at the top of the file.
Code:
#include "../idlib/precompiled.h"
#pragma hdrstop

#include "Game_local.h"
#include "PlayerCursor.h"

Next you will want to create the constructor and deconstructor functions. The constructor function should look like this:
Code:
/*
===============
idPlayerCursor::idPlayerCursor
===============
*/
idPlayerCursor::idPlayerCursor() {
   cursorHandle   = -1;
   created = false;
}

And the deconstructor like this:
Code:
/*
===============
idPlayerCursor::~idPlayerCursor
===============
*/
idPlayerCursor::~idPlayerCursor() {
   FreeCursor();
}


The Deconstructor makes a call to FreeCursor, which frees up the renderEntity (the image of the sprite) , sets the cursorHandle (which keeps track of our renderEntity) to -1, and sets the bool created to false.
Code:
/*
===============
idPlayerCursor::FreeCursor
===============
Post: tells the game render world to free the cross hair entity, sets the cursor
handle to -1 and sets created to false
*/
void idPlayerCursor::FreeCursor( void ) {
   if ( cursorHandle != - 1 ) {
      gameRenderWorld->FreeEntityDef( cursorHandle );
      cursorHandle = -1;
      created = false;
   }
}


Step Three:PlayerCursor.cpp The Draw function
This critical function does most of the work of the PlayerCursor class, and is called by an outside class to create the cross hair. The first two parameters are the location and facing of the player, while the third is the name of the material to be used for the cross hair.
Code:
/*
===============
idPlayerCursor::Draw
===============
*/
void idPlayerCursor::Draw( const idVec3 &origin, const idMat3 &axis,const char *material) {

The first step is to trace a point from the player's position (variable origin) along the passed in axis(variable axis). The point where the trace stops is where the weapon is aiming.
Code:
   idPlayer *localPlayer = gameLocal.GetLocalPlayer();
   trace_t         tr;
   float          distance = 60;
   float          length;
   //detemine the point at which the weapon is aiming
   idAngles angle = axis.ToAngles();
   idVec3 endPos =(origin + (angle.ToForward() * 120000.0f));
   gameLocal.clip.TracePoint(tr,origin,endPos,MASK_SHOT_RENDERMODEL,localPlayer);
   endPos = tr.endpos;

The next step is to find the distance between the camera (variables cameraOrigin, and cameraAxis), and the point where the weapon is aiming. The cross hair position is found by using the two vectors (the camera's position and the point where the player is aiming), and interpolating a point 60 inches (defined by variable distance) from the camera. If you like you may change the distance to any number of inches you like. Note that if you go to far the cross hair's sprite will be hidden by the player's model.
Code:
   //find the distance from the camera to the point at which the weapon is aiming
   idMat3 cameraAxis = localPlayer->GetRenderView()->viewaxis;
   idVec3 cameraOrigin = localPlayer->GetRenderView()->vieworg;
   idVec3 vectorLength = endPos - cameraOrigin;
   length = vectorLength.Length();
   length = distance/length;
   //linearly interpolate 5 feet between the camera position and the point at which the weapon is aiming
   endPos.Lerp(cameraOrigin,endPos,length);

Finally we create a cursor if we haven't already done so, and if we have then we update it's position to the point we determined. Make sure to pass in the camera's axis (variable cameraAxis) so that the 2d sprite is facing the right direction.
Code:
   if ( !CreateCursor(localPlayer, endPos, cameraAxis,material )) {
      UpdateCursor(localPlayer,  endPos, cameraAxis);
   }
}



Step Four:PlayerCursor.cpp The CreateCursor function
The CreateCursor function's job is to create a renderEntity that the cross hair will be displayed on. The renderEntity will use a sprite as a model and will use the passed in material as it's texture. You can change the color parameters to whatever you want, as well as the size parameters, though I find 8 by 8 units to be about right.
Code:
/*
===============
idPlayerCursor::CreateCursor
===============
*/
bool idPlayerCursor::CreateCursor( idPlayer *player, const idVec3 &origin, const idMat3 &axis, const char *material ) {
   const char *mtr =  material;
   int out = cursorHandle;
   if ( out >= 0 ) {
      return false;
   }
   FreeCursor();
   memset( &renderEnt, 0, sizeof( renderEnt ) );
   renderEnt.origin   = origin;
   renderEnt.axis      = axis;
   renderEnt.shaderParms[ SHADERPARM_RED ]            = 1.0f;
   renderEnt.shaderParms[ SHADERPARM_GREEN ]         = 1.0f;
   renderEnt.shaderParms[ SHADERPARM_BLUE ]         = 1.0f;
   renderEnt.shaderParms[ SHADERPARM_ALPHA ]         = 1.0f;
   renderEnt.shaderParms[ SHADERPARM_SPRITE_WIDTH ]   = 8.0f;
   renderEnt.shaderParms[ SHADERPARM_SPRITE_HEIGHT ]   = 8.0f;
   renderEnt.hModel = renderModelManager->FindModel( "_sprite" );
   renderEnt.callback = NULL;
   renderEnt.numJoints = 0;
   renderEnt.joints = NULL;
   renderEnt.customSkin = 0;
   renderEnt.noShadow = true;
   renderEnt.noSelfShadow = true;
   renderEnt.customShader = declManager->FindMaterial( mtr );
   renderEnt.referenceShader = 0;
   renderEnt.bounds = renderEnt.hModel->Bounds( &renderEnt );
   cursorHandle = gameRenderWorld->AddEntityDef( &renderEnt );
   return false;
}


Step Four:PlayerCursor.cpp The CreateCursor function
The final function in PlayerCursor is used to update the position of cross hair to the values passed in.
Code:
/*
===============
idPlayerCursor::UpdateCursor
===============
*/
void idPlayerCursor::UpdateCursor(idPlayer* player,  const idVec3 &origin, const idMat3 &axis) {
   assert( cursorHandle >= 0 );
   renderEnt.origin = origin;
   renderEnt.axis   = axis;
   gameRenderWorld->UpdateEntityDef( cursorHandle, &renderEnt );
}

Note: If your cross hair is a GUI and you want to set a GUI variable (which you may have passed into the draw function) use this code:
Code:
renderEnt.customShader->GlobalGui()->SetStateBool("guiVariableName",yourVariable);


Part Two: Modifying other classes
Step One: gameLocal.h
Now that the PlayerCursor class has been created you need another class to use it, but before that you must add the following line to gameLocal.h around line # 730:
Code:
#include "PlayerCursor.h"

be sure to place it above the line:
Code:
#include "Entity.h"


Step Two:Weapoh.h
Since the point the player aims at is determined in Weapon, the playerCursor class should be defined here. Add a idPlayerCursor variable (either private or public) to Weapon.h.
Code:
idPlayerCursor   playerCursor;


Step Three:Weapon.cpp
The final step is the call the playerCursor's draw function inside the idWeapon::PresentWeapon function. Place the following line of code at the very bottom of the function:
Code:
playerCursor.Draw(muzzleOrigin,muzzleAxis,"pathNameToMaterialDefinition/MaterialName");


That should do it, if you did everything right you should now have an accurate 3rd person cross hair!

Part Three: a few quick notes
I deleted the majority of my comments to help keep the tutorial length under control. I encourage everyone who implements this to put their own comments in as they code (or cut and paste :) ). Comments are damn important and should never be left out or put aside to be done later.

I have not tested the cross hair in multiplayer, and I believe there may be trouble with seeing everyone else's cross hairs. If you implement this and give it an MP test please let me know if it works alright.

Finally a quick thanks. I discovered how to create the cross hair by looking at the playerIcon class; so thanks to whoever at ID wrote the class.

If you have any questions or comments please post them here or IM me. If you discover an error in my post OR in the code please point it out.

_________________
-Deavile
GZ Lead Programmer


Last edited by Deavile on Sat Aug 05, 2006 7:32 pm, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 11:27 am 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
Brilliant, really good job, I'll test this out and comment where I can as soon as I can.

Great Job!


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 3:25 pm 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
I followed the tutorial completely, and read the code trying to figure out what each bit did, because I'm not so great at it.

And well on compile I got these errors (Quake 4).

I can sort of understand them but im in no position of expertise to fix them, could you help?

Code:
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(348): error C2065: 'muzzleAxis' : undeclared identifier
c:\Quake4_1.3_SDK\source\game\PlayerCursor.cpp(80): error C2248: 'idGameLocal::clip' : cannot access private member declared in class 'idGameLocal'
c:\Quake4_1.3_SDK\source\game\PlayerCursor.cpp(80): error C2039: 'TracePoint' : is not a member of 'idList<type>'
        with
        [
            type=idClip *
        ]
c:\Quake4_1.3_SDK\source\game\PlayerCursor.cpp(91): error C2039: 'distance' : is not a member of 'idPlayer'
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(348): error C2065: 'muzzleOrigin' : undeclared identifier


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 6:36 pm 
Offline
has joined the game

Joined: Thu Mar 31, 2005 5:23 pm
Posts: 44
Location: Chicago, IL
RPRaiden: It looks like Raven might have changed how tracing works in Quake 4 (though I cannot understand why).

Also, this could work in multiplayer. All you'd have to do is set the renderEntity_s.allowSurfaceInViewID of the player's crosshair to the weapon viewID for each player (or 3rd person viewID). Note that this would work exactly how the lighting from muzzle flashes works and as such does not require you to sync the position in the 3d plane with the server. However, if you made the sprite for the cursor something like a laser pointer then you could just ignore this and ensure that its seen by all players.

Regardless, this sounds badass and I'm gonna give it a try.


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 7:17 pm 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
Hmm what are the chances of getting this to work on Quake 4?


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 7:29 pm 
Offline
has joined the game

Joined: Wed Feb 16, 2005 12:40 am
Posts: 42
Location: Deep in the cold dark pit of Champlin, MN
Looks like you have a few errors in there; one of which is my fault. I forgot that I long ago implemented a distance function before I realized that the vector class already had one. Instead of finding length with:
Code:
length = localPlayer->distance(&cameraOrigin,&endPos);


try this:
Code:
idVec3 vectorLength = endPos - cameraOrigin;
length = vectorLength.Length();


In addition it seems the variables that determine where the bullet is spawned has changed. In Doom3 the origin is called muzzleOrigin and the axis is muzzleAxis, you will have to find the Q4 equivalent of these variables. The two variables should be class variables found in Weapon.ccp and would most likely have names similar to the D3 names.

Finally as Dues231 pointed out the trace functionality has changed in Q4. I'm not sure how it's done in there, but I bet if you look around the q4 coding section you can find an example of it.

_________________
-Deavile
GZ Lead Programmer


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 7:38 pm 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
Thanks for the info, I'll get researching, if I find anything I'll let you know for future reference.


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 7:44 pm 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
Confusing... it seems muzzleAxis is there.

Code:
   muzzleAxis.Identity();
   muzzleOrigin.Zero();


Code:
   savefile->WriteVec3      ( muzzleOrigin );
   savefile->WriteMat3      ( muzzleAxis );


Code:
   idVec3 muzzleOrigin;
   idMat3 muzzleAxis;


Code:
      GetGlobalJointTransform( true, barrelJointView, muzzleOrigin, muzzleAxis );


Just a few references there...

Edit:

So I searched around for tracing in Quake 4 and found that where you written clip should be "Translation" (I think)

So I changed it to this:

Code:
gameLocal.Translation.TracePoint(trace,origin,endPos,MASK_SHOT_RENDERMODEL,localPlayer);


and im left with the muzzle axis and origin problem, and this problem:

Code:
c:\Quake4_1.3_SDK\source\game\PlayerCursor.cpp(80): error C2228: left of '.TracePoint' must have class/struct/union type


Edit2: TracePoint is also there, and clip.. seems the problem is that I cannot access the clip because it's "private"... how im supposed to access it I have no idea yet.

And apparently Tracepoint is not a member of "clip" so that needs changing too?

Heres some code in the Present Weapon, there is no reference to muzzle Axis or Origin inside there, so I tried to add it and got errors... see what you can make of it.

Code:
/*
================
rvViewWeapon::PresentWeapon
================
*/
void rvViewWeapon::PresentWeapon( bool showViewModel ) {
   // Dont do anything with the weapon while its stale
   if ( fl.networkStale ) {
      return;
   }

// RAVEN BEGIN
// rjohnson: cinematics should never be done from the player's perspective, so don't think the weapon ( and their sounds! )
   if ( gameLocal.inCinematic ) {
      return;
   }
// RAVEN END

   // only show the surface in player view
   renderEntity.allowSurfaceInViewID = weapon->GetOwner()->entityNumber + 1;

   // crunch the depth range so it never pokes into walls this breaks the machine gun gui
   renderEntity.weaponDepthHackInViewID = weapon->GetOwner()->entityNumber + 1;

   weapon->Think();

   // present the model
   if ( showViewModel && !(weapon->wsfl.zoom && weapon->GetZoomGui() ) ) {
      Present();
   } else {
      FreeModelDef();
   }

   UpdateSound();

   // Draw Cursor Code
   playerCursor.Draw(muzzleOrigin,muzzleAxis,"pathNameToMaterialDefinition/MaterialName");
}


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 9:13 pm 
Offline
has joined the game

Joined: Wed Feb 16, 2005 12:40 am
Posts: 42
Location: Deep in the cold dark pit of Champlin, MN
Ah, thats the problem, in Doom3's version of PresentWeapon the muzzle origin and axis are set in the function. Paste the following code in PresentWeapon; it should give you the proper origin and axis.

Code:
idVec3 crossHairOrigin;
idMat3 crossHairAxis;
if ( barrelJointView != INVALID_JOINT && projectileDict.GetBool( "launchFromBarrel" ) ) {
      // there is an explicit joint for the muzzle
      GetGlobalJointTransform( true, barrelJointView, crossHairOrigin, crossHairAxis );
   } else {
      // go straight out of the view
      crossHairOrigin = owner->firstPersonViewOrigin;
      crossHairAxis = owner->firstPersonViewAxis;
   }


Then pass into playerCursor.Draw crossHairOrigin and crossHairAxis instead of muzzleOrigin and muzzleAxis. Hopefully that should fix your problem.

_________________
-Deavile
GZ Lead Programmer


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 05, 2006 9:21 pm 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
Ouch:

Code:
c:\Quake4_1.3_SDK\source\game\PlayerCursor.cpp(80): error C2248: 'idGameLocal::clip' : cannot access private member declared in class 'idGameLocal'
c:\Quake4_1.3_SDK\source\game\PlayerCursor.cpp(80): error C2039: 'TracePoint' : is not a member of 'idList<type>'
        with
        [
            type=idClip *
        ]
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(320): error C2065: 'barrelJointView' : undeclared identifier
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(360): error C2065: 'crosshairOrigin' : undeclared identifier
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(325): error C2065: 'owner' : undeclared identifier
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(320): error C2065: 'projectileDict' : undeclared identifier
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(326): error C2227: left of '->firstPersonViewAxis' must point to class/struct/union
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(325): error C2227: left of '->firstPersonViewOrigin' must point to class/struct/union
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(320): error C2228: left of '.GetBool' must have class/struct/union type
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(320): error C2679: binary '!=' : no operator found which takes a right-hand operand of type 'jointHandle_t' (or there is no acceptable conversion)
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(322): error C3861: 'barrelJointView': identifier not found, even with argument-dependent lookup
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(322): error C3861: 'GetGlobalJointTransform': identifier not found, even with argument-dependent lookup
c:\Quake4_1.3_SDK\source\game\Weapon.cpp(326): error C3861: 'owner': identifier not found, even with argument-dependent lookup


Top
 Profile  
 
 Post subject:
PostPosted: Mon Aug 07, 2006 2:49 am 
Offline
has joined the game

Joined: Thu Mar 31, 2005 5:23 pm
Posts: 44
Location: Chicago, IL
Well, I just finished implementing it and I've gotta say it works great except for one small problem: muzzleOrigin and muzzleAxis don't update unless the weapon is firing. It's easy enough to solve simply by adding:

Code:
muzzleOrigin = playerViewOrigin;
muzzleAxis = playerViewAxis;


Right before the call to playerCursor.Draw in PresentWeapon.

Edit: Also, its very simply to make the 3d cursor into a laser sight simply by making it a light def, setting the RGBA to [1,0,0,1], and making it a point light with a radius of [5,5,5] for the right size. I've been trying that out and it's pretty damn cool.

_________________
Project A.R.E.N.A.
Lead coder and designer


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 13, 2006 1:57 pm 
Offline
The first 10 posts have been the best...

Joined: Sun Jul 30, 2006 11:31 pm
Posts: 20
Don't suppose anybody would convert this to Quake 4? :(


Top
 Profile  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Sat Nov 29, 2008 9:21 pm 
Offline
The first 10 posts have been the best...

Joined: Mon Nov 17, 2008 5:53 pm
Posts: 11
Sorry to revive an old topic, but if anyone could help me out here, I'd greatly appreciate it...

I've followed this tutorial to the letter, and I get the crosshairs appearing in game, but unfortunately it only appears while the "fire" animation on a weapon is playing, as soon as it stops, the crosshair stops moving and just sticks to whatever surface it was on.

I've added some debug messages and it looks like the UpdateCursor function is running when it should, but it's just not updating anything.... has anyone ever tried this and experienced the same problem, or have I (in my infinite newbieness) simply messed up? Any help/suggestions would be fantastic, thanks in advance guys.


Top
 Profile E-mail  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Sun Nov 30, 2008 3:33 pm 
Offline
Last man standing
User avatar

Joined: Fri Apr 22, 2005 11:55 pm
Posts: 1180
I think the answer to your question is in the last Deus231's post. :wink:

_________________
Fragging Free - a frantic Doom3:ROE single-player modification.


Top
 Profile  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Mon Dec 01, 2008 12:15 am 
Offline
The first 10 posts have been the best...

Joined: Mon Nov 17, 2008 5:53 pm
Posts: 11
Ivan_the_B wrote:
I think the answer to your question is in the last Deus231's post. :wink:

Wow.... talk about the answer being right under my nose... I feel kinda stupid now. Oh well, just glad the problem is resolved :) Thanks for the heads up Ivan!


Top
 Profile E-mail  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Tue Dec 02, 2008 8:40 pm 
Offline
Last man standing
User avatar

Joined: Thu Aug 19, 2004 7:22 pm
Posts: 1123
Thank you for bumping this thread so I didn't have to, TheMC ;)

Im currently working on a ThirdPerson Mod that is almost complete. I have everything I need figured out (camera position, working hud for weaphud weapons, this crosshair with along with some enhancements so that it is hidden when a gui is active or a melee weapon is equipped) except for one thing.

In the tutorial you mentioned that you can use a gui for the crosshair sprite. The explanation was a little vague and for the life of me I can't figure out how you do it. I'm assuming this line
Code:
renderEnt.customShader->GlobalGui()->SetStateBool("guiVariableName",yourVariable);


replaces this line
Code:
renderEnt.customShader = declManager->FindMaterial( mtr );


but I have know idea what you mean by these: "guiVariableName", yourVariable

I don't know if you are still around Deavile but does any one know what is meant by these or how to get a gui surface to work here? I desperately want to use the default cursor gui instead of what I have now which is just a single tga merged from the crosshair assets. It looks ok but it's just not the same and I'm also hoping that it will animate just like the default cursor.


Top
 Profile E-mail  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Tue Dec 02, 2008 11:56 pm 
Offline
Last man standing
User avatar

Joined: Fri Apr 22, 2005 11:55 pm
Posts: 1180
We faced the same problem for Ruiner.
Our crosshair code is based on this tutorial ( but I had to change/improve some things ) and I know the following method works:

Simply, you have to define the gui in the material itself:
Code:
guis/cursorgui
{
   qer_editorimage   guisurfaces/guisurface.tga
   guiSurf guis/cursor.gui
   discrete
   description "cursor.gui"
}

(Thanks to Revility for figuring this out)

Now all you need to do now is stop rendering the default crosshair and use only the new one. :D


Sadly, there is still a problem that has to be solved. In fact, the gui is affected by fog and also blood splats are visible on top of it.
We should find a way to render the crosshair over anything else, as a crosshair should be.
Or at least make it not affected by fog. It's almost invisible when the fog is dense enough.
Any idea?

_________________
Fragging Free - a frantic Doom3:ROE single-player modification.


Top
 Profile  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Wed Dec 03, 2008 5:17 am 
Offline
Addict.
User avatar

Joined: Tue Nov 22, 2005 1:42 am
Posts: 2165
Location: France, 59
Material's keyword:
Code:
noFog   : Don't fog this surface


...no?

_________________
idTech 4 still amaze me.

Doom III High Quality Mainmenu Pack.
Doom III Boss Contest: Alpha Lab Zero.
idTech4 Extended [Alpha].


Top
 Profile E-mail  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Wed Dec 03, 2008 10:26 am 
Offline
Last man standing
User avatar

Joined: Fri Apr 22, 2005 11:55 pm
Posts: 1180
I already tried "noFog" and "sort postProcess", but no luck. :cry:

_________________
Fragging Free - a frantic Doom3:ROE single-player modification.


Top
 Profile  
 
 Post subject: Re: Tutorial: 3rd Person Cross Hair
PostPosted: Wed Dec 03, 2008 2:04 pm 
Offline
Addict.
User avatar

Joined: Tue Nov 22, 2005 1:42 am
Posts: 2165
Location: France, 59
Ivan_the_B wrote:
I already tried "noFog" and "sort postProcess", but no luck. :cry:

In the gui's material, or in the "textures used in the gui" 's materials?

_________________
idTech 4 still amaze me.

Doom III High Quality Mainmenu Pack.
Doom III Boss Contest: Alpha Lab Zero.
idTech4 Extended [Alpha].


Top
 Profile E-mail  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 49 posts ]  Go to page 1, 2, 3  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group