/**
 * 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);
}
예제 #4
0
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);
	}
}
예제 #5
0
/*
 * 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;		
	}
}
예제 #8
0
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);
}
예제 #11
0
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
	
}
예제 #12
0
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;	
}
예제 #13
0
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
		
		
	}
}
예제 #14
0
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;
}