implemented shader default and immediate pipeline for d3d9

This commit is contained in:
aap 2020-04-20 11:50:41 +02:00
parent 4541fe86f7
commit e012918cd3
26 changed files with 1565 additions and 43 deletions

View File

@ -27,7 +27,7 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
{ {
RawMatrix world; RawMatrix world;
d3d::lightingCB(atomic); d3d::lightingCB_Fix(atomic);
Geometry *geo = atomic->geometry; Geometry *geo = atomic->geometry;
d3d::setRenderState(D3DRS_LIGHTING, !!(geo->flags & rw::Geometry::LIGHT)); d3d::setRenderState(D3DRS_LIGHTING, !!(geo->flags & rw::Geometry::LIGHT));

View File

@ -32,6 +32,9 @@ static VertexElement _d3ddec_end = {0xFF,0,D3DDECLTYPE_UNUSED,0,0,0};
static void* static void*
driverOpen(void *o, int32, int32) driverOpen(void *o, int32, int32)
{ {
#ifdef RW_D3D9
createDefaultShaders();
#endif
engine->driver[PLATFORM_D3D9]->defaultPipeline = makeDefaultPipeline(); engine->driver[PLATFORM_D3D9]->defaultPipeline = makeDefaultPipeline();
engine->driver[PLATFORM_D3D9]->rasterNativeOffset = nativeRasterOffset; engine->driver[PLATFORM_D3D9]->rasterNativeOffset = nativeRasterOffset;
@ -48,6 +51,9 @@ driverOpen(void *o, int32, int32)
static void* static void*
driverClose(void *o, int32, int32) driverClose(void *o, int32, int32)
{ {
#ifdef RW_D3D9
destroyDefaultShaders();
#endif
return o; return o;
} }
@ -638,7 +644,7 @@ makeDefaultPipeline(void)
ObjPipeline *pipe = new ObjPipeline(PLATFORM_D3D9); ObjPipeline *pipe = new ObjPipeline(PLATFORM_D3D9);
pipe->instanceCB = defaultInstanceCB; pipe->instanceCB = defaultInstanceCB;
pipe->uninstanceCB = defaultUninstanceCB; pipe->uninstanceCB = defaultUninstanceCB;
pipe->renderCB = defaultRenderCB; pipe->renderCB = defaultRenderCB_Shader;
return pipe; return pipe;
} }

View File

@ -44,7 +44,7 @@ makeMatFXPipeline(void)
ObjPipeline *pipe = new ObjPipeline(PLATFORM_D3D9); ObjPipeline *pipe = new ObjPipeline(PLATFORM_D3D9);
pipe->instanceCB = defaultInstanceCB; pipe->instanceCB = defaultInstanceCB;
pipe->uninstanceCB = defaultUninstanceCB; pipe->uninstanceCB = defaultUninstanceCB;
pipe->renderCB = defaultRenderCB; pipe->renderCB = defaultRenderCB_Shader;
pipe->pluginID = ID_MATFX; pipe->pluginID = ID_MATFX;
pipe->pluginData = 0; pipe->pluginData = 0;
return pipe; return pipe;

View File

@ -59,14 +59,14 @@ drawInst_GSemu(d3d9::InstanceDataHeader *header, InstanceData *inst)
} }
void void
defaultRenderCB(Atomic *atomic, InstanceDataHeader *header) defaultRenderCB_Fix(Atomic *atomic, InstanceDataHeader *header)
{ {
RawMatrix world; RawMatrix world;
Geometry *geo = atomic->geometry; Geometry *geo = atomic->geometry;
int lighting = !!(geo->flags & rw::Geometry::LIGHT); int lighting = !!(geo->flags & rw::Geometry::LIGHT);
if(lighting) if(lighting)
d3d::lightingCB(atomic); d3d::lightingCB_Fix(atomic);
d3d::setRenderState(D3DRS_LIGHTING, lighting); d3d::setRenderState(D3DRS_LIGHTING, lighting);
@ -125,6 +125,58 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
d3d::setTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); d3d::setTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
} }
void
defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
{
int vsBits;
d3ddevice->SetStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
0, header->vertexStream[0].stride);
d3ddevice->SetIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
d3ddevice->SetVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
vsBits = lightingCB_Shader(atomic);
uploadMatrices(atomic->getFrame()->getLTM());
// Pick a shader
if((vsBits & VSLIGHT_MASK) == 0)
setVertexShader(default_amb_VS);
else if((vsBits & VSLIGHT_MASK) == VSLIGHT_DIRECT)
setVertexShader(default_amb_dir_VS);
else
setVertexShader(default_all_VS);
float surfProps[4];
surfProps[3] = atomic->geometry->flags&Geometry::PRELIT ? 1.0f : 0.0f;
InstanceData *inst = header->inst;
for(uint32 i = 0; i < header->numMeshes; i++){
Material *m = inst->material;
SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255);
rw::RGBAf col;
convColor(&col, &inst->material->color);
d3ddevice->SetVertexShaderConstantF(VSLOC_matColor, (float*)&col, 1);
surfProps[0] = m->surfaceProps.ambient;
surfProps[1] = m->surfaceProps.specular;
surfProps[2] = m->surfaceProps.diffuse;
d3ddevice->SetVertexShaderConstantF(VSLOC_surfProps, surfProps, 1);
if(inst->material->texture){
d3d::setTexture(0, m->texture);
setPixelShader(default_color_tex_PS);
}else
setPixelShader(default_color_PS);
drawInst(header, inst);
inst++;
}
setVertexShader(nil);
setPixelShader(nil);
}
#endif #endif
} }
} }

View File

@ -44,7 +44,7 @@ makeSkinPipeline(void)
ObjPipeline *pipe = new ObjPipeline(PLATFORM_D3D9); ObjPipeline *pipe = new ObjPipeline(PLATFORM_D3D9);
pipe->instanceCB = defaultInstanceCB; pipe->instanceCB = defaultInstanceCB;
pipe->uninstanceCB = defaultUninstanceCB; pipe->uninstanceCB = defaultUninstanceCB;
pipe->renderCB = defaultRenderCB; pipe->renderCB = defaultRenderCB_Shader;
pipe->pluginID = ID_SKIN; pipe->pluginID = ID_SKIN;
pipe->pluginData = 1; pipe->pluginData = 1;
return pipe; return pipe;

View File

@ -605,6 +605,21 @@ createPixelShader(void *csosrc)
return nil; return nil;
} }
void
destroyVertexShader(void *shader)
{
((IDirect3DVertexShader9*)shader)->Release();
d3d9Globals.numVertexShaders--;
}
void
destroyPixelShader(void *shader)
{
((IDirect3DPixelShader9*)shader)->Release();
d3d9Globals.numPixelShaders--;
}
// Camera // Camera
static void static void

View File

