>>Will it have physics, normalmapping, realtime shadows, multiplayer etc etc<<
It has physics for objects that are defined as physical and it also uses 'force spheres' to generate explosions. (Needs some work for those though. THe ol' blast through walls bug is there) Multiplayer is a messaging system so the best it can produce for a multiplayer game is the 'twitchy' first person shooter.
As for normal mapping shadows and all that, it is added by the user through the rendering scripts. THis is where all the rendering of the scene, passes and models /effects are controlled from. So a person must know DX9 to create theese effects. Here is a small example of a rendering script that detects whether or not multi passes are available on the card and if not uses a double pass system to blend two textures:
Code: Select all
INIT[()
{
//Set the Device States
SetMultiPass(false);
SetRenderStages(1);
SetRenderState("D3DRS_LIGHTING", "FALSE");
SetAmbientLightColor(255,255,255);
SetRenderState("D3DRS_CULLMODE", "D3DCULL_CCW");
//SetRenderState("D3DRS_FILLMODE", "D3DFILL_SOLID");
//SetRenderState("D3DRS_FILLMODE", "D3DFILL_WIREFRAME");
SetRenderState("D3DRS_NORMALIZENORMALS", "TRUE");
SetRenderState("D3DRS_ZENABLE","D3DZB_TRUE");
// EnableSpecular(true);
//FOG
SetRenderState("D3DRS_FOGENABLE","TRUE");
SetRenderState("D3DRS_RANGEFOGENABLE","TRUE");
SetRStateValue("D3DRS_FOGCOLOR",0);
SetRenderState("D3DRS_FOGTABLEMODE","D3DFOG_LINEAR"); //pixel fog
SetRenderState("D3DRS_FOGVERTEXMODE","D3DFOG_LINEAR"); // vertex fog
SetRStateValue("D3DRS_FOGSTART",20);
SetRStateValue("D3DRS_FOGEND",50);
SetSamplerState(0,"D3DSAMP_MAGFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(0,"D3DSAMP_MINFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(1,"D3DSAMP_MAGFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(1,"D3DSAMP_MINFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(2,"D3DSAMP_MAGFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(2,"D3DSAMP_MINFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(3,"D3DSAMP_MAGFILTER", "D3DTEXF_ANISOTROPIC");
SetSamplerState(3,"D3DSAMP_MINFILTER", "D3DTEXF_ANISOTROPIC");
if(GetMultiPass() > 1)
{
//-------------single pass multitexturing------------------
SetTStageState(0,"D3DTSS_COLORARG1","D3DTA_TEXTURE");
SetTStageState(0,"D3DTSS_COLOROP","D3DTOP_SELECTARG1");
SetTStageState(1, "D3DTSS_TEXCOORDINDEX", "D3DTSS_TCI_PASSTHRU");
SetTStageState(1,"D3DTSS_COLORARG1","D3DTA_TEXTURE");
SetTStageState(1,"D3DTSS_COLORARG2","D3DTA_CURRENT");
SetTStageState(1,"D3DTSS_COLOROP","D3DTOP_MODULATE");
}
else
{
SetRenderState("D3DRS_ALPHABLENDENABLE","TRUE");
SetRenderState("D3DRS_CULLMODE", "D3DCULL_NONE");
}
font = AddFont(32,32,10,1,false,"Arial");
fur = LoadEffect("fureffect.fx","Furry");
ShowFPS(true,font);
LoadWorld("world.fvw");
NewOrder("FRAME");
return 0;
}]
FRAME[()
{
if(IsWorldLoaded())
{
sp = CreateSphere(4,12,10,0,10,20,fur);
sp = CreateSphere(6,12,8,3,6,15,fur);
sp = CreateSphere(3,12,15,-1,5,10,fur);
NewOrder("FRAME2");
return 0;
}
DrawText(0,"Loading.",100,200,100,200,200,255);
return 0;
}]
FRAME2[()
{
UseMouseView();
if(CheckDIKey("LEFT"))
{
CameraTurn(-25);
}
if(CheckDIKey("RIGHT"))
{
CameraTurn(25);
}
if(CheckDIKey("UP"))
{
CameraTilt(-25);
}
if(CheckDIKey("DOWN"))
{
CameraTilt(25);
}
if(CheckDIKey("W"))
{
CameraWalk(-200);
}
if(CheckDIKey("S"))
{
CameraWalk(200);
}
if(CheckDIKey("A"))
{
CameraStrafeWalk(200);
}
if(CheckDIKey("D"))
{
CameraStrafeWalk(-200);
}
return 0;
}]
MODELRENDER[()
{
if(GetMultiPass() < 2)
{
//First rendering
SetRenderState("D3DRS_SRCBLEND","D3DBLEND_ONE");
SetRenderState("D3DRS_DESTBLEND","D3DBLEND_ZERO");
RenderModel();
//second rendering
SetBaseSubset(0,0);
SetRenderState("D3DRS_SRCBLEND","D3DBLEND_ZERO");
SetRenderState("D3DRS_DESTBLEND","D3DBLEND_SRCCOLOR");
}
}]
}
The above script is a simple example of a 'game script'. INIT is run first and then Frame then Frame2 when the world is loaded. These are run prior to rndering the scene. MODELRENDER is called prior to the model being rendered. If the card can do simultalneous render passes then it is setup in the init order, otherwise, the MODELRENDER script renders two passes of the model, switching to the first set of extra loaded subset textures for the second pass. If the second set of subset textures was defined as LIGHTMAP, then it would use the lightmp texture for that part of the 'world.' (Extra textures are defined in a model file.) There are also a few 'macro' commands to help things along though, like : UseDot3(), UseENVBump() and a couple more.
That all happens through the Fixed Function pipeline. If you look at the script though, you will see that it also loads an effect and applies it to some spheres that it draws. Those are all renderd using the programmable pipeline and through an effect file. You can use both simultaneously and control the rendering of the scene or model the whole way through.
This system requires that a person knows DX9 and how to create the effect, but there will be many examples and fx files with the release.
Anyways, back to work....