diff --git a/media/materials/programs/SingleFragmentProgram.cg b/media/materials/programs/SingleFragmentProgram.cg new file mode 100644 index 00000000..0e3503bf --- /dev/null +++ b/media/materials/programs/SingleFragmentProgram.cg @@ -0,0 +1,101 @@ +struct v2f +{ + float4 Position : POSITION; //in projection space + float4 Color : COLOR; + float4 TexCoords : TEXCOORD0; + float4 Normal : TEXCOORD1; + float2 Alpha : TEXCOORD2; +}; + +float4 main(v2f IN, +uniform sampler2D colourMap0 : TEXUNIT0, +uniform sampler2D colourMap1 : TEXUNIT1, +uniform sampler2D colourMap2 : TEXUNIT2, +uniform sampler2D colourMap3 : TEXUNIT3, +uniform sampler2D colourMap4 : TEXUNIT4, +uniform sampler2D colourMap5 : TEXUNIT5, +uniform sampler2D colourMap6 : TEXUNIT6, +uniform sampler2D colourMap7 : TEXUNIT7) : COLOR +{ + //return float4(IN.Alpha.y, 1.0f-IN.Alpha.y, 0.0f,1.0f); + + float textureScalingFactor = 20.0f; + //float textureSize = 512.0f; + //float noOfTexturesPerDimension = 4.0; + + //Scale the texture. + IN.TexCoords /= textureScalingFactor; + //Next we compute the offset of the texture in the texture atlas + //float material = floor(IN.Alpha.x); + //float y = floor(material / noOfTexturesPerDimension); + //float x = fmod(material,noOfTexturesPerDimension); + //float2 offset = float2(x,y); + //offset /= noOfTexturesPerDimension; + + float3 colourMapValueXY; + float3 colourMapValueYZ; + float3 colourMapValueXZ; + + if(IN.Alpha.x < 1.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap0, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap0, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap0, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else if(IN.Alpha.x < 2.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap1, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap1, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap1, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else if(IN.Alpha.x < 3.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap2, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap2, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap2, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else if(IN.Alpha.x < 4.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap3, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap3, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap3, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else if(IN.Alpha.x < 5.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap4, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap4, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap4, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else if(IN.Alpha.x < 6.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap5, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap5, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap5, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else if(IN.Alpha.x < 7.5) + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap6, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap6, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap6, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + else + { + //Retrieve the 3 samples + colourMapValueXY = tex2D(colourMap7, IN.TexCoords.xy).rgb * abs(IN.Normal.z); + colourMapValueYZ = tex2D(colourMap7, IN.TexCoords.yz).rgb * abs(IN.Normal.x); + colourMapValueXZ = tex2D(colourMap7, IN.TexCoords.xz).rgb * abs(IN.Normal.y); + } + + //Blend according to triplanar texturing + float3 colourMapValue = colourMapValueXY + colourMapValueYZ + colourMapValueXZ; + + //Return the result + return float4(colourMapValue*IN.Color.rgb*IN.Alpha.y,IN.Alpha.y); +} \ No newline at end of file diff --git a/media/materials/programs/SingleVertexProgram.cg b/media/materials/programs/SingleVertexProgram.cg new file mode 100644 index 00000000..d12fb706 --- /dev/null +++ b/media/materials/programs/SingleVertexProgram.cg @@ -0,0 +1,140 @@ +struct a2v +{ + float4 Position : POSITION; //in object space + float3 Normal : NORMAL; + float2 Alpha : TEXCOORD0; +}; + +struct v2f +{ + float4 Position : POSITION; //in projection space + float4 Color : COLOR; + float4 TexCoords : TEXCOORD0; + float4 Normal : TEXCOORD1; + float2 Alpha : TEXCOORD2; +}; + +struct light +{ + float4 position; + float4 diffuseColour; + float4 attenuation; +}; + +v2f doWork(a2v IN, float4x4 world, float4x4 viewProj, float4 ambient, int iNoOfLights, light lights[4]) +{ + v2f OUT; + + OUT.Position = mul(world, IN.Position); + + float3 uVec; + float3 vVec; + + IN.Normal = normalize(IN.Normal); + + /*float absX = abs(IN.Normal.x); + float absY = abs(IN.Normal.y); + float absZ = abs(IN.Normal.z); + if((absZ <= absX) && (absZ <= absY)) + { + //OUT.TexCoords.xy = OUT.Position.xy /textureScale; + uVec = float3(-IN.Normal.y, IN.Normal.x,0); + } + else if((absY <= absX) && (absY <= absZ)) + { + //OUT.TexCoords.xy = OUT.Position.xz /textureScale; + uVec = float3(-IN.Normal.z, 0, IN.Normal.x); + } + else if((absX <= absZ) && (absX <= absY)) + { + // OUT.TexCoords.xy = OUT.Position.yz /textureScale; + uVec = float3(0, -IN.Normal.z, IN.Normal.y); + } + vVec = cross(IN.Normal, uVec); + OUT.TexCoords.x = dot(OUT.Position.xyz, uVec); + OUT.TexCoords.y = dot(OUT.Position.xyz, vVec); */ + + //OUT.TexCoords.xy = OUT.Position.xy * IN.Normal.z * IN.Normal.z + OUT.Position.xz * IN.Normal.y * IN.Normal.y + OUT.Position.yz * IN.Normal.x * IN.Normal.x; + + //OUT.TexCoords.xy /= textureScale; + + /*OUT.TexCoordsXY.xy = OUT.Position.xy; + OUT.TexCoordsYZ.xy = OUT.Position.yz; + OUT.TexCoordsXZ.xy = OUT.Position.xz; + + OUT.TexCoordsXY.xy /= textureScale; + OUT.TexCoordsYZ.xy /= textureScale; + OUT.TexCoordsXZ.xy /= textureScale;*/ + + OUT.Normal = float4(IN.Normal,0.0); + + OUT.TexCoords = OUT.Position; + + + //OUT.TexCoords.xy = OUT.Position.yz /textureScale; + /*OUT.TexCoordsXY.w = 1; + OUT.TexCoordsYZ.w = 1; + OUT.TexCoordsXZ.w = 1;*/ + + OUT.Color.rgba = float4(0.0,0.0,0.0,1.0); + + for(int lightCt = 0; lightCt < iNoOfLights; lightCt++) + { + float3 L = normalize(lights[lightCt].position.xyz - OUT.Position.xyz); + //Calculate attenuation factor. + float d = distance(lights[lightCt].position.xyz, OUT.Position.xyz); + float attenuationFactor = 1.0 / (lights[lightCt].attenuation.y + lights[lightCt].attenuation.z * d + lights[lightCt].attenuation.w * d * d); + // Calculate diffuse component + float LdotN = max(dot(L, IN.Normal) , 0); + OUT.Color.rgb += lights[lightCt].diffuseColour.rgb * LdotN * attenuationFactor; + } + + OUT.Color.rgb += ambient.rgb; + + OUT.Position = mul(viewProj, OUT.Position); + + OUT.Alpha = IN.Alpha; + + //OUT.Material = IN.Material; + + return OUT; +} + +v2f OneLight(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0) +{ + light lights[4]; + lights[0] = light0; + + return doWork(IN, world, viewProj, ambient, 1, lights); +} + +v2f TwoLights(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0, uniform light light1) +{ + light lights[4]; + lights[0] = light0; + lights[1] = light1; + + return doWork(IN, world, viewProj, ambient, 2, lights); +} + +v2f ThreeLights(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0, uniform light light1, uniform light light2) +{ + light lights[4]; + lights[0] = light0; + lights[1] = light1; + lights[2] = light2; + + return doWork(IN, world, viewProj, ambient, 3, lights); +} + +v2f FourLights(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0, uniform light light1, uniform light light2, uniform light light3) +{ + light lights[4]; + lights[0] = light0; + lights[1] = light1; + lights[2] = light2; + lights[3] = light3; + + return doWork(IN, world, viewProj, ambient, 4, lights); +} + diff --git a/media/materials/programs/Thermite.program b/media/materials/programs/Thermite.program index ed7a01d4..865e63c2 100644 --- a/media/materials/programs/Thermite.program +++ b/media/materials/programs/Thermite.program @@ -108,4 +108,18 @@ fragment_program NormalFragmentProgram cg source NormalFragmentProgram.cg entry_point main profiles ps_1_1 arbfp1 +} + +vertex_program SingleOneLightVertexProgram cg +{ + source SingleVertexProgram.cg + entry_point OneLight + profiles vs_1_1 arbvp1 +} + +fragment_program SingleFragmentProgram cg +{ + source SingleFragmentProgram.cg + entry_point main + profiles ps_1_1 arbfp1 } \ No newline at end of file diff --git a/media/materials/scripts/Single.material b/media/materials/scripts/Single.material new file mode 100644 index 00000000..122e1a4d --- /dev/null +++ b/media/materials/scripts/Single.material @@ -0,0 +1,62 @@ +material SingleMaterial +{ + technique + { + pass + { + vertex_program_ref SingleOneLightVertexProgram + { + param_named_auto world world_matrix + param_named_auto viewProj viewproj_matrix + param_named_auto ambient ambient_light_colour + param_named_auto light0.position light_position 0 + param_named_auto light0.diffuseColour light_diffuse_colour 0 + param_named_auto light0.attenuation light_attenuation 0 + } + + fragment_program_ref SingleFragmentProgram + { + } + + texture_unit + { + texture bricks.jpg + } + + texture_unit + { + texture castle_wall.png + } + + texture_unit + { + texture roof_tiles.png + } + + texture_unit + { + texture grass.png + } + + texture_unit + { + texture water.png + } + + texture_unit + { + texture ground.png + } + + texture_unit + { + texture stained_glass.png + } + + texture_unit + { + texture wall.png + } + } + } +}