@ -6,6 +6,7 @@
#define WITH_D3D #define WITH_D3D
#include "../rwbase.h" #include "../rwbase.h"
#include "../rwplg.h" #include "../rwplg.h"
#include "../rwrender.h"
#include "../rwpipeline.h" #include "../rwpipeline.h"
#include "../rwobjects.h" #include "../rwobjects.h"
#include "../rwengine.h" #include "../rwengine.h"
@ -106,12 +107,11 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
d3ddevice->SetStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex)); d3ddevice->SetStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex));
d3ddevice->SetVertexDeclaration(im2ddecl); d3ddevice->SetVertexDeclaration(im2ddecl);
setTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
setTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); if(engine->device.getRenderState(TEXTURERASTER))
setTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); setPixelShader(default_color_tex_PS);
setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); else
setTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); setPixelShader(default_color_PS);
setTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
d3d::flushCache(); d3d::flushCache();
@ -137,6 +137,8 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
break; break;
} }
d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount); d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount);
setPixelShader(nil);
} }
void void
@ -159,12 +161,11 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
d3ddevice->SetStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex)); d3ddevice->SetStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex));
d3ddevice->SetIndices(im2dindbuf); d3ddevice->SetIndices(im2dindbuf);
d3ddevice->SetVertexDeclaration(im2ddecl); d3ddevice->SetVertexDeclaration(im2ddecl);
setTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
setTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); if(engine->device.getRenderState(TEXTURERASTER))
setTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); setPixelShader(default_color_tex_PS);
setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); else
setTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); setPixelShader(default_color_PS);
setTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
d3d::flushCache(); d3d::flushCache();
@ -192,6 +193,8 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0,
0, numVertices, 0, numVertices,
0, primCount); 0, primCount);
setPixelShader(nil);
} }
@ -242,16 +245,10 @@ closeIm3D(void)
void void
im3DTransform(void *vertices, int32 numVertices, Matrix *world) im3DTransform(void *vertices, int32 numVertices, Matrix *world)
{ {
RawMatrix d3dworld; if(world == nil)
d3d::setRenderState(D3DRS_LIGHTING, 0); uploadMatrices();
else
if(world == nil){ uploadMatrices(world);
Matrix ident;
ident.setIdentity();
convMatrix(&d3dworld, &ident);
}else
convMatrix(&d3dworld, world);
d3ddevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&d3dworld);
uint8 *lockedvertices = lockVertices(im3dvertbuf, 0, numVertices*sizeof(Im3DVertex), D3DLOCK_DISCARD); uint8 *lockedvertices = lockVertices(im3dvertbuf, 0, numVertices*sizeof(Im3DVertex), D3DLOCK_DISCARD);
memcpy(lockedvertices, vertices, numVertices*sizeof(Im3DVertex)); memcpy(lockedvertices, vertices, numVertices*sizeof(Im3DVertex));
@ -271,12 +268,12 @@ im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices)
unlockIndices(im3dindbuf); unlockIndices(im3dindbuf);
d3ddevice->SetIndices(im3dindbuf); d3ddevice->SetIndices(im3dindbuf);
setTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
setTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); if(engine->device.getRenderState(TEXTURERASTER))
setTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); setPixelShader(default_color_tex_PS);
setTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); else
setTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); setPixelShader(default_color_PS);
setTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
d3d::flushCache(); d3d::flushCache();
uint32 primCount = 0; uint32 primCount = 0;
@ -304,6 +301,8 @@ im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices)
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0,
0, num3DVertices, 0, num3DVertices,
0, primCount); 0, primCount);
setPixelShader(nil);
} }
void void

View File

@ -19,8 +19,71 @@ IDirect3DDevice9 *d3ddevice = nil;
#define MAX_LIGHTS 8 #define MAX_LIGHTS 8
#define VS_NAME g_vs20_main
#define PS_NAME g_ps20_main
void *default_amb_VS;
void *default_amb_dir_VS;
void *default_all_VS;
void *default_color_PS;
void *default_color_tex_PS;
void void
lightingCB(Atomic *atomic) createDefaultShaders(void)
{
{
static
#include "shaders/default_amb_VS.h"
default_amb_VS = createVertexShader((void*)VS_NAME);
assert(default_amb_VS);
}
{
static
#include "shaders/default_amb_dir_VS.h"
default_amb_dir_VS = createVertexShader((void*)VS_NAME);
assert(default_amb_dir_VS);
}
{
static
#include "shaders/default_all_VS.h"
default_all_VS = createVertexShader((void*)VS_NAME);
assert(default_all_VS);
}
{
static
#include "shaders/default_color_PS.h"
default_color_PS = createPixelShader((void*)PS_NAME);
assert(default_color_PS);
}
{
static
#include "shaders/default_color_tex_PS.h"
default_color_tex_PS = createPixelShader((void*)PS_NAME);
assert(default_color_tex_PS);
}
}
void
destroyDefaultShaders(void)
{
destroyVertexShader(default_amb_VS);
default_amb_VS = nil;
destroyVertexShader(default_amb_dir_VS);
default_amb_dir_VS = nil;
destroyVertexShader(default_all_VS);
default_all_VS = nil;
destroyPixelShader(default_color_PS);
default_color_PS = nil;
destroyPixelShader(default_color_tex_PS);
default_color_tex_PS = nil;
}
void
lightingCB_Fix(Atomic *atomic)
{ {
WorldLights lightData; WorldLights lightData;
Light *directionals[8]; Light *directionals[8];
@ -127,6 +190,162 @@ lightingCB(Atomic *atomic)
d3ddevice->LightEnable(n, FALSE); d3ddevice->LightEnable(n, FALSE);
} }
struct LightVS
{
V3d color; float param0;
V3d position; float param1;
V3d direction; float param2;
};
int32
uploadLights(WorldLights *lightData)
{
int i;
int bits = 0;
int32 numLights[4*3];
float32 firstLight[4];
firstLight[0] = 0; // directional
firstLight[1] = 0; // point
firstLight[2] = 0; // spot
firstLight[3] = 0;
if(lightData->numAmbients)
bits |= VSLIGHT_AMBIENT;
LightVS directionals[8];
LightVS points[8];
LightVS spots[8];
for(i = 0; i < lightData->numDirectionals; i++){
Light *l = lightData->directionals[i];
directionals[i].color.x = l->color.red;
directionals[i].color.y = l->color.green;
directionals[i].color.z = l->color.blue;
directionals[i].direction = l->getFrame()->getLTM()->at;
bits |= VSLIGHT_DIRECT;
}
int np = 0;
int ns = 0;
for(i = 0; i < lightData->numLocals; i++){
Light *l = lightData->locals[i];
switch(l->getType()){
case Light::POINT:
points[np].color.x = l->color.red;
points[np].color.y = l->color.green;
points[np].color.z = l->color.blue;
points[np].param0 = l->radius;
points[np].position = l->getFrame()->getLTM()->pos;
np++;
bits |= VSLIGHT_POINT;
break;
case Light::SPOT:
case Light::SOFTSPOT:
spots[ns].color.x = l->color.red;
spots[ns].color.y = l->color.green;
spots[ns].color.z = l->color.blue;
spots[ns].param0 = l->radius;
spots[ns].position = l->getFrame()->getLTM()->pos;
spots[ns].direction = l->getFrame()->getLTM()->at;
spots[ns].param1 = l->minusCosAngle;
// lower bound of falloff
if(l->getType() == Light::SOFTSPOT)
spots[ns].param2 = 0.0f;
else
spots[ns].param2 = 1.0f;
bits |= VSLIGHT_SPOT;
ns++;
break;
}
}
firstLight[0] = 0;
numLights[0] = lightData->numDirectionals;
firstLight[1] = numLights[0] + firstLight[0];
numLights[4] = np;
firstLight[2] = numLights[4] + firstLight[1];
numLights[8] = ns;
d3ddevice->SetVertexShaderConstantI(VSLOC_numLights, numLights, 3);
d3ddevice->SetVertexShaderConstantF(VSLOC_lightOffset, firstLight, 1);
int32 off = VSLOC_lights;
if(numLights[0])
d3ddevice->SetVertexShaderConstantF(off, (float*)&directionals, numLights[0]*3);
off += numLights[0]*3;
if(numLights[4])
d3ddevice->SetVertexShaderConstantF(off, (float*)&points, numLights[4]*3);
off += numLights[4]*3;
if(numLights[8])
d3ddevice->SetVertexShaderConstantF(off, (float*)&spots, numLights[8]*3);
return bits;
}
int32
lightingCB_Shader(Atomic *atomic)
{
WorldLights lightData;
Light *directionals[8];
Light *locals[8];
lightData.directionals = directionals;
lightData.numDirectionals = 8;
lightData.locals = locals;
lightData.numLocals = 8;
int lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT);
if(lighting){
((World*)engine->currentWorld)->enumerateLights(atomic, &lightData);
d3ddevice->SetVertexShaderConstantF(VSLOC_ambLight, (float*)&lightData.ambient, 1);
return uploadLights(&lightData);
}else{
static const float zeroF[4];
static const int32 zeroI[4];
d3ddevice->SetVertexShaderConstantF(VSLOC_ambLight, zeroF, 1);
d3ddevice->SetVertexShaderConstantI(VSLOC_numLights, zeroI, 1);
return 0;
}
}
static RawMatrix identityXform = {
{ 1.0f, 0.0f, 0.0f }, 0.0f,
{ 0.0f, 1.0f, 0.0f }, 0.0f,
{ 0.0f, 0.0f, 1.0f }, 0.0f,
{ 0.0f, 0.0f, 0.0f }, 1.0f
};
void
uploadMatrices(void)
{
RawMatrix combined;
Camera *cam = engine->currentCamera;
d3ddevice->SetVertexShaderConstantF(VSLOC_world, (float*)&identityXform, 4);
d3ddevice->SetVertexShaderConstantF(VSLOC_normal, (float*)&identityXform, 4);
RawMatrix::mult(&combined, &cam->devView, &cam->devProj);
d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&combined, 4);
}
void
uploadMatrices(Matrix *worldMat)
{
RawMatrix combined, world, worldview;
Camera *cam = engine->currentCamera;
convMatrix(&world, worldMat);
d3ddevice->SetVertexShaderConstantF(VSLOC_world, (float*)&world, 4);
// TODO: inverse transpose
d3ddevice->SetVertexShaderConstantF(VSLOC_normal, (float*)&world, 4);
RawMatrix::mult(&worldview, &world, &cam->devView);
RawMatrix::mult(&combined, &worldview, &cam->devProj);
d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&combined, 4);
}
#endif #endif
} }

