bool c_gbuffer::SetEffectVar(LPD3DXEFFECT& effect, bool& variable_used, cstring texture_semantic, Render::s_render_target& target, cstring x_handle_semantic, const int x_index, cstring y_handle_semantic, const int y_index, cstring z_handle_semantic, const int z_index, cstring w_handle_semantic, const int w_index) { variable_used = false; if(!effect) return false; //find the intended texture handle D3DXHANDLE tex_handle = effect->GetParameterBySemantic(NULL, texture_semantic); variable_used = (tex_handle != NULL) ? true : false; if(!tex_handle) return true; else if(tex_handle && !target.IsEnabled()) return false; // set the texture variable effect->SetTexture(tex_handle, target.texture); // search for the index variables handles // then set them to the indices for the intended data D3DXHANDLE index_handle = NULL; if(x_handle_semantic) { index_handle = effect->GetParameterBySemantic(NULL, x_handle_semantic); if(!index_handle) return false; effect->SetInt(index_handle, x_index); } if(y_handle_semantic) { index_handle = effect->GetParameterBySemantic(NULL, y_handle_semantic); if(!index_handle) return false; effect->SetInt(index_handle, y_index); } if(z_handle_semantic) { index_handle = effect->GetParameterBySemantic(NULL, z_handle_semantic); if(!index_handle) return false; effect->SetInt(index_handle, z_index); } if(w_handle_semantic) { index_handle = effect->GetParameterBySemantic(NULL, w_handle_semantic); if(!index_handle) return false; effect->SetInt(index_handle, w_index); } return true; }
//************************************************************************************************************* void Star() { tmpvert[6] = tmpvert[24] = tmpvert[30] = (float)screenwidth / 4.0f - 0.5f; tmpvert[13] = tmpvert[19] = tmpvert[31] = (float)screenheight / 4.0f - 0.5f; texelsize.x = 4.0f / (float)screenwidth; texelsize.y = 4.0f / (float)screenheight; hdreffect->SetTechnique("star"); hdreffect->SetVector("texelsize", &texelsize); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); for( int i = 0; i < 4; ++i ) { hdreffect->SetInt("stardir", i); for( int j = 0; j < 3; ++j ) { int ind = (j % 2); device->SetRenderTarget(0, starsurfaces[i][ind]); device->SetTexture(0, (j == 0 ? dstargets[1] : startargets[i][1 - ind])); hdreffect->SetInt("starpass", j); hdreffect->CommitChanges(); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } } hdreffect->EndPass(); hdreffect->End(); // combine star textures hdreffect->SetTechnique("starcombine"); device->SetRenderTarget(0, blursurfaces[1]); device->SetTexture(0, startargets[0][0]); device->SetTexture(1, startargets[1][0]); device->SetTexture(2, startargets[2][0]); device->SetTexture(3, startargets[3][0]); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); }
void MaskTextureLevel(LPDIRECT3DTEXTURE9 tex, int level, int x, int y, int w, int h, float minMask, float maxMask, int maskValue) { LPD3DXEFFECT effect = LoadEffect("utils.fx"); if (effect == NULL) return; CGame2D* g2d = Get2D(); effect->SetTexture("g_Image", tex); effect->SetFloat("g_Level", (float) level); effect->SetFloat("g_MinMask", minMask); effect->SetFloat("g_MaxMask", maxMask); effect->SetInt("g_Mask", maskValue); effect->SetTechnique("MaskTexture"); DX_BEGIN_EFFECT(effect); g2d->DrawRect(x, y, w, h, 0xFFFFFFFF); DX_END_EFFECT(effect); }
void sc_lights_initSun(SC_SCREEN* screen) { if(sun_color.red == 0 && sun_color.green == 0 && sun_color.blue == 0) return; //create materials screen.materials.sun = mtl_create(); if(screen.settings.lights.sunShadows == 0) effect_load(screen.materials.sun, sc_lights_sMaterialSun); else effect_load(screen.materials.sun, sc_lights_sMaterialSunShadow); screen.materials.sun.skin1 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; //point to gBuffer: normals and depth //screen.materials.sun.skin2 = ObjData.light.projMap; //projection map //screen.materials.sun.skin3 = ObjData.light.shadowMap; //shadowmap screen.materials.sun.skin4 = screen.renderTargets.gBuffer[SC_GBUFFER_MATERIAL_DATA]; //point to gBuffer: brdf data screen.materials.sun.SC_SKILL = screen; set(screen.materials.sun, ENABLE_VIEW); screen.materials.sun.event = sc_lights_MaterialEventSun; //setup views screen.views.sun = view_create(-997); set(screen.views.sun, PROCESS_TARGET); set(screen.views.sun, UNTOUCHABLE); set(screen.views.sun, NOSHADOW); reset(screen.views.sun, AUDIBLE); set(screen.views.sun, NOPARTICLE); set(screen.views.sun, NOSKY); set(screen.views.sun, CHILD); set(screen.views.sun, NOFLAG1); screen.views.sun.size_x = screen.views.main.size_x; screen.views.sun.size_y = screen.views.main.size_y; screen.views.sun.material = screen.materials.sun; screen.views.sun.bmap = screen.renderTargets.full0; #ifndef SC_A7 //PSSM SHADOWS if(screen.settings.lights.sunShadows == 1) { sun_angle.roll = 1.1*maxv(vec_length(level_ent->max_x),vec_length(level_ent->min_x)); //screen.renderTargets.sunShadowDepth = bmap_createblack(screen.settings.lights.sunShadowResolution, screen.settings.lights.sunShadowResolution, 12222); //screen.materials.sun.skin3 = screen.renderTargets.sunShadowDepth; int i = 0; for(i=0; i<screen.settings.lights.sunPssmSplits; i++) { screen.views.sunShadowDepth[i] = view_create(-800); #ifndef SC_A7 screen.views.sunShadowDepth[i].bg = pixel_for_vec(COLOR_WHITE,0,8888); #endif screen.views.sunShadowDepth[i].lod = shadow_lod; /* //set shadowview flags set(screen.views.sunShadowDepth[i], SHOW); reset(screen.views.sunShadowDepth[i], AUDIBLE); set(screen.views.sunShadowDepth[i], UNTOUCHABLE); set(screen.views.sunShadowDepth[i], NOSHADOW); set(screen.views.sunShadowDepth[i], SHADOW); set(screen.views.sunShadowDepth[i], NOPARTICLE); set(screen.views.sunShadowDepth[i], ISOMETRIC); //set(screen.views.sunShadowDepth[i], CULL_CW); #ifdef SC_USE_NOFLAG1 set(screen.views.sunShadowDepth[i], NOFLAG1); #endif */ screen.views.sunShadowDepth[i]->flags |= SHOW|UNTOUCHABLE|NOSHADOW|NOPARTICLE|NOLOD|NOSKY|ISOMETRIC|SHADOW|NOFLAG1; //create rendertarget screen.renderTargets.sunShadowDepth[i] = bmap_createblack(screen.settings.lights.sunShadowResolution, screen.settings.lights.sunShadowResolution, 14); /* //BLUR SHADOWMAP (ESM SHADOWS ONLY) if(i < screen.settings.lights.sunPssmBlurSplits) { //assign rendertarget //screen.views.sunShadowDepth[i].bmap = screen.renderTargets.sunShadowDepth[i]; screen.views.sunShadowDepth[i].bmap = bmap_createblack(screen.settings.lights.sunShadowResolution, screen.settings.lights.sunShadowResolution, 14); //blur light depthmap VIEW* blurView = view_create(-799); blurView.size_x = screen.settings.lights.sunShadowResolution; blurView.size_y = screen.settings.lights.sunShadowResolution; set(blurView, CHILD); set(blurView, PROCESS_TARGET); screen.views.sunShadowDepth[i].stage = blurView; blurView.bmap = screen.renderTargets.sunShadowDepth[i]; blurView.material = mtl_create(); effect_load(blurView.material, sc_lights_sMaterialShadowmapBlur); //blurView.material.skill1 = floatv((float)(2.25-i)/(float)screen.settings.lights.sunShadowResolution); if(i==0) blurView.material.skill1 = floatv((float)(1.5)/(float)screen.settings.lights.sunShadowResolution); if(i==1) blurView.material.skill1 = floatv((float)(0.75)/(float)screen.settings.lights.sunShadowResolution); if(i==2) blurView.material.skill1 = floatv((float)(0.25)/(float)screen.settings.lights.sunShadowResolution); if(i==3) blurView.material.skill1 = floatv((float)(0.125)/(float)screen.settings.lights.sunShadowResolution); // } else { screen.views.sunShadowDepth[i].bmap = screen.renderTargets.sunShadowDepth[i]; } */ screen.views.sunShadowDepth[i].bmap = screen.renderTargets.sunShadowDepth[i]; //create material screen.views.sunShadowDepth[i].material = mtl_create(); switch(i){ case 0: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit1); break; case 1: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit2); break; case 2: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit3); break; case 3: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit4); break; default: break; } //pass number of splits to sun shader screen.materials.sun.skill13 = floatv(screen.settings.lights.sunPssmSplits); } if(sc_materials_zbuffer!=NULL){ bmap_purge(sc_materials_zbuffer); ptr_remove(sc_materials_zbuffer); sc_materials_zbuffer=NULL; } sc_materials_zbuffer=bmap_createblack(maxv(screen_size.x,screen.settings.lights.sunShadowResolution),maxv(screen_size.y,screen.settings.lights.sunShadowResolution),32); bmap_zbuffer(sc_materials_zbuffer); //add shadow edge masking + expanding to accelerate pcf shadows //setup views screen.views.sunEdge = view_create(-997); set(screen.views.sunEdge, PROCESS_TARGET); set(screen.views.sunEdge, UNTOUCHABLE); set(screen.views.sunEdge, NOSHADOW); reset(screen.views.sunEdge, AUDIBLE); set(screen.views.sunEdge, NOPARTICLE); set(screen.views.sunEdge, NOSKY); set(screen.views.sunEdge, CHILD|NOFLAG1); screen.views.sunEdge.size_x = screen.views.main.size_x/4; screen.views.sunEdge.size_y = screen.views.main.size_y/4; screen.views.sunEdge.bmap = screen.renderTargets.quarter0;//bmap_createblack(screen.views.main.size_x/4, screen.views.main.size_y/4, 32);//screen.renderTargets.quarter0; screen.views.sunEdge.material = mtl_create(); effect_load(screen.views.sunEdge.material, sc_lights_sMaterialSunShadowEdge); screen.views.sunEdge.material.skin1 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.views.sunEdge.material.skill8 = floatv(screen.views.main.clip_far); screen.views.sunEdge.material.skill13 = floatv(screen.settings.lights.sunPssmSplits); LPD3DXEFFECT fx = screen.views.sunEdge->material->d3deffect; if(fx) { fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); fx->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } set(screen.views.sunEdge.material, ENABLE_VIEW); screen.views.sunEdge.material.event = sc_lights_MaterialEventSun; //expander screen.views.sunExpand = view_create(-997); set(screen.views.sunExpand, PROCESS_TARGET); set(screen.views.sunExpand, UNTOUCHABLE); set(screen.views.sunExpand, NOSHADOW); reset(screen.views.sunExpand, AUDIBLE); set(screen.views.sunExpand, NOPARTICLE); set(screen.views.sunExpand, NOSKY); set(screen.views.sunExpand, CHILD|NOFLAG1); screen.views.sunExpand.size_x = screen.views.main.size_x/8; screen.views.sunExpand.size_y = screen.views.main.size_y/8; screen.views.sunExpand.bmap = screen.renderTargets.eighth0;//bmap_createblack(screen.views.main.size_x/8, screen.views.main.size_y/8, 32);//screen.renderTargets.quarter0; screen.views.sunExpand.material = mtl_create(); effect_load(screen.views.sunExpand.material, sc_lights_sMaterialSunShadowExpand); screen.views.sunExpand.material.skin1 = screen.renderTargets.quarter0; set(screen.views.sunExpand.material, ENABLE_VIEW); screen.views.sunExpand.material.event = sc_lights_MaterialEventSun; //shadow screen.views.sunShadow = view_create(-997); set(screen.views.sunShadow, PROCESS_TARGET); set(screen.views.sunShadow, UNTOUCHABLE); set(screen.views.sunShadow, NOSHADOW); reset(screen.views.sunShadow, AUDIBLE); set(screen.views.sunShadow, NOPARTICLE); set(screen.views.sunShadow, NOSKY); set(screen.views.sunShadow, CHILD|NOFLAG1); screen.views.sunShadow.size_x = screen.views.main.size_x; screen.views.sunShadow.size_y = screen.views.main.size_y; screen.views.sunShadow.bmap = screen.renderTargets.full1;//bmap_createblack(screen.views.main.size_x/4, screen.views.main.size_y/4, 32);//screen.renderTargets.quarter0; screen.views.sunShadow.material = mtl_create(); effect_load(screen.views.sunShadow.material, sc_lights_sMaterialSunShadowCreate); screen.views.sunShadow.material.skin1 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.views.sunShadow.material.skin2 = screen.renderTargets.eighth0; screen.views.sunShadow.material.skill4 = floatv(screen.views.sunShadowDepth[0].clip_far); screen.views.sunShadow.material.skill8 = floatv(screen.views.main.clip_far); screen.views.sunShadow.material.skill13 = floatv(screen.settings.lights.sunPssmSplits); LPD3DXEFFECT fx = screen.views.sunShadow->material->d3deffect; if(fx) { fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); fx->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } set(screen.views.sunShadow.material, ENABLE_VIEW); screen.views.sunShadow.material.event = sc_lights_MaterialEventSun; //set stages screen.views.sunEdge.stage = screen.views.sunExpand; screen.views.sunExpand.stage = screen.views.sunShadow; screen.views.sunShadow.stage = screen.views.sun; } #endif //------------ //apply sun to camera VIEW* view_last; view_last = screen.views.gBuffer; while(view_last.stage != NULL) { view_last = view_last.stage; } #ifndef SC_A7 //PSSM SHADOWS are supported if(screen.settings.lights.sunShadows == 1) { view_last.stage = screen.views.sunEdge; } else { view_last.stage = screen.views.sun; } #else view_last.stage = screen.views.sun; #endif }
void sc_lights_MaterialEventSun() { SC_SCREEN* screen = (SC_SCREEN*)(mtl.SC_SKILL); if(screen == NULL) return; switch(render_view) { case screen.views.sunEdge: screen.views.sunEdge.bmap = screen.renderTargets.quarter0; break; case screen.views.sunExpand: screen.views.sunExpand.bmap = screen.renderTargets.eighth0; break; case screen.views.sunShadow: screen.views.sunShadow.bmap = screen.renderTargets.full1; break; case screen.views.sun: screen.views.sun.bmap = screen.renderTargets.full0; //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #ifndef SC_A7 LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #else LPD3DXEFFECT pEffect = (LPD3DXEFFECT)render_d3dxeffect; #endif //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)(mtl->d3deffect); if(pEffect != NULL) { pEffect->SetVector("frustumPoints", screen.frustumPoints); //pEffect->SetFloat("clipFar", screen.views.main.clip_far); pEffect->SetTexture("texBRDFLut", sc_deferredLighting_texBRDFLUT); //assign volumetric brdf lut pEffect->SetTexture("texMaterialLUT", sc_materials_mapData.d3dtex); pEffect->SetTexture("texShadowMask", screen.renderTargets.eighth0.d3dtex); pEffect->SetTexture("texShadowSun", screen.renderTargets.full1.d3dtex); pEffect->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); pEffect->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } break; default: break; } /* if(render_view == screen.views.sun) { screen.views.sun.bmap = screen.renderTargets.full0; //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #ifndef SC_A7 LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #else LPD3DXEFFECT pEffect = (LPD3DXEFFECT)render_d3dxeffect; #endif //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)(mtl->d3deffect); if(pEffect != NULL) { pEffect->SetVector("frustumPoints", screen.frustumPoints); //pEffect->SetFloat("clipFar", screen.views.main.clip_far); pEffect->SetTexture("texBRDFLut", sc_deferredLighting_texBRDFLUT); //assign volumetric brdf lut pEffect->SetTexture("texMaterialLUT", sc_materials_mapData.d3dtex); pEffect->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); pEffect->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } } */ }