/** * Sets the center of the vignette. x = y = 0 is the center of the screen and +/- 0.5 are * the corresponding borders, whereas xy=(-0.5, -0.5) is the left upper corner and vice * versa. * * v * The relative screen coordinates of the vignette center; .z will be ignored. */ void ppVignetteSetCenter (MATERIAL* m, VECTOR* v) { if (m != NULL && v != NULL) { m->PP_VIGNETTE_MTL_CENTER_X = floatv(v->x + 0.5); m->PP_VIGNETTE_MTL_CENTER_Y = floatv(-v->y + 0.5); } }
/** * Adds an offset to the image * * offset * Offset in x and y direction, between (-1..0..+1) */ void ppImageSetMtlImgOffset (MATERIAL* m, VECTOR* offset) { if (m != NULL && offset != NULL) { m->PP_IMAGE_MTL_OFFSET_X = floatv(offset->x); m->PP_IMAGE_MTL_OFFSET_Y = floatv(offset->y); } }
/** * Updates the normalization and scaling parameters of the material's image */ void mtlPpImage_ev () { BMAP* img = mtl->PP_IMAGE_MTL_IMG; double normX, normY, scaleX, scaleY; ppImageCalcScaling(img, &normX, &normY, &scaleX, &scaleY); mtl->PP_IMAGE_MTL_NORM_X = floatv(normX); mtl->PP_IMAGE_MTL_NORM_Y = floatv(normY); mtl->PP_IMAGE_MTL_SCALE_X = floatv(scaleX); mtl->PP_IMAGE_MTL_SCALE_Y = floatv(scaleY); }
void render_rain_set_speed(VECTOR *speed) { if( RainState_singleton->fall_speed->x == speed->x && RainState_singleton->fall_speed->y == speed->y && RainState_singleton->fall_speed->z == speed->z) return; if(RainState_singleton) { vec_set(RainState_singleton->fall_speed, speed); RainState_singleton->rain->skill1 = floatv(RainState_singleton->fall_speed->x); RainState_singleton->rain->skill2 = floatv(RainState_singleton->fall_speed->y); RainState_singleton->rain->skill3 = floatv(RainState_singleton->fall_speed->z); } }
/* * void render_rain_start() * * Lets the sky rain. */ void render_rain_start() { proc_mode = PROC_LATE; if( RainState_singleton ) { RainState_singleton->state = 1 - RainState_singleton->state; int i = 0; if(RainState_singleton->state) { for(; i < RainState_singleton->depth; i++) (RainState_singleton->rain_levels)[i]->flags &= ~INVISIBLE; } while(RainState_singleton->state != 0) { for(i = 0; i < RainState_singleton->depth; i++) { vec_set(&(RainState_singleton->rain_levels)[i]->x, &camera->x); (RainState_singleton->rain_levels)[i]->skill41 = floatv(2.1); // Control visibility (0 to ~) } wait(1.0); } } }
/** * Sets the start distance of the vignette * * fStart * Start distance of the vignette as percentage, e.g. 0.3 f�E 30%. Should be inside the * screen (0 < fStart < 1). */ void ppVignetteSetStart (MATERIAL* m, var fStart) { if (m != NULL) { m->PP_VIGNETTE_MTL_START = floatv(fStart); if (m->PP_VIGNETTE_MTL_START > m->PP_VIGNETTE_MTL_END) m->PP_VIGNETTE_MTL_START = m->PP_VIGNETTE_MTL_END; } }
/** * Sets the end distance of the vignette * * fEnd * End distance of the vignette as percentage, e.g. 0.75 f�E 75%. Should be near the * border of the screen or slightly outside, e.g. 0.75 < fEnd < 1.5 */ void ppVignetteSetEnd (MATERIAL* m, var fEnd) { if (m != NULL) { m->PP_VIGNETTE_MTL_END = floatv(fEnd); if (m->PP_VIGNETTE_MTL_END < m->PP_VIGNETTE_MTL_START) m->PP_VIGNETTE_MTL_START = m->PP_VIGNETTE_MTL_END; } }
void sc_dof_frm(SC_SCREEN* screen) { if(screen.views.dof != NULL) { screen.materials.dofDownsample.skill2 = floatv(screen.views.main.clip_far); screen.materials.dofDownsample.skill3 = floatv(screen.settings.dof.focalPos); //focal plane pos screen.materials.dofDownsample.skill4 = floatv(screen.settings.dof.focalWidth); //focal plane width screen.materials.dof.skill2 = floatv(screen.views.main.clip_far); screen.materials.dof.skill3 = floatv(screen.settings.dof.focalPos); //focal plane pos screen.materials.dof.skill4 = floatv(screen.settings.dof.focalWidth); //focal plane width screen.materials.dofBlurX.skill1 = floatv(screen.settings.dof.blurX); //blur strength screen.materials.dofBlurY.skill1 = floatv(screen.settings.dof.blurY); //blur strength } }
/** * Sets the alpha * * fAlpha * Translucency of between 0...100 */ void ppGrayscaleSetAlpha (MATERIAL* m, var fAlpha) { if (m != NULL) m->PP_GRAYSCALE_MTL_ALPHA = floatv(fAlpha / 100); }
/** * Sets the alpha of the vignette. Different translucency settings are normally achieved * with broader/narrow start/end-values, but you can achieve this as well with the * provided alpha-parameter to be more flexible. * * fAlpha * Translucency of the vignette between 0...100 */ void ppVignetteSetAlpha (MATERIAL* m, var fAlpha) { if (m != NULL) m->PP_VIGNETTE_MTL_ALPHA = floatv(fAlpha / 100); }
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 }
ENTITY* sc_light_createFunc(int inType, var inRange, VECTOR* inColor, VECTOR* inPos, VECTOR* inDir, BMAP* inProjMap, var inSpotArc) { ENTITY* ent; //correct inDir //vec_set(inDir, vector(inDir.y, inDir.x, inDir.z)); //correct inSpot //if(inSpot.y > inSpot.x) inSpot.y = inSpot.x - 1; //create light model //pointlight //if(inType == SC_LIGHT_P || inType == SC_LIGHT_PS || inType == SC_LIGHT_PSC || inType == SC_LIGHT_PSCA || inType == SC_LIGHT_PC || inType == SC_LIGHT_PCA) // ent = ent_createlocal("sc_pl.mdl", inPos, sc_light_ent); //spotlight //if(inType == SC_LIGHT_S || inType == SC_LIGHT_SS) if(inType == SC_LIGHT_S_SPEC_SHADOW || inType == SC_LIGHT_S_SHADOW) ent = ent_createlocal(sc_lights_mdlPointLight, inPos, sc_light_checkSpotFrustum); else ent = ent_createlocal(sc_lights_mdlPointLight, inPos, NULL); //local light set(ent, PASSABLE); ent.flags2 |= UNTOUCHABLE; //set color sc_light_setColor(ent, inColor); //set range sc_light_setRange(ent,inRange); //set dir vec_set(ent.pan, inDir); //set position vec_set(ent.x, inPos); //set projection sc_light_setProjTex(ent, inProjMap); //clip from gBuffer sc_skill(ent, SC_OBJECT_DEPTH, -1); //#ifdef SC_USE_NOFLAG1 //set(ent, FLAG1); //#endif //set stencil reference for camera-outside-lightvolume case, so light clipping can be optimized sc_skill(ent, SC_OBJECT_LIGHT_STENCILREF, sc_lights_stencilRefCurrent); sc_lights_stencilRefCurrent += 1; if(sc_lights_stencilRefCurrent > 254) sc_lights_stencilRefCurrent = 1; //assign light material //pointlight if(inType == SC_LIGHT_P) ent.material = sc_lights_mtlPoint; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlPoint); if(inType == SC_LIGHT_P_SPEC) ent.material = sc_lights_mtlPointSpec; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlPointSpec); if(inType == SC_LIGHT_P_SPEC_PROJ) ent.material = sc_lights_mtlPointSpecProj; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlPointProj); if(inType == SC_LIGHT_P_PROJ) ent.material = sc_lights_mtlPointProj; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlPointProj); //spotlight if(inType == SC_LIGHT_S) ent.material = sc_lights_mtlSpot; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlSpot); if(inType == SC_LIGHT_S_SPEC) ent.material = sc_lights_mtlSpotSpec; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlSpotSpec); if(inType == SC_LIGHT_S_SPEC_SHADOW) ent.material = sc_lights_mtlSpotSpecShadow; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlSpotSpecShadow); if(inType == SC_LIGHT_S_SHADOW) ent.material = sc_lights_mtlSpotShadow; //sc_material(ent, SC_MATERIAL_LIGHT, sc_lights_mtlSpotShadow); //update pointlight projection matrix if( inType == SC_LIGHT_P_SPEC_PROJ || inType == SC_LIGHT_P_PROJ ) { sc_light_updatePointMtx(ent); } //set spotlight dir and cone values if( inType == SC_LIGHT_S || inType == SC_LIGHT_S_SPEC || inType == SC_LIGHT_S_SPEC_SHADOW || inType == SC_LIGHT_S_SHADOW ) { //set dir //sc_light_updateSpotDir(ent); //set spot arc sc_light_setArc(ent, inSpotArc); //update spot matrix //sc_light_updateSpotMtx(ent); //shadowcasting spotlight? if( inType == SC_LIGHT_S_SPEC_SHADOW || inType == SC_LIGHT_S_SHADOW) { //create shadowmap view VIEW* shadowView = view_create(-800); vec_set(shadowView.x, ent.x); vec_set(shadowView.pan, ent.pan); shadowView.arc = inSpotArc; shadowView.aspect = 1; shadowView.clip_near = 0; shadowView.clip_far = inRange; shadowView.size_x = 256; shadowView.size_y = 256; #ifndef SC_A7 shadowView.bg = pixel_for_vec(COLOR_WHITE,0,8888); #endif shadowView.lod = shadow_lod; //set shadowview flags set(shadowView, SHOW); reset(shadowView, AUDIBLE); set(shadowView, UNTOUCHABLE); set(shadowView, NOSHADOW); set(shadowView, SHADOW); set(shadowView, NOPARTICLE); //set(shadowView, CULL_CW); #ifdef SC_USE_NOFLAG1 set(shadowView, NOFLAG1); #endif //create shadowview material shadowView.material = mtl_create(); effect_load(shadowView.material, sc_lights_sMaterialShadowmapLocal); shadowView.material.event = sc_lights_mtlShadowmapLocalRenderEvent; set(shadowView.material,ENABLE_RENDER); set(shadowView.material,PASS_SOLID); /* shadowView.material.skill4 = floatv(inRange); shadowView.material.skill5 = ent.x; shadowView.material.skill6 = ent.y; shadowView.material.skill7 = ent.z; */ shadowView.material.skill30 = inRange; //apply shadow rendertarget #ifdef SC_CUSTOM_ZBUFFER sc_checkZBuffer(256, 256); #endif BMAP* shadowBmap = bmap_createblack(256,256,12); //bmap_to_mipmap(shadowBmap); //shadowView.bmap = shadowBmap; shadowView.bmap = bmap_createblack(256,256,12); //blur light depthmap VIEW* blurView = view_create(-799); set(blurView, CHILD); set(blurView, PROCESS_TARGET); shadowView.stage = blurView; blurView.bmap = shadowBmap; blurView.material = mtl_create(); effect_load(blurView.material, sc_lights_sMaterialShadowmapBlur); blurView.material.skill1 = floatv((float)1/(float)shadowView.size_x); // //create shadowdepth material /* MATERIAL* shadowMtl = mtl_create(); effect_load(shadowMtl, sc_lights_sMaterialShadowmapLocal); shadowMtl.event = sc_lights_mtlShadowmapLocalRenderEvent; set(shadowMtl,ENABLE_RENDER); set(shadowMtl,PASS_SOLID); shadowMtl.skill4 = floatv(inRange); shadowMtl.skill5 = ent.x; shadowMtl.skill6 = ent.y; shadowMtl.skill7 = ent.z; //apply to view shadowView.material = shadowMtl; */ sc_skill(ent, SC_OBJECT_LIGHT_SHADOWMAP, shadowBmap); sc_skill(ent, SC_OBJECT_LIGHT_VIEW, shadowView); //sc_material(ent, SC_MATERIAL_LIGHT_SHADOWMAP, shadowMtl); //sc_light_checkSpotFrustum(ent); //static lightmap //wait(10); //reset(shadowView, SHOW); //ptr_remove(shadowView); } } return ent; }
void sc_lights_frmSun(SC_SCREEN* screen) { if(screen.views.sun != NULL) { if( screen.settings.lights.sunPos.x == 0 && screen.settings.lights.sunPos.y == 0 && screen.settings.lights.sunPos.z == 0 ) //global sun { VECTOR distantSunPos; vec_for_angle(distantSunPos, sun_angle); vec_scale(distantSunPos, 9999999); screen.materials.sun.skill1 = floatv(distantSunPos.x); screen.materials.sun.skill2 = floatv(distantSunPos.y); screen.materials.sun.skill3 = floatv(distantSunPos.z); } else //local sun { screen.materials.sun.skill1 = floatv(screen.settings.lights.sunPos.x); screen.materials.sun.skill2 = floatv(screen.settings.lights.sunPos.y); screen.materials.sun.skill3 = floatv(screen.settings.lights.sunPos.z); } screen.materials.sun.skill4 = floatv(0); //local sun lightrange (not used) //sun color screen.materials.sun.skill5 = floatv(sun_color.red/255); screen.materials.sun.skill6 = floatv(sun_color.green/255); screen.materials.sun.skill7 = floatv(sun_color.blue/255); screen.materials.sun.skill8 = floatv(screen.views.main.clip_far); #ifndef SC_A7 // PSSM main loop if(screen.settings.lights.sunPssmSplits>0 && screen.settings.lights.sunShadows == 1) { // update the views _after_ the camera was updated! // proc_mode = PROC_LATE; // set up the split distances and the shadow view sc_lights_pssm_split(screen.views.main, screen.settings.lights.sunPssmSplits, screen.settings.lights.sunPssmSplitWeight, screen.settings.lights.sunShadowRange); //pssm_split(screen.views.main, screen.settings.lights.sunPssmSplits, screen.settings.lights.sunPssmSplitWeight); //pssm_viewcpy(screen.views.main, screen.views.sun); // set up the split view transformation matrices D3DXMATRIX matSplit[4]; int i=0; for(i=0; i<screen.settings.lights.sunPssmSplits; i++) { // look from the sun onto the scene screen.views.sunShadowDepth[i]->pan = 180 + sun_angle.pan; screen.views.sunShadowDepth[i]->tilt = -sun_angle.tilt; vec_set(screen.views.sunShadowDepth[i]->x,sun_pos); // calculate the split view clipping borders and transformation matrix view_to_split(screen.views.main, pssm_splitdist[i],pssm_splitdist[i+1], screen.views.sunShadowDepth[i], &matSplit[i]); LPD3DXEFFECT fx = screen.views.sunShadowDepth[i]->material->d3deffect; if(fx) fx->SetMatrix("matSplitViewProj",&matSplit[i]); // create a texture matrix from the split view proj matrix D3DXMatrixMultiply(&matSplit[i],&matSplit[i],pssm_texscale(screen.settings.lights.sunShadowResolution)); #ifdef DEBUG_PSSM DEBUG_BMAP(screen.views.sunShadowDepth[i]->bmap,300 + i*220,0.2); var pssm_fps = 16/time_frame; DEBUG_VAR(pssm_fps,200); DEBUG_VAR(pssm_splitdist[i+1],220 + i*20); #endif //set depthmapshader maxDepth screen.views.sunShadowDepth[i].material.skill4 = floatv(screen.views.sunShadowDepth[i].clip_far); } //put matrices to world space //mat_multiply(matSplit[0], matViewInv); // use a DX function to copy the 4 texture matrices to the shadow shader LPD3DXEFFECT fx = screen.views.sun->material->d3deffect; if(fx) { fx->SetMatrixArray("matTex",matSplit,screen.settings.lights.sunPssmSplits); if(screen.views.sunShadowDepth[0] != NULL) fx->SetTexture("shadowTex1",screen.renderTargets.sunShadowDepth[0].d3dtex); if(screen.views.sunShadowDepth[1] != NULL) fx->SetTexture("shadowTex2",screen.renderTargets.sunShadowDepth[1].d3dtex); if(screen.views.sunShadowDepth[2] != NULL) fx->SetTexture("shadowTex3",screen.renderTargets.sunShadowDepth[2].d3dtex); if(screen.views.sunShadowDepth[3] != NULL) fx->SetTexture("shadowTex4",screen.renderTargets.sunShadowDepth[3].d3dtex); //fx->SetFloat("shadowBias", screen.settings.lights.sunShadowBias); //fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); } //same for shadowEdge acceleration LPD3DXEFFECT fx = screen.views.sunEdge->material->d3deffect; if(fx) { fx->SetMatrixArray("matTex",matSplit,screen.settings.lights.sunPssmSplits); if(screen.views.sunShadowDepth[0] != NULL) fx->SetTexture("shadowTex1",screen.renderTargets.sunShadowDepth[0].d3dtex); if(screen.views.sunShadowDepth[1] != NULL) fx->SetTexture("shadowTex2",screen.renderTargets.sunShadowDepth[1].d3dtex); if(screen.views.sunShadowDepth[2] != NULL) fx->SetTexture("shadowTex3",screen.renderTargets.sunShadowDepth[2].d3dtex); if(screen.views.sunShadowDepth[3] != NULL) fx->SetTexture("shadowTex4",screen.renderTargets.sunShadowDepth[3].d3dtex); //fx->SetFloat("shadowBias", screen.settings.lights.sunShadowBias); //fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); } //and for the actual shadow view LPD3DXEFFECT fx = screen.views.sunShadow->material->d3deffect; if(fx) { fx->SetMatrixArray("matTex",matSplit,screen.settings.lights.sunPssmSplits); if(screen.views.sunShadowDepth[0] != NULL) fx->SetTexture("shadowTex1",screen.renderTargets.sunShadowDepth[0].d3dtex); if(screen.views.sunShadowDepth[1] != NULL) fx->SetTexture("shadowTex2",screen.renderTargets.sunShadowDepth[1].d3dtex); if(screen.views.sunShadowDepth[2] != NULL) fx->SetTexture("shadowTex3",screen.renderTargets.sunShadowDepth[2].d3dtex); if(screen.views.sunShadowDepth[3] != NULL) fx->SetTexture("shadowTex4",screen.renderTargets.sunShadowDepth[3].d3dtex); //fx->SetFloat("shadowBias", screen.settings.lights.sunShadowBias); //fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); } screen.views.sun.material.skill4 = floatv(screen.views.sunShadowDepth[0].clip_far); #ifdef DEBUG_PSSM DEBUG_BMAP(screen.views.sun->bmap,20,0.2); #endif } #endif } }
void sc_dof_init(SC_SCREEN* screen) { //create materials //dof screen.materials.dof = mtl_create(); effect_load(screen.materials.dof, sc_dof_sMaterial); screen.materials.dof.skin1 = screen.renderTargets.full0;// this contains the current scene without dof screen.materials.dof.skin2 = screen.renderTargets.quarter0;// this contains the blurred scene screen.materials.dof.skin3 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.materials.dof.skill1 = floatv(0.25); // inverted downsample factor screen.materials.dof.event = sc_dof_MaterialEvent; screen.materials.dof.SC_SKILL = screen; set(screen.materials.dof, ENABLE_VIEW); //blur y screen.materials.dofBlurY = mtl_create(); effect_load(screen.materials.dofBlurY, sc_dof_sMaterialBlurY); screen.materials.dofBlurY.skin1 = screen.renderTargets.quarter1;// this contains the x blurred scene, with unblurred focus screen.materials.dofBlurY.skin2 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.materials.dofBlurY.skin3 = screen.renderTargets.quarter2;// this contains the downsampled scene, with blurred focus screen.materials.dofBlurY.skill1 = floatv(screen.settings.dof.blurY); //blur strength screen.materials.dofBlurY.event = sc_dof_MaterialEvent; screen.materials.dofBlurY.SC_SKILL = screen; set(screen.materials.dofBlurY, ENABLE_VIEW); //blur x screen.materials.dofBlurX = mtl_create(); effect_load(screen.materials.dofBlurX, sc_dof_sMaterialBlurX); screen.materials.dofBlurX.skin1 = screen.renderTargets.quarter0;// this contains the downsampled scene screen.materials.dofBlurX.skin2 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.materials.dofBlurX.skill1 = floatv(screen.settings.dof.blurX); //blur strength screen.materials.dofBlurX.event = sc_dof_MaterialEvent; screen.materials.dofBlurX.SC_SKILL = screen; set(screen.materials.dofBlurX, ENABLE_VIEW); //downsample screen.materials.dofDownsample = mtl_create(); effect_load(screen.materials.dofDownsample, sc_dof_sMaterialDownsample); screen.materials.dofDownsample.skin1 = screen.renderTargets.full0;// this contains the current scene without dof screen.materials.dofDownsample.skin2 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.materials.dofDownsample.skill1 = floatv(4); //downsample factor screen.materials.dofDownsample.event = sc_dof_MaterialEvent; screen.materials.dofDownsample.SC_SKILL = screen; set(screen.materials.dofDownsample, ENABLE_VIEW); //setup views //dof screen.views.dof = view_create(2); set(screen.views.dof, PROCESS_TARGET); set(screen.views.dof, UNTOUCHABLE); set(screen.views.dof, NOSHADOW); reset(screen.views.dof, AUDIBLE); set(screen.views.dof, CHILD); screen.views.dof.size_x = screen.views.main.size_x; screen.views.dof.size_y = screen.views.main.size_y; screen.views.dof.material = screen.materials.dof; //screen.views.dof.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one //blur y screen.views.dofBlurY = view_create(2); set(screen.views.dofBlurY, PROCESS_TARGET); set(screen.views.dofBlurY, UNTOUCHABLE); set(screen.views.dofBlurY, NOSHADOW); reset(screen.views.dofBlurY, AUDIBLE); set(screen.views.dofBlurY, CHILD); screen.views.dofBlurY.size_x = screen.views.main.size_x/4; screen.views.dofBlurY.size_y = screen.views.main.size_y/4; screen.views.dofBlurY.material = screen.materials.dofBlurY; screen.views.dofBlurY.stage = screen.views.dof; screen.views.dofBlurY.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one //blur x screen.views.dofBlurX = view_create(2); set(screen.views.dofBlurX, PROCESS_TARGET); set(screen.views.dofBlurX, UNTOUCHABLE); set(screen.views.dofBlurX, NOSHADOW); reset(screen.views.dofBlurX, AUDIBLE); set(screen.views.dofBlurX, CHILD); screen.views.dofBlurX.size_x = screen.views.main.size_x/4; screen.views.dofBlurX.size_y = screen.views.main.size_y/4; screen.views.dofBlurX.material = screen.materials.dofBlurX; screen.views.dofBlurX.stage = screen.views.dofBlurY; screen.views.dofBlurX.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one screen.views.dofBlurX.target1 = screen.renderTargets.quarter2; //assign temp render target so Acknex does not automatically create a new one //downsample screen.views.dofDownsample = view_create(2); set(screen.views.dofDownsample, PROCESS_TARGET); set(screen.views.dofDownsample, UNTOUCHABLE); set(screen.views.dofDownsample, NOSHADOW); reset(screen.views.dofDownsample, AUDIBLE); set(screen.views.dofDownsample, CHILD); screen.views.dofDownsample.size_x = screen.views.main.size_x/4; screen.views.dofDownsample.size_y = screen.views.main.size_y/4; screen.views.dofDownsample.material = screen.materials.dofDownsample; screen.views.dofDownsample.stage = screen.views.dofBlurX; screen.views.dofDownsample.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one //apply to camera VIEW* view_last; view_last = screen.views.main; while(view_last.stage != NULL) { view_last = view_last.stage; } view_last.stage = screen.views.dofDownsample; screen.views.preDOF = view_last; }