View File

@ -37,8 +37,6 @@ extern IDirect3DDevice9 *d3ddevice;
void setD3dMaterial(D3DMATERIAL9 *mat9); void setD3dMaterial(D3DMATERIAL9 *mat9);
#endif #endif
void lightingCB(Atomic *atomic);
#define COLOR_ARGB(a, r, g, b) ((rw::uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) #define COLOR_ARGB(a, r, g, b) ((rw::uint32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
struct Im3DVertex struct Im3DVertex
@ -188,6 +186,57 @@ void setVertexShader(void *vs);
void setPixelShader(void *ps); void setPixelShader(void *ps);
void *createVertexShader(void *csosrc); void *createVertexShader(void *csosrc);
void *createPixelShader(void *csosrc); void *createPixelShader(void *csosrc);
void destroyVertexShader(void *shader);
void destroyPixelShader(void *shader);
/*
* Vertex shaders and common pipeline stuff
*/
// Standard Vertex shader locations
enum
{
VSLOC_combined = 0,
VSLOC_world = 4,
VSLOC_normal = 8,
VSLOC_matColor = 12,
VSLOC_surfProps = 13,
VSLOC_ambLight = 14,
VSLOC_lightOffset = 15,
VSLOC_lights = 16,
VSLOC_afterLights = VSLOC_lights + 8*3,
VSLOC_numLights = 0,
};
// Vertex shader bits
enum
{
// These should be low so they could be used as indices
VSLIGHT_DIRECT = 1,
VSLIGHT_POINT = 2,
VSLIGHT_SPOT = 4,
VSLIGHT_MASK = 7, // all the above
// less critical
VSLIGHT_AMBIENT = 8,
};
void lightingCB_Fix(Atomic *atomic);
int32 lightingCB_Shader(Atomic *atomic);
// for VS
void uploadMatrices(void); // no world transform
void uploadMatrices(Matrix *worldMat);
int32 uploadLights(WorldLights *lightData); // called by lightingCB_Shader
extern void *default_amb_VS;
extern void *default_amb_dir_VS;
extern void *default_all_VS;
extern void *default_color_PS;
extern void *default_color_tex_PS;
void createDefaultShaders(void);
void destroyDefaultShaders(void);
} }
} }

View File

@ -58,6 +58,9 @@ void drawInst(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst);
// Emulate PS2 GS alpha test FB_ONLY case: failed alpha writes to frame- but not to depth buffer // Emulate PS2 GS alpha test FB_ONLY case: failed alpha writes to frame- but not to depth buffer
void drawInst_GSemu(d3d9::InstanceDataHeader *header, InstanceData *inst); void drawInst_GSemu(d3d9::InstanceDataHeader *header, InstanceData *inst);
void *destroyNativeData(void *object, int32, int32); void *destroyNativeData(void *object, int32, int32);
Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32); Stream *readNativeData(Stream *stream, int32 len, void *object, int32, int32);
Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32); Stream *writeNativeData(Stream *stream, int32 len, void *object, int32, int32);
@ -76,10 +79,12 @@ public:
void defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance); void defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance);
void defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header); void defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header);
void defaultRenderCB(Atomic *atomic, InstanceDataHeader *header); void defaultRenderCB_Fix(Atomic *atomic, InstanceDataHeader *header);
void defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header);
ObjPipeline *makeDefaultPipeline(void); ObjPipeline *makeDefaultPipeline(void);
// Skin plugin // Skin plugin
void initSkin(void); void initSkin(void);

View File

@ -60,6 +60,7 @@ void removeDynamicVB(IDirect3DVertexBuffer9 **buf);
int findFormatDepth(uint32 format); int findFormatDepth(uint32 format);
void destroyD3D9Raster(Raster *raster); void destroyD3D9Raster(Raster *raster);
#endif #endif
Raster *rasterCreate(Raster *raster); Raster *rasterCreate(Raster *raster);

View File

@ -0,0 +1,74 @@
float4x4 combinedMat : register(c0);
float4x4 worldMat : register(c4);
float3x3 normalMat : register(c8);
float4 matCol : register(c12);
float4 surfProps : register(c13);
float4 ambientLight : register(c14);
#define surfAmbient (surfProps.x)
#define surfSpecular (surfProps.y)
#define surfDiffuse (surfProps.z)
#define surfPrelight (surfProps.w)
#include "lighting.h"
int numDirLights : register(i0);
int numPointLights : register(i1);
int numSpotLights : register(i2);
int4 firstLight : register(c15);
Light lights[8] : register(c16);
#define firstDirLight (firstLight.x)
#define firstPointLight (firstLight.y)
#define firstSpotLight (firstLight.z)
struct VS_in
{
float4 Position : POSITION;
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
float4 Prelight : COLOR0;
};
struct VS_out {
float4 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
float4 Color : COLOR0;
};
VS_out main(in VS_in input)
{
VS_out output;
output.Position = mul(combinedMat, input.Position);
float3 Vertex = mul(worldMat, input.Position).xyz;
float3 Normal = mul(normalMat, input.Normal);
output.TexCoord0 = input.TexCoord;
output.Color = float4(0.0, 0.0, 0.0, 1.0);
if(surfPrelight > 0.0)
output.Color = input.Prelight;
output.Color.rgb += ambientLight.rgb * surfAmbient;
int i;
#ifdef DIRECTIONALS
for(i = 0; i < numDirLights; i++)
output.Color.xyz += DoDirLight(lights[i+firstDirLight], Normal)*surfDiffuse;
#endif
#ifdef POINTLIGHTS
for(i = 0; i < numPointLights; i++)
output.Color.xyz += DoPointLight(lights[i+firstPointLight], Vertex.xyz, Normal)*surfDiffuse;
#endif
#ifdef SPOTLIGHTS
for(i = 0; i < numSpotLights; i++)
output.Color.xyz += DoSpotLight(lights[i+firstSpotLight], Vertex.xyz, Normal)*surfDiffuse;
#endif
// PS2 clamps before material color
output.Color = clamp(output.Color, 0.0, 1.0);
output.Color *= matCol;
return output;
}

View File

