mirror of
https://github.com/aap/librw.git
synced 2025-12-20 09:29:49 +00:00
various changes
This commit is contained in:
@@ -421,6 +421,16 @@ rasterNumLevels(Raster *raster)
|
||||
void
|
||||
rasterFromImage(Raster *raster, Image *image)
|
||||
{
|
||||
// Unpalettize image if necessary but don't change original
|
||||
Image *truecolimg = nil;
|
||||
if(image->depth <= 8 && !isP8supported){
|
||||
truecolimg = Image::create(image->width, image->height, image->depth);
|
||||
truecolimg->pixels = image->pixels;
|
||||
truecolimg->palette = image->palette;
|
||||
truecolimg->unindex();
|
||||
image = truecolimg;
|
||||
}
|
||||
|
||||
int32 format;
|
||||
D3dRaster *natras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
|
||||
switch(image->depth){
|
||||
@@ -502,6 +512,9 @@ rasterFromImage(Raster *raster, Image *image)
|
||||
break;
|
||||
}
|
||||
raster->unlock(0);
|
||||
|
||||
if(truecolimg)
|
||||
truecolimg->destroy();
|
||||
}
|
||||
|
||||
Image*
|
||||
|
||||
@@ -435,15 +435,22 @@ Raster*
|
||||
readAsImage(Stream *stream, int32 width, int32 height, int32 depth, int32 format, int32 numLevels)
|
||||
{
|
||||
uint8 palette[256*4];
|
||||
int32 pallen = 0;
|
||||
uint8 *data = nil;
|
||||
|
||||
Image *img = Image::create(width, height, 32);
|
||||
img->allocate();
|
||||
|
||||
if(format & Raster::PAL4)
|
||||
if(format & Raster::PAL4){
|
||||
pallen = 16;
|
||||
stream->read(palette, 4*32);
|
||||
else if(format & Raster::PAL8)
|
||||
}else if(format & Raster::PAL8){
|
||||
pallen = 256;
|
||||
stream->read(palette, 4*256);
|
||||
}
|
||||
if(!Raster::formatHasAlpha(format))
|
||||
for(int32 i = 0; i < pallen; i++)
|
||||
palette[i*4+3] = 0xFF;
|
||||
|
||||
// Only read one mipmap
|
||||
for(int32 i = 0; i < numLevels; i++){
|
||||
|
||||
@@ -533,6 +533,7 @@ defaultUninstanceCB(Geometry *geo, InstanceDataHeader *header)
|
||||
uint8 *verts[2];
|
||||
verts[0] = lockVertices(header->vertexStream[0].vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||
verts[1] = lockVertices(header->vertexStream[1].vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||
getDeclaration(header->vertexDeclaration, dcl);
|
||||
|
||||
int i;
|
||||
for(i = 0; dcl[i].usage != D3DDECLUSAGE_POSITION || dcl[i].usageIndex != 0; i++)
|
||||
|
||||
@@ -23,11 +23,15 @@ void
|
||||
defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
{
|
||||
RawMatrix world;
|
||||
|
||||
d3d::lightingCB();
|
||||
|
||||
Geometry *geo = atomic->geometry;
|
||||
d3d::setRenderState(D3DRS_LIGHTING, !!(geo->flags & rw::Geometry::LIGHT));
|
||||
|
||||
int lighting = !!(geo->flags & rw::Geometry::LIGHT);
|
||||
if(lighting)
|
||||
d3d::lightingCB();
|
||||
else
|
||||
return;
|
||||
|
||||
d3d::setRenderState(D3DRS_LIGHTING, lighting);
|
||||
|
||||
Frame *f = atomic->getFrame();
|
||||
convMatrix(&world, f->getLTM());
|
||||
@@ -42,12 +46,14 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
for(uint32 i = 0; i < header->numMeshes; i++){
|
||||
d3d::setTexture(0, inst->material->texture);
|
||||
d3d::setMaterial(inst->material);
|
||||
|
||||
d3d::setRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
|
||||
d3d::setRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
|
||||
if(geo->flags & Geometry::PRELIT)
|
||||
d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_COLOR1);
|
||||
else
|
||||
d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
|
||||
|
||||
d3d::flushCache();
|
||||
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)header->primType, inst->baseIndex,
|
||||
0, inst->numVertices,
|
||||
|
||||
@@ -328,6 +328,31 @@ setTexture(uint32 stage, Texture *tex)
|
||||
setRasterStage(stage, tex->raster);
|
||||
}
|
||||
|
||||
void
|
||||
setD3dMaterial(D3DMATERIAL9 *mat9)
|
||||
{
|
||||
if(d3dmaterial.Diffuse.r != mat9->Diffuse.r ||
|
||||
d3dmaterial.Diffuse.g != mat9->Diffuse.g ||
|
||||
d3dmaterial.Diffuse.b != mat9->Diffuse.b ||
|
||||
d3dmaterial.Diffuse.a != mat9->Diffuse.a ||
|
||||
d3dmaterial.Ambient.r != mat9->Ambient.r ||
|
||||
d3dmaterial.Ambient.g != mat9->Ambient.g ||
|
||||
d3dmaterial.Ambient.b != mat9->Ambient.b ||
|
||||
d3dmaterial.Ambient.a != mat9->Ambient.a ||
|
||||
d3dmaterial.Specular.r != mat9->Specular.r ||
|
||||
d3dmaterial.Specular.g != mat9->Specular.g ||
|
||||
d3dmaterial.Specular.b != mat9->Specular.b ||
|
||||
d3dmaterial.Specular.a != mat9->Specular.a ||
|
||||
d3dmaterial.Emissive.r != mat9->Emissive.r ||
|
||||
d3dmaterial.Emissive.g != mat9->Emissive.g ||
|
||||
d3dmaterial.Emissive.b != mat9->Emissive.b ||
|
||||
d3dmaterial.Emissive.a != mat9->Emissive.a ||
|
||||
d3dmaterial.Power != mat9->Power){
|
||||
d3ddevice->SetMaterial(mat9);
|
||||
d3dmaterial = *mat9;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
setMaterial(Material *mat)
|
||||
{
|
||||
@@ -346,17 +371,7 @@ setMaterial(Material *mat)
|
||||
mat9.Power = 0.0f;
|
||||
mat9.Emissive = black;
|
||||
mat9.Specular = black;
|
||||
if(d3dmaterial.Diffuse.r != mat9.Diffuse.r ||
|
||||
d3dmaterial.Diffuse.g != mat9.Diffuse.g ||
|
||||
d3dmaterial.Diffuse.b != mat9.Diffuse.b ||
|
||||
d3dmaterial.Diffuse.a != mat9.Diffuse.a ||
|
||||
d3dmaterial.Ambient.r != mat9.Ambient.r ||
|
||||
d3dmaterial.Ambient.g != mat9.Ambient.g ||
|
||||
d3dmaterial.Ambient.b != mat9.Ambient.b ||
|
||||
d3dmaterial.Ambient.a != mat9.Ambient.a){
|
||||
d3ddevice->SetMaterial(&mat9);
|
||||
d3dmaterial = mat9;
|
||||
}
|
||||
setD3dMaterial(&mat9);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -599,14 +614,20 @@ initD3D(void)
|
||||
// setTextureStageState(0, D3DTSS_COLOROP, D3DTA_CONSTANT);
|
||||
|
||||
// Save the current states
|
||||
for(s = 0; s < MAXNUMSTATES; s++)
|
||||
for(s = 0; s < MAXNUMSTATES; s++){
|
||||
d3ddevice->GetRenderState((D3DRENDERSTATETYPE)s, (DWORD*)&d3dStates[s]);
|
||||
stateCache[s].value = d3dStates[s];
|
||||
}
|
||||
for(t = 0; t < MAXNUMSTATES; t++)
|
||||
for(s = 0; s < MAXNUMSTAGES; s++)
|
||||
for(s = 0; s < MAXNUMSTAGES; s++){
|
||||
d3ddevice->GetTextureStageState(s, (D3DTEXTURESTAGESTATETYPE)t, (DWORD*)&d3dTextureStageStates[t][s]);
|
||||
textureStageStateCache[t][s].value = d3dTextureStageStates[t][s];
|
||||
}
|
||||
for(t = 0; t < MAXNUMSAMPLERSTATES; t++)
|
||||
for(s = 0; s < MAXNUMSTAGES; s++)
|
||||
for(s = 0; s < MAXNUMSTAGES; s++){
|
||||
d3ddevice->GetSamplerState(s, (D3DSAMPLERSTATETYPE)t, (DWORD*)&d3dSamplerStates[t][s]);
|
||||
d3dSamplerStates[t][s] = d3dSamplerStates[t][s];
|
||||
}
|
||||
|
||||
openIm2D();
|
||||
openIm3D();
|
||||
|
||||
@@ -44,6 +44,8 @@ lightingCB(void)
|
||||
// only unpositioned lights right now
|
||||
FORLIST(lnk, world->directionalLights){
|
||||
Light *l = Light::fromWorld(lnk);
|
||||
if((l->getFlags() & Light::LIGHTATOMICS) == 0)
|
||||
continue;
|
||||
if(l->getType() == Light::DIRECTIONAL){
|
||||
if(n >= MAX_LIGHTS)
|
||||
continue;
|
||||
|
||||
@@ -55,6 +55,8 @@ struct Im2DVertex
|
||||
void setV(float32 v) { this->v = v; }
|
||||
};
|
||||
|
||||
void setD3dMaterial(D3DMATERIAL9 *mat9);
|
||||
|
||||
#else
|
||||
enum {
|
||||
D3DLOCK_NOSYSLOCK = 0, // ignored
|
||||
@@ -103,6 +105,7 @@ enum {
|
||||
D3DDECLUSAGE_DEPTH, // 12
|
||||
D3DDECLUSAGE_SAMPLE, // 13
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
extern int vertFormatMap[];
|
||||
@@ -141,8 +144,8 @@ void registerNativeRaster(void);
|
||||
|
||||
void setRenderState(uint32 state, uint32 value);
|
||||
void setTextureStageState(uint32 stage, uint32 type, uint32 value);
|
||||
void flushCache(void);
|
||||
void setSamplerState(uint32 stage, uint32 type, uint32 value);
|
||||
void flushCache(void);
|
||||
|
||||
void setTexture(uint32 stage, Texture *tex);
|
||||
void setMaterial(Material *mat);
|
||||
|
||||
Reference in New Issue
Block a user