@ -0,0 +1,485 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh
// default_all_VS.h defaultVS.hlsl
//
//
// Parameters:
//
// float4 ambientLight;
// float4x4 combinedMat;
// int4 firstLight;
//
// struct
// {
// float4 color;
// float4 position;
// float4 direction;
//
// } lights[8];
//
// float4 matCol;
// float3x3 normalMat;
// int numDirLights;
// int numPointLights;
// int numSpotLights;
// float4 surfProps;
// float4x4 worldMat;
//
//
// Registers:
//
// Name Reg Size
// -------------- ----- ----
// numDirLights i0 1
// numPointLights i1 1
// numSpotLights i2 1
// combinedMat c0 4
// worldMat c4 4
// normalMat c8 3
// matCol c12 1
// surfProps c13 1
// ambientLight c14 1
// firstLight c15 1
// lights c16 24
//
vs_2_0
def c11, 3, 0, 0, 0
def c40, 0, -0, -1, 1
dcl_position v0
dcl_normal v1
dcl_texcoord v2
dcl_color v3
mul r0, v0.y, c1
mad r0, c0, v0.x, r0
mad r0, c2, v0.z, r0
mad oPos, c3, v0.w, r0
mul r0.xyz, v0.y, c5
mad r0.xyz, c4, v0.x, r0
mad r0.xyz, c6, v0.z, r0
mad r0.xyz, c7, v0.w, r0
mul r1.xyz, v1.y, c9
mad r1.xyz, c8, v1.x, r1
mad r1.xyz, c10, v1.z, r1
mov r2.xw, c40
slt r0.w, r2.x, c13.w
add r3, v3, c40.yyyz
mad r3, r0.w, r3, c40.xxxw
mov r2.x, c13.x
mad r2.xyz, c14, r2.x, r3
mov r4.xyz, r2
mov r0.w, c40.x
rep i0
add r1.w, r0.w, c15.x
mul r1.w, r1.w, c11.x
mova a0.x, r1.w
dp3 r1.w, r1, -c18[a0.x]
max r1.w, r1.w, c40.x
mul r5.xyz, r1.w, c16[a0.x]
mad r4.xyz, r5, c13.z, r4
add r0.w, r0.w, c40.w
endrep
mov r2.xyz, r4
mov r0.w, c40.x
rep i1
add r1.w, r0.w, c15.y
mul r1.w, r1.w, c11.x
mova a0.x, r1.w
add r5.xyz, r0, -c17[a0.x]
dp3 r1.w, r5, r5
rsq r1.w, r1.w
mul r5.xyz, r1.w, r5
dp3 r4.w, r1, -r5
max r4.w, r4.w, c40.x
mul r5.xyz, r4.w, c16[a0.x]
rcp r1.w, r1.w
rcp r4.w, c16[a0.x].w
mad r1.w, r1.w, -r4.w, c40.w
max r1.w, r1.w, c40.x
mul r5.xyz, r1.w, r5
mad r2.xyz, r5, c13.z, r2
add r0.w, r0.w, c40.w
endrep
mov r3.xyz, r2
mov r0.w, c40.x
rep i2
add r1.w, r0.w, c15.z
mul r1.w, r1.w, c11.x
mova a0.x, r1.w
add r4.xyz, r0, -c17[a0.x]
dp3 r1.w, r4, r4
rsq r1.w, r1.w
mul r4.xyz, r1.w, r4
dp3 r4.w, r1, -r4
dp3 r4.x, r4, c18[a0.x]
max r4.y, r4.w, c40.x
add r4.x, r4.x, c17[a0.x].w
add r4.z, r2.w, c17[a0.x].w
rcp r4.z, r4.z
mul r4.x, r4.z, r4.x
slt r4.z, r4.x, c40.x
mad r4.y, r4.z, -r4.y, r4.y
max r4.x, r4.x, c18[a0.x].w
mul r4.x, r4.x, r4.y
mul r4.xyz, r4.x, c16[a0.x]
rcp r1.w, r1.w
rcp r4.w, c16[a0.x].w
mad r1.w, r1.w, -r4.w, c40.w
max r1.w, r1.w, c40.x
mul r4.xyz, r1.w, r4
mad r3.xyz, r4, c13.z, r3
add r0.w, r0.w, c40.w
endrep
max r0, r3, c40.x
min r0, r0, c40.w
mul oD0, r0, c12
mov oT0.xy, v2
// approximately 93 instruction slots used
#endif
const BYTE g_vs20_main[] =
{
0, 2, 254, 255, 254, 255,
151, 0, 67, 84, 65, 66,
28, 0, 0, 0, 39, 2,
0, 0, 0, 2, 254, 255,
11, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
32, 2, 0, 0, 248, 0,
0, 0, 2, 0, 14, 0,
1, 0, 58, 0, 8, 1,
0, 0, 0, 0, 0, 0,
24, 1, 0, 0, 2, 0,
0, 0, 4, 0, 2, 0,
36, 1, 0, 0, 0, 0,
0, 0, 52, 1, 0, 0,
2, 0, 15, 0, 1, 0,
62, 0, 64, 1, 0, 0,
0, 0, 0, 0, 80, 1,
0, 0, 2, 0, 16, 0,
24, 0, 66, 0, 156, 1,
0, 0, 0, 0, 0, 0,
172, 1, 0, 0, 2, 0,
12, 0, 1, 0, 50, 0,
8, 1, 0, 0, 0, 0,
0, 0, 179, 1, 0, 0,
2, 0, 8, 0, 3, 0,
34, 0, 192, 1, 0, 0,
0, 0, 0, 0, 208, 1,
0, 0, 1, 0, 0, 0,
1, 0, 2, 0, 224, 1,
0, 0, 0, 0, 0, 0,
240, 1, 0, 0, 1, 0,
1, 0, 1, 0, 6, 0,
224, 1, 0, 0, 0, 0,
0, 0, 255, 1, 0, 0,
1, 0, 2, 0, 1, 0,
10, 0, 224, 1, 0, 0,
0, 0, 0, 0, 13, 2,
0, 0, 2, 0, 13, 0,
1, 0, 54, 0, 8, 1,
0, 0, 0, 0, 0, 0,
23, 2, 0, 0, 2, 0,
4, 0, 4, 0, 18, 0,
36, 1, 0, 0, 0, 0,
0, 0, 97, 109, 98, 105,
101, 110, 116, 76, 105, 103,
104, 116, 0, 171, 171, 171,
1, 0, 3, 0, 1, 0,
4, 0, 1, 0, 0, 0,
0, 0, 0, 0, 99, 111,
109, 98, 105, 110, 101, 100,
77, 97, 116, 0, 3, 0,
3, 0, 4, 0, 4, 0,
1, 0, 0, 0, 0, 0,
0, 0, 102, 105, 114, 115,
116, 76, 105, 103, 104, 116,
0, 171, 1, 0, 2, 0,
1, 0, 4, 0, 1, 0,
0, 0, 0, 0, 0, 0,
108, 105, 103, 104, 116, 115,
0, 99, 111, 108, 111, 114,
0, 171, 171, 171, 1, 0,
3, 0, 1, 0, 4, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 111, 115, 105,
116, 105, 111, 110, 0, 100,
105, 114, 101, 99, 116, 105,
111, 110, 0, 171, 87, 1,
0, 0, 96, 1, 0, 0,
112, 1, 0, 0, 96, 1,
0, 0, 121, 1, 0, 0,
96, 1, 0, 0, 5, 0,
0, 0, 1, 0, 12, 0,
8, 0, 3, 0, 132, 1,
0, 0, 109, 97, 116, 67,
111, 108, 0, 110, 111, 114,
109, 97, 108, 77, 97, 116,
0, 171, 171, 171, 3, 0,
3, 0, 3, 0, 3, 0,
1, 0, 0, 0, 0, 0,
0, 0, 110, 117, 109, 68,
105, 114, 76, 105, 103, 104,
116, 115, 0, 171, 171, 171,
0, 0, 2, 0, 1, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 110, 117,
109, 80, 111, 105, 110, 116,
76, 105, 103, 104, 116, 115,
0, 110, 117, 109, 83, 112,
111, 116, 76, 105, 103, 104,
116, 115, 0, 115, 117, 114,
102, 80, 114, 111, 112, 115,
0, 119, 111, 114, 108, 100,
77, 97, 116, 0, 118, 115,
95, 50, 95, 48, 0, 77,
105, 99, 114, 111, 115, 111,
102, 116, 32, 40, 82, 41,
32, 72, 76, 83, 76, 32,
83, 104, 97, 100, 101, 114,
32, 67, 111, 109, 112, 105,
108, 101, 114, 32, 57, 46,
50, 57, 46, 57, 53, 50,
46, 51, 49, 49, 49, 0,
81, 0, 0, 5, 11, 0,
15, 160, 0, 0, 64, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
81, 0, 0, 5, 40, 0,
15, 160, 0, 0, 0, 0,
0, 0, 0, 128, 0, 0,
128, 191, 0, 0, 128, 63,
31, 0, 0, 2, 0, 0,
0, 128, 0, 0, 15, 144,
31, 0, 0, 2, 3, 0,
0, 128, 1, 0, 15, 144,
31, 0, 0, 2, 5, 0,
0, 128, 2, 0, 15, 144,
31, 0, 0, 2, 10, 0,
0, 128, 3, 0, 15, 144,
5, 0, 0, 3, 0, 0,
15, 128, 0, 0, 85, 144,
1, 0, 228, 160, 4, 0,
0, 4, 0, 0, 15, 128,
0, 0, 228, 160, 0, 0,
0, 144, 0, 0, 228, 128,
4, 0, 0, 4, 0, 0,
15, 128, 2, 0, 228, 160,
0, 0, 170, 144, 0, 0,
228, 128, 4, 0, 0, 4,
0, 0, 15, 192, 3, 0,
228, 160, 0, 0, 255, 144,
0, 0, 228, 128, 5, 0,
0, 3, 0, 0, 7, 128,
0, 0, 85, 144, 5, 0,
228, 160, 4, 0, 0, 4,
0, 0, 7, 128, 4, 0,
228, 160, 0, 0, 0, 144,
0, 0, 228, 128, 4, 0,
0, 4, 0, 0, 7, 128,
6, 0, 228, 160, 0, 0,
170, 144, 0, 0, 228, 128,
4, 0, 0, 4, 0, 0,
7, 128, 7, 0, 228, 160,
0, 0, 255, 144, 0, 0,
228, 128, 5, 0, 0, 3,
1, 0, 7, 128, 1, 0,
85, 144, 9, 0, 228, 160,
4, 0, 0, 4, 1, 0,
7, 128, 8, 0, 228, 160,
1, 0, 0, 144, 1, 0,
228, 128, 4, 0, 0, 4,
1, 0, 7, 128, 10, 0,
228, 160, 1, 0, 170, 144,
1, 0, 228, 128, 1, 0,
0, 2, 2, 0, 9, 128,
40, 0, 228, 160, 12, 0,
0, 3, 0, 0, 8, 128,
2, 0, 0, 128, 13, 0,
255, 160, 2, 0, 0, 3,
3, 0, 15, 128, 3, 0,
228, 144, 40, 0, 149, 160,
4, 0, 0, 4, 3, 0,
15, 128, 0, 0, 255, 128,
3, 0, 228, 128, 40, 0,
192, 160, 1, 0, 0, 2,
2, 0, 1, 128, 13, 0,
0, 160, 4, 0, 0, 4,
2, 0, 7, 128, 14, 0,
228, 160, 2, 0, 0, 128,
3, 0, 228, 128, 1, 0,
0, 2, 4, 0, 7, 128,
2, 0, 228, 128, 1, 0,
0, 2, 0, 0, 8, 128,
40, 0, 0, 160, 38, 0,
0, 1, 0, 0, 228, 240,
2, 0, 0, 3, 1, 0,
8, 128, 0, 0, 255, 128,
15, 0, 0, 160, 5, 0,
0, 3, 1, 0, 8, 128,
1, 0, 255, 128, 11, 0,
0, 160, 46, 0, 0, 2,
0, 0, 1, 176, 1, 0,
255, 128, 8, 0, 0, 4,
1, 0, 8, 128, 1, 0,
228, 128, 18, 32, 228, 161,
0, 0, 0, 176, 11, 0,
0, 3, 1, 0, 8, 128,
1, 0, 255, 128, 40, 0,
0, 160, 5, 0, 0, 4,
5, 0, 7, 128, 1, 0,
255, 128, 16, 32, 228, 160,
0, 0, 0, 176, 4, 0,
0, 4, 4, 0, 7, 128,
5, 0, 228, 128, 13, 0,
170, 160, 4, 0, 228, 128,
2, 0, 0, 3, 0, 0,
8, 128, 0, 0, 255, 128,
40, 0, 255, 160, 39, 0,
0, 0, 1, 0, 0, 2,
2, 0, 7, 128, 4, 0,
228, 128, 1, 0, 0, 2,
0, 0, 8, 128, 40, 0,
0, 160, 38, 0, 0, 1,
1, 0, 228, 240, 2, 0,
0, 3, 1, 0, 8, 128,
0, 0, 255, 128, 15, 0,
85, 160, 5, 0, 0, 3,
1, 0, 8, 128, 1, 0,
255, 128, 11, 0, 0, 160,
46, 0, 0, 2, 0, 0,
1, 176, 1, 0, 255, 128,
2, 0, 0, 4, 5, 0,
7, 128, 0, 0, 228, 128,
17, 32, 228, 161, 0, 0,
0, 176, 8, 0, 0, 3,
1, 0, 8, 128, 5, 0,
228, 128, 5, 0, 228, 128,
7, 0, 0, 2, 1, 0,
8, 128, 1, 0, 255, 128,
5, 0, 0, 3, 5, 0,
7, 128, 1, 0, 255, 128,
5, 0, 228, 128, 8, 0,
0, 3, 4, 0, 8, 128,
1, 0, 228, 128, 5, 0,
228, 129, 11, 0, 0, 3,
4, 0, 8, 128, 4, 0,
255, 128, 40, 0, 0, 160,
5, 0, 0, 4, 5, 0,
7, 128, 4, 0, 255, 128,
16, 32, 228, 160, 0, 0,
0, 176, 6, 0, 0, 2,
1, 0, 8, 128, 1, 0,
255, 128, 6, 0, 0, 3,
4, 0, 8, 128, 16, 32,
255, 160, 0, 0, 0, 176,
4, 0, 0, 4, 1, 0,
8, 128, 1, 0, 255, 128,
4, 0, 255, 129, 40, 0,
255, 160, 11, 0, 0, 3,
1, 0, 8, 128, 1, 0,
255, 128, 40, 0, 0, 160,
5, 0, 0, 3, 5, 0,
7, 128, 1, 0, 255, 128,
5, 0, 228, 128, 4, 0,
0, 4, 2, 0, 7, 128,
5, 0, 228, 128, 13, 0,
170, 160, 2, 0, 228, 128,
2, 0, 0, 3, 0, 0,
8, 128, 0, 0, 255, 128,
40, 0, 255, 160, 39, 0,
0, 0, 1, 0, 0, 2,
3, 0, 7, 128, 2, 0,
228, 128, 1, 0, 0, 2,
0, 0, 8, 128, 40, 0,
0, 160, 38, 0, 0, 1,
2, 0, 228, 240, 2, 0,
0, 3, 1, 0, 8, 128,
0, 0, 255, 128, 15, 0,
170, 160, 5, 0, 0, 3,
1, 0, 8, 128, 1, 0,
255, 128, 11, 0, 0, 160,
46, 0, 0, 2, 0, 0,
1, 176, 1, 0, 255, 128,
2, 0, 0, 4, 4, 0,
7, 128, 0, 0, 228, 128,
17, 32, 228, 161, 0, 0,
0, 176, 8, 0, 0, 3,
1, 0, 8, 128, 4, 0,
228, 128, 4, 0, 228, 128,
7, 0, 0, 2, 1, 0,
8, 128, 1, 0, 255, 128,
5, 0, 0, 3, 4, 0,
7, 128, 1, 0, 255, 128,
4, 0, 228, 128, 8, 0,
0, 3, 4, 0, 8, 128,
1, 0, 228, 128, 4, 0,
228, 129, 8, 0, 0, 4,
4, 0, 1, 128, 4, 0,
228, 128, 18, 32, 228, 160,
0, 0, 0, 176, 11, 0,
0, 3, 4, 0, 2, 128,
4, 0, 255, 128, 40, 0,
0, 160, 2, 0, 0, 4,
4, 0, 1, 128, 4, 0,
0, 128, 17, 32, 255, 160,
0, 0, 0, 176, 2, 0,
0, 4, 4, 0, 4, 128,
2, 0, 255, 128, 17, 32,
255, 160, 0, 0, 0, 176,
6, 0, 0, 2, 4, 0,
4, 128, 4, 0, 170, 128,
5, 0, 0, 3, 4, 0,
1, 128, 4, 0, 170, 128,
4, 0, 0, 128, 12, 0,
0, 3, 4, 0, 4, 128,
4, 0, 0, 128, 40, 0,
0, 160, 4, 0, 0, 4,
4, 0, 2, 128, 4, 0,
170, 128, 4, 0, 85, 129,
4, 0, 85, 128, 11, 0,
0, 4, 4, 0, 1, 128,
4, 0, 0, 128, 18, 32,
255, 160, 0, 0, 0, 176,
5, 0, 0, 3, 4, 0,
1, 128, 4, 0, 0, 128,
4, 0, 85, 128, 5, 0,
0, 4, 4, 0, 7, 128,
4, 0, 0, 128, 16, 32,
228, 160, 0, 0, 0, 176,
6, 0, 0, 2, 1, 0,
8, 128, 1, 0, 255, 128,
6, 0, 0, 3, 4, 0,
8, 128, 16, 32, 255, 160,
0, 0, 0, 176, 4, 0,
0, 4, 1, 0, 8, 128,
1, 0, 255, 128, 4, 0,
255, 129, 40, 0, 255, 160,
11, 0, 0, 3, 1, 0,
8, 128, 1, 0, 255, 128,
40, 0, 0, 160, 5, 0,
0, 3, 4, 0, 7, 128,
1, 0, 255, 128, 4, 0,
228, 128, 4, 0, 0, 4,
3, 0, 7, 128, 4, 0,
228, 128, 13, 0, 170, 160,
3, 0, 228, 128, 2, 0,
0, 3, 0, 0, 8, 128,
0, 0, 255, 128, 40, 0,
255, 160, 39, 0, 0, 0,
11, 0, 0, 3, 0, 0,
15, 128, 3, 0, 228, 128,
40, 0, 0, 160, 10, 0,
0, 3, 0, 0, 15, 128,
0, 0, 228, 128, 40, 0,
255, 160, 5, 0, 0, 3,
0, 0, 15, 208, 0, 0,
228, 128, 12, 0, 228, 160,
1, 0, 0, 2, 0, 0,
3, 224, 2, 0, 228, 144,
255, 255, 0, 0
};

View File

@ -0,0 +1,143 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc /T vs_2_0 /Fh default_amb_VS.h defaultVS.hlsl
//
//
// Parameters:
//
// float4 ambientLight;
// float4x4 combinedMat;
// float4 matCol;
// float4 surfProps;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// combinedMat c0 4
// matCol c12 1
// surfProps c13 1
// ambientLight c14 1
//
vs_2_0
def c4, 0, -0, -1, 1
dcl_position v0
dcl_texcoord v1
dcl_color v2
mul r0, v0.y, c1
mad r0, c0, v0.x, r0
mad r0, c2, v0.z, r0
mad oPos, c3, v0.w, r0
mov r0.x, c4.x
slt r0.x, r0.x, c13.w
add r1, v2, c4.yyyz
mad r0, r0.x, r1, c4.xxxw
mov r1.x, c13.x
mad r0.xyz, c14, r1.x, r0
max r0, r0, c4.x
min r0, r0, c4.w
mul oD0, r0, c12
mov oT0.xy, v1
// approximately 14 instruction slots used
#endif
const BYTE g_vs20_main[] =
{
0, 2, 254, 255, 254, 255,
62, 0, 67, 84, 65, 66,
28, 0, 0, 0, 192, 0,
0, 0, 0, 2, 254, 255,
4, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
185, 0, 0, 0, 108, 0,
0, 0, 2, 0, 14, 0,
1, 0, 58, 0, 124, 0,
0, 0, 0, 0, 0, 0,
140, 0, 0, 0, 2, 0,
0, 0, 4, 0, 2, 0,
152, 0, 0, 0, 0, 0,
0, 0, 168, 0, 0, 0,
2, 0, 12, 0, 1, 0,
50, 0, 124, 0, 0, 0,
0, 0, 0, 0, 175, 0,
0, 0, 2, 0, 13, 0,
1, 0, 54, 0, 124, 0,
0, 0, 0, 0, 0, 0,
97, 109, 98, 105, 101, 110,
116, 76, 105, 103, 104, 116,
0, 171, 171, 171, 1, 0,
3, 0, 1, 0, 4, 0,
1, 0, 0, 0, 0, 0,
0, 0, 99, 111, 109, 98,
105, 110, 101, 100, 77, 97,
116, 0, 3, 0, 3, 0,
4, 0, 4, 0, 1, 0,
0, 0, 0, 0, 0, 0,
109, 97, 116, 67, 111, 108,
0, 115, 117, 114, 102, 80,
114, 111, 112, 115, 0, 118,
115, 95, 50, 95, 48, 0,
77, 105, 99, 114, 111, 115,
111, 102, 116, 32, 40, 82,
41, 32, 72, 76, 83, 76,
32, 83, 104, 97, 100, 101,
114, 32, 67, 111, 109, 112,
105, 108, 101, 114, 32, 57,
46, 50, 57, 46, 57, 53,
50, 46, 51, 49, 49, 49,
0, 171, 171, 171, 81, 0,
0, 5, 4, 0, 15, 160,
0, 0, 0, 0, 0, 0,
0, 128, 0, 0, 128, 191,
0, 0, 128, 63, 31, 0,
0, 2, 0, 0, 0, 128,
0, 0, 15, 144, 31, 0,
0, 2, 5, 0, 0, 128,
1, 0, 15, 144, 31, 0,
0, 2, 10, 0, 0, 128,
2, 0, 15, 144, 5, 0,
0, 3, 0, 0, 15, 128,
0, 0, 85, 144, 1, 0,
228, 160, 4, 0, 0, 4,
0, 0, 15, 128, 0, 0,
228, 160, 0, 0, 0, 144,
0, 0, 228, 128, 4, 0,
0, 4, 0, 0, 15, 128,
2, 0, 228, 160, 0, 0,
170, 144, 0, 0, 228, 128,
4, 0, 0, 4, 0, 0,
15, 192, 3, 0, 228, 160,
0, 0, 255, 144, 0, 0,
228, 128, 1, 0, 0, 2,
0, 0, 1, 128, 4, 0,
0, 160, 12, 0, 0, 3,
0, 0, 1, 128, 0, 0,
0, 128, 13, 0, 255, 160,
2, 0, 0, 3, 1, 0,
15, 128, 2, 0, 228, 144,
4, 0, 149, 160, 4, 0,
0, 4, 0, 0, 15, 128,
0, 0, 0, 128, 1, 0,
228, 128, 4, 0, 192, 160,
1, 0, 0, 2, 1, 0,
1, 128, 13, 0, 0, 160,
4, 0, 0, 4, 0, 0,
7, 128, 14, 0, 228, 160,
1, 0, 0, 128, 0, 0,
228, 128, 11, 0, 0, 3,
0, 0, 15, 128, 0, 0,
228, 128, 4, 0, 0, 160,
10, 0, 0, 3, 0, 0,
15, 128, 0, 0, 228, 128,
4, 0, 255, 160, 5, 0,
0, 3, 0, 0, 15, 208,
0, 0, 228, 128, 12, 0,
228, 160, 1, 0, 0, 2,
0, 0, 3, 224, 1, 0,
228, 144, 255, 255, 0, 0
};

View File

@ -0,0 +1,264 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc /T vs_2_0 /DDIRECTIONALS /Fh default_amb_dir_VS.h defaultVS.hlsl
//
//
// Parameters:
//
// float4 ambientLight;
// float4x4 combinedMat;
// int4 firstLight;
//
// struct
// {
// float4 color;
// float4 position;
// float4 direction;
//
// } lights[8];
//
// float4 matCol;
// float3x3 normalMat;
// int numDirLights;
// float4 surfProps;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// numDirLights i0 1
// combinedMat c0 4
// normalMat c8 3
// matCol c12 1
// surfProps c13 1
// ambientLight c14 1
// firstLight c15 1
// lights c16 24
//
vs_2_0
def c4, 3, 0, 0, 0
def c5, 0, -0, -1, 1
dcl_position v0
dcl_normal v1
dcl_texcoord v2
dcl_color v3
mul r0, v0.y, c1
mad r0, c0, v0.x, r0
mad r0, c2, v0.z, r0
mad oPos, c3, v0.w, r0
mul r0.xyz, v1.y, c9
mad r0.xyz, c8, v1.x, r0
mad r0.xyz, c10, v1.z, r0
mov r1.x, c5.x
slt r0.w, r1.x, c13.w
add r1, v3, c5.yyyz
mad r1, r0.w, r1, c5.xxxw
mov r2.x, c13.x
mad r2.xyz, c14, r2.x, r1
mov r1.xyz, r2
mov r0.w, c5.x
rep i0
add r2.w, r0.w, c15.x
mul r2.w, r2.w, c4.x
mova a0.x, r2.w
dp3 r2.w, r0, -c18[a0.x]
max r2.w, r2.w, c5.x
mul r3.xyz, r2.w, c16[a0.x]
mad r1.xyz, r3, c13.z, r1
add r0.w, r0.w, c5.w
endrep
max r0, r1, c5.x
min r0, r0, c5.w
mul oD0, r0, c12
mov oT0.xy, v2
// approximately 32 instruction slots used
#endif
const BYTE g_vs20_main[] =
{
0, 2, 254, 255, 254, 255,
127, 0, 67, 84, 65, 66,
28, 0, 0, 0, 197, 1,
0, 0, 0, 2, 254, 255,
8, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
190, 1, 0, 0, 188, 0,
0, 0, 2, 0, 14, 0,
1, 0, 58, 0, 204, 0,
0, 0, 0, 0, 0, 0,
220, 0, 0, 0, 2, 0,
0, 0, 4, 0, 2, 0,
232, 0, 0, 0, 0, 0,
0, 0, 248, 0, 0, 0,
2, 0, 15, 0, 1, 0,
62, 0, 4, 1, 0, 0,
0, 0, 0, 0, 20, 1,
0, 0, 2, 0, 16, 0,
24, 0, 66, 0, 96, 1,
0, 0, 0, 0, 0, 0,
112, 1, 0, 0, 2, 0,
12, 0, 1, 0, 50, 0,
204, 0, 0, 0, 0, 0,
0, 0, 119, 1, 0, 0,
2, 0, 8, 0, 3, 0,
34, 0, 132, 1, 0, 0,
0, 0, 0, 0, 148, 1,
0, 0, 1, 0, 0, 0,
1, 0, 2, 0, 164, 1,
0, 0, 0, 0, 0, 0,
180, 1, 0, 0, 2, 0,
13, 0, 1, 0, 54, 0,
204, 0, 0, 0, 0, 0,
0, 0, 97, 109, 98, 105,
101, 110, 116, 76, 105, 103,
104, 116, 0, 171, 171, 171,
1, 0, 3, 0, 1, 0,
4, 0, 1, 0, 0, 0,
0, 0, 0, 0, 99, 111,
109, 98, 105, 110, 101, 100,
77, 97, 116, 0, 3, 0,
3, 0, 4, 0, 4, 0,
1, 0, 0, 0, 0, 0,
0, 0, 102, 105, 114, 115,
116, 76, 105, 103, 104, 116,
0, 171, 1, 0, 2, 0,
1, 0, 4, 0, 1, 0,
0, 0, 0, 0, 0, 0,
108, 105, 103, 104, 116, 115,
0, 99, 111, 108, 111, 114,
0, 171, 171, 171, 1, 0,
3, 0, 1, 0, 4, 0,
1, 0, 0, 0, 0, 0,
0, 0, 112, 111, 115, 105,
116, 105, 111, 110, 0, 100,
105, 114, 101, 99, 116, 105,
111, 110, 0, 171, 27, 1,
0, 0, 36, 1, 0, 0,
52, 1, 0, 0, 36, 1,
0, 0, 61, 1, 0, 0,
36, 1, 0, 0, 5, 0,
0, 0, 1, 0, 12, 0,
8, 0, 3, 0, 72, 1,
0, 0, 109, 97, 116, 67,
111, 108, 0, 110, 111, 114,
109, 97, 108, 77, 97, 116,
0, 171, 171, 171, 3, 0,
3, 0, 3, 0, 3, 0,
1, 0, 0, 0, 0, 0,
0, 0, 110, 117, 109, 68,
105, 114, 76, 105, 103, 104,
116, 115, 0, 171, 171, 171,
0, 0, 2, 0, 1, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 115, 117,
114, 102, 80, 114, 111, 112,
115, 0, 118, 115, 95, 50,
95, 48, 0, 77, 105, 99,
114, 111, 115, 111, 102, 116,
32, 40, 82, 41, 32, 72,
76, 83, 76, 32, 83, 104,
97, 100, 101, 114, 32, 67,
111, 109, 112, 105, 108, 101,
114, 32, 57, 46, 50, 57,
46, 57, 53, 50, 46, 51,
49, 49, 49, 0, 171, 171,
81, 0, 0, 5, 4, 0,
15, 160, 0, 0, 64, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
81, 0, 0, 5, 5, 0,
15, 160, 0, 0, 0, 0,
0, 0, 0, 128, 0, 0,
128, 191, 0, 0, 128, 63,
31, 0, 0, 2, 0, 0,
0, 128, 0, 0, 15, 144,
31, 0, 0, 2, 3, 0,
0, 128, 1, 0, 15, 144,
31, 0, 0, 2, 5, 0,
0, 128, 2, 0, 15, 144,
31, 0, 0, 2, 10, 0,
0, 128, 3, 0, 15, 144,
5, 0, 0, 3, 0, 0,
15, 128, 0, 0, 85, 144,
1, 0, 228, 160, 4, 0,
0, 4, 0, 0, 15, 128,
0, 0, 228, 160, 0, 0,
0, 144, 0, 0, 228, 128,
4, 0, 0, 4, 0, 0,
15, 128, 2, 0, 228, 160,
0, 0, 170, 144, 0, 0,
228, 128, 4, 0, 0, 4,
0, 0, 15, 192, 3, 0,
228, 160, 0, 0, 255, 144,
0, 0, 228, 128, 5, 0,
0, 3, 0, 0, 7, 128,
1, 0, 85, 144, 9, 0,
228, 160, 4, 0, 0, 4,
0, 0, 7, 128, 8, 0,
228, 160, 1, 0, 0, 144,
0, 0, 228, 128, 4, 0,
0, 4, 0, 0, 7, 128,
10, 0, 228, 160, 1, 0,
170, 144, 0, 0, 228, 128,
1, 0, 0, 2, 1, 0,
1, 128, 5, 0, 0, 160,
12, 0, 0, 3, 0, 0,
8, 128, 1, 0, 0, 128,
13, 0, 255, 160, 2, 0,
0, 3, 1, 0, 15, 128,
3, 0, 228, 144, 5, 0,
149, 160, 4, 0, 0, 4,
1, 0, 15, 128, 0, 0,
255, 128, 1, 0, 228, 128,
5, 0, 192, 160, 1, 0,
0, 2, 2, 0, 1, 128,
13, 0, 0, 160, 4, 0,
0, 4, 2, 0, 7, 128,
14, 0, 228, 160, 2, 0,
0, 128, 1, 0, 228, 128,
1, 0, 0, 2, 1, 0,
7, 128, 2, 0, 228, 128,
1, 0, 0, 2, 0, 0,
8, 128, 5, 0, 0, 160,
38, 0, 0, 1, 0, 0,
228, 240, 2, 0, 0, 3,
2, 0, 8, 128, 0, 0,
255, 128, 15, 0, 0, 160,
5, 0, 0, 3, 2, 0,
8, 128, 2, 0, 255, 128,
4, 0, 0, 160, 46, 0,
0, 2, 0, 0, 1, 176,
2, 0, 255, 128, 8, 0,
0, 4, 2, 0, 8, 128,
0, 0, 228, 128, 18, 32,
228, 161, 0, 0, 0, 176,
11, 0, 0, 3, 2, 0,
8, 128, 2, 0, 255, 128,
5, 0, 0, 160, 5, 0,
0, 4, 3, 0, 7, 128,
2, 0, 255, 128, 16, 32,
228, 160, 0, 0, 0, 176,
4, 0, 0, 4, 1, 0,
7, 128, 3, 0, 228, 128,
13, 0, 170, 160, 1, 0,
228, 128, 2, 0, 0, 3,
0, 0, 8, 128, 0, 0,
255, 128, 5, 0, 255, 160,
39, 0, 0, 0, 11, 0,
0, 3, 0, 0, 15, 128,
1, 0, 228, 128, 5, 0,
0, 160, 10, 0, 0, 3,
0, 0, 15, 128, 0, 0,
228, 128, 5, 0, 255, 160,
5, 0, 0, 3, 0, 0,
15, 208, 0, 0, 228, 128,
12, 0, 228, 160, 1, 0,
0, 2, 0, 0, 3, 224,
2, 0, 228, 144, 255, 255,
0, 0
};

View File

@ -0,0 +1,37 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc /T ps_2_0 /Fh default_color_PS.h default_color_PS.hlsl
//
ps_2_0
dcl v0
mov oC0, v0
// approximately 1 instruction slot used
#endif
const BYTE g_ps20_main[] =
{
0, 2, 255, 255, 254, 255,
22, 0, 67, 84, 65, 66,
28, 0, 0, 0, 35, 0,
0, 0, 0, 2, 255, 255,
0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0,
28, 0, 0, 0, 112, 115,
95, 50, 95, 48, 0, 77,
105, 99, 114, 111, 115, 111,
102, 116, 32, 40, 82, 41,
32, 72, 76, 83, 76, 32,
83, 104, 97, 100, 101, 114,
32, 67, 111, 109, 112, 105,
108, 101, 114, 32, 57, 46,
50, 57, 46, 57, 53, 50,
46, 51, 49, 49, 49, 0,
31, 0, 0, 2, 0, 0,
0, 128, 0, 0, 15, 144,
1, 0, 0, 2, 0, 8,
15, 128, 0, 0, 228, 144,
255, 255, 0, 0
};

View File

@ -0,0 +1,10 @@
struct VS_out {
float4 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
float4 Color : COLOR0;
};
float4 main(VS_out input) : COLOR
{
return input.Color;
}

View File

@ -0,0 +1,71 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
// fxc /T ps_2_0 /Fh default_color_tex_PS.h default_color_tex_PS.hlsl
//
//
// Parameters:
//
// sampler2D tex0;
//
//
// Registers:
//
// Name Reg Size
// ------------ ----- ----
// tex0 s0 1
//
ps_2_0
dcl t0.xy
dcl v0
dcl_2d s0
texld r0, t0, s0
mul r0, r0, v0
mov oC0, r0
// approximately 3 instruction slots used (1 texture, 2 arithmetic)
#endif
const BYTE g_ps20_main[] =
{
0, 2, 255, 255, 254, 255,
33, 0, 67, 84, 65, 66,
28, 0, 0, 0, 79, 0,
0, 0, 0, 2, 255, 255,
1, 0, 0, 0, 28, 0,
0, 0, 0, 1, 0, 0,
72, 0, 0, 0, 48, 0,
0, 0, 3, 0, 0, 0,
1, 0, 2, 0, 56, 0,
0, 0, 0, 0, 0, 0,
116, 101, 120, 48, 0, 171,
171, 171, 4, 0, 12, 0,
1, 0, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0,
112, 115, 95, 50, 95, 48,
0, 77, 105, 99, 114, 111,
115, 111, 102, 116, 32, 40,
82, 41, 32, 72, 76, 83,
76, 32, 83, 104, 97, 100,
101, 114, 32, 67, 111, 109,
112, 105, 108, 101, 114, 32,
57, 46, 50, 57, 46, 57,
53, 50, 46, 51, 49, 49,
49, 0, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
3, 176, 31, 0, 0, 2,
0, 0, 0, 128, 0, 0,
15, 144, 31, 0, 0, 2,
0, 0, 0, 144, 0, 8,
15, 160, 66, 0, 0, 3,
0, 0, 15, 128, 0, 0,
228, 176, 0, 8, 228, 160,
5, 0, 0, 3, 0, 0,
15, 128, 0, 0, 228, 128,
0, 0, 228, 144, 1, 0,
0, 2, 0, 8, 15, 128,
0, 0, 228, 128, 255, 255,
0, 0
};

View File

@ -0,0 +1,13 @@
struct VS_out {
float4 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
float4 Color : COLOR0;
};
sampler2D tex0 : register(s0);
float4 main(VS_out input) : COLOR
{
return tex2D(tex0, input.TexCoord0.xy) * input.Color;
}

View File

@ -0,0 +1,25 @@
float4x4 combinedMat : register(c0);
struct VS_in
{
float4 Position : POSITION;
float2 TexCoord : TEXCOORD0;
float4 Color : COLOR0;
};
struct VS_out {
float4 Position : POSITION;
float2 TexCoord0 : TEXCOORD0;
float4 Color : COLOR0;
};
VS_out main(in VS_in input)
{
VS_out output;
output.Position = mul(combinedMat, input.Position);
output.TexCoord0 = input.TexCoord;
output.Color = input.Color;
return output;
}

View File

@ -0,0 +1,39 @@
struct Light
{
float4 color; // and radius
float4 position; // and -cos(angle)
float4 direction; // and falloff clamp
};
float3 DoDirLight(Light L, float3 N)
{
float l = max(0.0, dot(N, -L.direction.xyz));
return l*L.color.xyz;
}
float3 DoPointLight(Light L, float3 V, float3 N)
{
// As on PS2
float3 dir = V - L.position.xyz;
float dist = length(dir);
float atten = max(0.0, (1.0 - dist/L.color.w));
float l = max(0.0, dot(N, -normalize(dir)));
return l*L.color.xyz*atten;
}
float3 DoSpotLight(Light L, float3 V, float3 N)
{
// As on PS2
float3 dir = V - L.position.xyz;
float dist = length(dir);
float atten = max(0.0, (1.0 - dist/L.color.w));
dir /= dist;
float l = max(0.0, dot(N, -dir));
float pcos = dot(dir, L.direction.xyz); // cos to point
float ccos = -L.position.w; // cos of cone
float falloff = (pcos-ccos)/(1.0-ccos);
if(falloff < 0) // outside of cone
l = 0;
l *= max(falloff, L.direction.w); // falloff clamp
return l*L.color.xyz*atten;
}

7
src/d3d/shaders/make.cmd Normal file
View File

@ -0,0 +1,7 @@
@echo off
"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /T vs_2_0 /Fh default_amb_VS.h defaultVS.hlsl
"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /T vs_2_0 /DDIRECTIONALS /Fh default_amb_dir_VS.h defaultVS.hlsl
"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /T vs_2_0 /DDIRECTIONALS /DPOINTLIGHTS /DSPOTLIGHTS /Fh default_all_VS.h defaultVS.hlsl
"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /T ps_2_0 /Fh default_color_PS.h default_color_PS.hlsl
"%DXSDK_DIR%\utilities\bin\x86\fxc.exe" /T ps_2_0 /Fh default_color_tex_PS.h default_color_tex_PS.hlsl

View File

@ -163,6 +163,7 @@ MatFX::setBumpTexture(Texture *t)
if(this->fx[i].bump.tex) if(this->fx[i].bump.tex)
this->fx[i].bump.tex->destroy(); this->fx[i].bump.tex->destroy();
this->fx[i].bump.tex = t; this->fx[i].bump.tex = t;
if(t)
t->refCount++; t->refCount++;
} }
} }
@ -201,6 +202,7 @@ MatFX::setEnvTexture(Texture *t)
if(this->fx[i].env.tex) if(this->fx[i].env.tex)
this->fx[i].env.tex->destroy(); this->fx[i].env.tex->destroy();
this->fx[i].env.tex = t; this->fx[i].env.tex = t;
if(t)
t->refCount++; t->refCount++;
} }
} }
@ -257,6 +259,7 @@ MatFX::setDualTexture(Texture *t)
if(this->fx[i].dual.tex) if(this->fx[i].dual.tex)
this->fx[i].dual.tex->destroy(); this->fx[i].dual.tex->destroy();
this->fx[i].dual.tex = t; this->fx[i].dual.tex = t;
if(t)
t->refCount++; t->refCount++;
} }
} }

View File

@ -135,6 +135,8 @@ struct VideoMode
uint32 flags; uint32 flags;
}; };
struct Camera;
struct World;
// This is for platform independent things // This is for platform independent things
// TODO: move more stuff into this // TODO: move more stuff into this
@ -146,8 +148,8 @@ struct Engine
Opened, Opened,
Started Started
}; };
void *currentCamera; Camera *currentCamera;
void *currentWorld; World *currentWorld;
LinkList frameDirtyList; LinkList frameDirtyList;
// Dynamically allocated because of plugins // Dynamically allocated because of plugins

View File

@ -734,6 +734,7 @@ struct Clump
// used by enumerateLights for lighting callback // used by enumerateLights for lighting callback
struct WorldLights struct WorldLights
{ {
int32 numAmbients;
RGBAf ambient; // all ambients added RGBAf ambient; // all ambients added
int32 numDirectionals; int32 numDirectionals;
Light **directionals; // only directionals Light **directionals; // only directionals

View File

@ -149,6 +149,7 @@ World::enumerateLights(Atomic *atomic, WorldLights *lightData)
lightData->numDirectionals = 0; lightData->numDirectionals = 0;
lightData->numLocals = 0; lightData->numLocals = 0;
lightData->numAmbients = 0;
lightData->ambient.red = 0.0f; lightData->ambient.red = 0.0f;
lightData->ambient.green = 0.0f; lightData->ambient.green = 0.0f;
lightData->ambient.blue = 0.0f; lightData->ambient.blue = 0.0f;
@ -164,6 +165,7 @@ World::enumerateLights(Atomic *atomic, WorldLights *lightData)
lightData->ambient.red += l->color.red; lightData->ambient.red += l->color.red;
lightData->ambient.green += l->color.green; lightData->ambient.green += l->color.green;
lightData->ambient.blue += l->color.blue; lightData->ambient.blue += l->color.blue;
lightData->numAmbients++;
}else if(normals && l->getType() == Light::DIRECTIONAL){ }else if(normals && l->getType() == Light::DIRECTIONAL){
if(lightData->numDirectionals < maxDirectionals) if(lightData->numDirectionals < maxDirectionals)
lightData->directionals[lightData->numDirectionals++] = l; lightData->directionals[lightData->numDirectionals++] = l;