ogre.rb 0.1-i386-mswin32
Sign up to get free protection for your applications and to get access to all the features.
- data/README +79 -0
- data/Rakefile +291 -0
- data/doc_src/ogre.rb +246 -0
- data/doc_src/ois.rb +67 -0
- data/lib/application.rb +146 -0
- data/lib/application_frame_listener.rb +302 -0
- data/lib/application_loading_bar.rb +115 -0
- data/lib/constants.rb +51 -0
- data/lib/method_fixes.rb +42 -0
- data/lib/ogre.dll +0 -0
- data/lib/ruby_ois.dll +0 -0
- data/ogre.rb +25 -0
- data/platform.rb +23 -0
- data/samples/Ogre.log +279 -0
- data/samples/bsp.rb +76 -0
- data/samples/cg.dll +0 -0
- data/samples/grass.rb +325 -0
- data/samples/js3250.dll +0 -0
- data/samples/lighting.rb +138 -0
- data/samples/media/materials/programs/Grass.cg +30 -0
- data/samples/media/materials/programs/OffsetMapping.cg +97 -0
- data/samples/media/materials/programs/OffsetMapping.hlsl +135 -0
- data/samples/media/materials/programs/OffsetMappingFp.glsl +69 -0
- data/samples/media/materials/programs/OffsetMappingVp.glsl +54 -0
- data/samples/media/materials/programs/OffsetMapping_specular.asm +44 -0
- data/samples/media/materials/scripts/CloudySky.material +17 -0
- data/samples/media/materials/scripts/CubeMapping.material +34 -0
- data/samples/media/materials/scripts/Flare.material +17 -0
- data/samples/media/materials/scripts/Grass.material +63 -0
- data/samples/media/materials/scripts/Knot.material +14 -0
- data/samples/media/materials/scripts/MorningSkyBox.material +17 -0
- data/samples/media/materials/scripts/Offset.material +124 -0
- data/samples/media/materials/scripts/Ogre.material +119 -0
- data/samples/media/materials/scripts/RZR-002.material +15 -0
- data/samples/media/materials/scripts/Razor.material +14 -0
- data/samples/media/materials/scripts/Ribbon.material +19 -0
- data/samples/media/materials/scripts/RustySteel.material +14 -0
- data/samples/media/materials/scripts/SpaceSkyBox.material +17 -0
- data/samples/media/materials/scripts/SpaceSkyPlane.material +17 -0
- data/samples/media/materials/scripts/TextureEffects.material +15 -0
- data/samples/media/materials/scripts/dragon.material +42 -0
- data/samples/media/materials/scripts/smoke.material +18 -0
- data/samples/media/materials/textures/GreenSkin.jpg +0 -0
- data/samples/media/materials/textures/MtlPlat2.jpg +0 -0
- data/samples/media/materials/textures/RZR-002.png +0 -0
- data/samples/media/materials/textures/RustedMetal.jpg +0 -0
- data/samples/media/materials/textures/RustySteel.jpg +0 -0
- data/samples/media/materials/textures/Thumbs.db +0 -0
- data/samples/media/materials/textures/Water02.jpg +0 -0
- data/samples/media/materials/textures/WeirdEye.png +0 -0
- data/samples/media/materials/textures/clouds.jpg +0 -0
- data/samples/media/materials/textures/cursor.png +0 -0
- data/samples/media/materials/textures/dirt01.jpg +0 -0
- data/samples/media/materials/textures/flare.png +0 -0
- data/samples/media/materials/textures/gras_02.png +0 -0
- data/samples/media/materials/textures/grass_1024.jpg +0 -0
- data/samples/media/materials/textures/ogreborder.png +0 -0
- data/samples/media/materials/textures/ogreborderUp.png +0 -0
- data/samples/media/materials/textures/ribbonband.png +0 -0
- data/samples/media/materials/textures/rockwall.tga +0 -0
- data/samples/media/materials/textures/rockwall_NH.tga +0 -0
- data/samples/media/materials/textures/smoke.png +0 -0
- data/samples/media/materials/textures/smokecolors.png +0 -0
- data/samples/media/materials/textures/spacesky.jpg +0 -0
- data/samples/media/materials/textures/spheremap.png +0 -0
- data/samples/media/materials/textures/texmap2.jpg +0 -0
- data/samples/media/models/RZR-002.mesh +0 -0
- data/samples/media/models/geosphere4500.mesh +0 -0
- data/samples/media/models/geosphere8000.mesh +0 -0
- data/samples/media/models/knot.mesh +0 -0
- data/samples/media/models/ogrehead.mesh +0 -0
- data/samples/media/models/razor.mesh +0 -0
- data/samples/media/models/sphere.mesh +0 -0
- data/samples/media/overlays/CubeMapping.overlay +139 -0
- data/samples/media/packs/OgreCore.zip +0 -0
- data/samples/media/packs/chiropteraDM.pk3 +0 -0
- data/samples/media/packs/chiropteraDM.txt +99 -0
- data/samples/media/packs/cubemap.zip +0 -0
- data/samples/media/packs/cubemapsJS.zip +0 -0
- data/samples/media/packs/dragon.zip +0 -0
- data/samples/media/packs/skybox.zip +0 -0
- data/samples/media/particles/smoke.particle +43 -0
- data/samples/media.cfg +22 -0
- data/samples/ogre.cfg +19 -0
- data/samples/plugins.cfg +12 -0
- data/samples/quake3settings.cfg +2 -0
- data/samples/render_to_texture.rb +161 -0
- data/samples/resources.cfg +16 -0
- data/samples/sky_box.rb +107 -0
- data/samples/sky_dome.rb +86 -0
- data/samples/sky_plane.rb +27 -0
- data/samples/smoke.rb +23 -0
- data/samples/work/cube_mapping.rb +686 -0
- metadata +149 -0
data/samples/lighting.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
$: << File.dirname(__FILE__) + "/.."
|
4
|
+
require 'ogre'
|
5
|
+
require 'application'
|
6
|
+
include Ogre
|
7
|
+
|
8
|
+
$animation_state_list = []
|
9
|
+
|
10
|
+
class LightingListener < ApplicationFrameListener
|
11
|
+
def frame_started(event)
|
12
|
+
return false unless super(event)
|
13
|
+
|
14
|
+
$animation_state_list.each do |anim|
|
15
|
+
anim.add_time(event.time_since_last_frame)
|
16
|
+
end
|
17
|
+
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class LightingApplication < Application
|
23
|
+
|
24
|
+
def create_scene
|
25
|
+
scene_manager.set_ambient_light ColourValue.new(0.5, 0.5, 0.5)
|
26
|
+
scene_manager.set_sky_box(true, "SpaceSkyBox")
|
27
|
+
head = scene_manager.create_entity("head", "ogrehead.mesh")
|
28
|
+
|
29
|
+
scene_manager.root_scene_node.attach_object(head)
|
30
|
+
|
31
|
+
## Set up light ribbons
|
32
|
+
dir = Vector3.new(-1, -1, 0.5)
|
33
|
+
dir.normalise!
|
34
|
+
|
35
|
+
l = scene_manager.create_light("light1")
|
36
|
+
l.set_type Light::LT_DIRECTIONAL
|
37
|
+
l.set_direction dir
|
38
|
+
|
39
|
+
trail = scene_manager.create_movable_object("RibbonTrail1", "RibbonTrail",
|
40
|
+
{"numberOfChains" => "2", "maxElements" => "80"})
|
41
|
+
trail.set_material_name "LightRibbonTrail"
|
42
|
+
trail.set_trail_length 400
|
43
|
+
|
44
|
+
puts trail
|
45
|
+
|
46
|
+
scene_manager.root_scene_node.create_child_scene_node.attach_object(trail)
|
47
|
+
|
48
|
+
anim_node = scene_manager.root_scene_node.create_child_scene_node
|
49
|
+
anim_node.set_position Vector3.new(50,30,0)
|
50
|
+
anim = scene_manager.create_animation("an1", 14)
|
51
|
+
anim.set_interpolation_mode Animation::IM_SPLINE
|
52
|
+
track = anim.create_node_track(1, anim_node)
|
53
|
+
kf = track.create_node_key_frame(0)
|
54
|
+
kf.set_translate Vector3.new(50,30,0)
|
55
|
+
kf = track.create_node_key_frame(2)
|
56
|
+
kf.set_translate Vector3.new(100, -30, 0)
|
57
|
+
kf = track.create_node_key_frame(4)
|
58
|
+
kf.set_translate Vector3.new(120, -100, 150)
|
59
|
+
kf = track.create_node_key_frame(6)
|
60
|
+
kf.set_translate Vector3.new(30, -100, 50)
|
61
|
+
kf = track.create_node_key_frame(8)
|
62
|
+
kf.set_translate Vector3.new(-50, 30, -50)
|
63
|
+
kf = track.create_node_key_frame(10)
|
64
|
+
kf.set_translate Vector3.new(-150, -20, -100)
|
65
|
+
kf = track.create_node_key_frame(12)
|
66
|
+
kf.set_translate Vector3.new(-50, -30, 0)
|
67
|
+
kf = track.create_node_key_frame(14)
|
68
|
+
kf.set_translate Vector3.new(50,30,0)
|
69
|
+
|
70
|
+
anim_state = scene_manager.create_animation_state("an1")
|
71
|
+
anim_state.set_enabled true
|
72
|
+
$animation_state_list << anim_state
|
73
|
+
|
74
|
+
trail.set_initial_colour(0, 1.0, 0.8, 0)
|
75
|
+
trail.set_colour_change(0, 0.5, 0.5, 0.5, 0.5)
|
76
|
+
trail.set_initial_width(0, 5)
|
77
|
+
trail.add_node(anim_node)
|
78
|
+
|
79
|
+
# Add light
|
80
|
+
l2 = scene_manager.create_light("l2")
|
81
|
+
l2.set_diffuse_colour trail.get_initial_colour(0)
|
82
|
+
anim_node.attach_object(l2)
|
83
|
+
|
84
|
+
# Add billboard
|
85
|
+
bbs = scene_manager.create_billboard_set("bb", 1)
|
86
|
+
bbs.create_billboard(Vector3.ZERO, trail.get_initial_colour(0))
|
87
|
+
bbs.set_material_name "Flare"
|
88
|
+
anim_node.attach_object(bbs)
|
89
|
+
|
90
|
+
anim_node = scene_manager.root_scene_node.create_child_scene_node
|
91
|
+
anim_node.set_position Vector3.new(-50,100,0)
|
92
|
+
anim = scene_manager.create_animation("an2", 10)
|
93
|
+
anim.set_interpolation_mode Animation::IM_SPLINE
|
94
|
+
track = anim.create_node_track(1, anim_node)
|
95
|
+
kf = track.create_node_key_frame(0)
|
96
|
+
kf.set_translate Vector3.new(-50,100,0)
|
97
|
+
kf = track.create_node_key_frame(2)
|
98
|
+
kf.set_translate Vector3.new(-100, 150, -30)
|
99
|
+
kf = track.create_node_key_frame(4)
|
100
|
+
kf.set_translate Vector3.new(-200, 0, 40)
|
101
|
+
kf = track.create_node_key_frame(6)
|
102
|
+
kf.set_translate Vector3.new(0, -150, 70)
|
103
|
+
kf = track.create_node_key_frame(8)
|
104
|
+
kf.set_translate Vector3.new(50, 0, 30)
|
105
|
+
kf = track.create_node_key_frame(10)
|
106
|
+
kf.set_translate Vector3.new(-50,100,0)
|
107
|
+
|
108
|
+
anim_state = scene_manager.create_animation_state("an2")
|
109
|
+
anim_state.set_enabled true
|
110
|
+
$animation_state_list << anim_state
|
111
|
+
|
112
|
+
trail.set_initial_colour(1, 0.0, 1.0, 0.4)
|
113
|
+
trail.set_colour_change(1, 0.5, 0.5, 0.5, 0.5)
|
114
|
+
trail.set_initial_width(1, 5)
|
115
|
+
trail.add_node(anim_node)
|
116
|
+
|
117
|
+
|
118
|
+
# Add light
|
119
|
+
l2 = scene_manager.create_light("l3")
|
120
|
+
l2.set_diffuse_colour trail.get_initial_colour(1)
|
121
|
+
anim_node.attach_object(l2)
|
122
|
+
|
123
|
+
# Add billboard
|
124
|
+
bbs = scene_manager.create_billboard_set("bb2", 1)
|
125
|
+
bbs.create_billboard(Vector3.ZERO, trail.get_initial_colour(1))
|
126
|
+
bbs.set_material_name "Flare"
|
127
|
+
anim_node.attach_object(bbs)
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
def create_frame_listener
|
132
|
+
self.frame_listener = LightingListener.new(root, window, camera)
|
133
|
+
#root.addFrameListener(self.frame_listener)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
app = LightingApplication.new
|
138
|
+
app.go
|
@@ -0,0 +1,30 @@
|
|
1
|
+
// Vertex program to wave some grass about
|
2
|
+
// Simplistic, assumes base of the grass at 0
|
3
|
+
void grass_vp(float4 position : POSITION,
|
4
|
+
float3 normal : NORMAL,
|
5
|
+
float2 uv : TEXCOORD0,
|
6
|
+
out float4 oPosition : POSITION,
|
7
|
+
out float2 oUv : TEXCOORD0,
|
8
|
+
out float4 colour : COLOR,
|
9
|
+
|
10
|
+
uniform float4x4 worldViewProj,
|
11
|
+
uniform float4 ambient,
|
12
|
+
uniform float4 objSpaceLight,
|
13
|
+
uniform float4 lightColour,
|
14
|
+
uniform float4 offset)
|
15
|
+
{
|
16
|
+
float4 mypos = position;
|
17
|
+
//offset = float4(0.5, 0, 0, 0);
|
18
|
+
mypos = mypos + offset * mypos.yyyy;
|
19
|
+
oPosition = mul(worldViewProj, mypos);
|
20
|
+
|
21
|
+
oUv = uv;
|
22
|
+
// get vertex light direction (support directional and point)
|
23
|
+
float3 light = normalize(
|
24
|
+
objSpaceLight.xyz - (position.xyz * objSpaceLight.w));
|
25
|
+
float diffuseFactor = max(dot(normal, light), 0);
|
26
|
+
|
27
|
+
|
28
|
+
colour = ambient + diffuseFactor * lightColour;
|
29
|
+
}
|
30
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
/* Bump mapping with Parallax offset vertex program
|
2
|
+
In this program, we want to calculate the tangent space light end eye vectors
|
3
|
+
which will get passed to the fragment program to produce the per-pixel bump map
|
4
|
+
with parallax offset effect.
|
5
|
+
*/
|
6
|
+
|
7
|
+
/* Vertex program that moves light and eye vectors into texture tangent space at vertex */
|
8
|
+
|
9
|
+
void main_vp(float4 position : POSITION,
|
10
|
+
float3 normal : NORMAL,
|
11
|
+
float2 uv : TEXCOORD0,
|
12
|
+
float3 tangent : TANGENT0,
|
13
|
+
// outputs
|
14
|
+
out float4 oPosition : POSITION,
|
15
|
+
out float2 oUv : TEXCOORD0,
|
16
|
+
out float3 oLightDir : TEXCOORD1, // tangent space
|
17
|
+
out float3 oEyeDir : TEXCOORD2, // tangent space
|
18
|
+
out float3 oHalfAngle : TEXCOORD3, //
|
19
|
+
// parameters
|
20
|
+
uniform float4 lightPosition, // object space
|
21
|
+
uniform float3 eyePosition, // object space
|
22
|
+
uniform float4x4 worldViewProj)
|
23
|
+
{
|
24
|
+
// calculate output position
|
25
|
+
oPosition = mul(worldViewProj, position);
|
26
|
+
|
27
|
+
// pass the main uvs straight through unchanged
|
28
|
+
oUv = uv;
|
29
|
+
|
30
|
+
// calculate tangent space light vector
|
31
|
+
// Get object space light direction
|
32
|
+
float3 lightDir = normalize(lightPosition.xyz - (position * lightPosition.w));
|
33
|
+
float3 eyeDir = eyePosition - position.xyz;
|
34
|
+
|
35
|
+
// Calculate the binormal (NB we assume both normal and tangent are
|
36
|
+
// already normalised)
|
37
|
+
// NB looks like nvidia cross params are BACKWARDS to what you'd expect
|
38
|
+
// this equates to NxT, not TxN
|
39
|
+
float3 binormal = cross(tangent, normal);
|
40
|
+
|
41
|
+
// Form a rotation matrix out of the vectors
|
42
|
+
float3x3 rotation = float3x3(tangent, binormal, normal);
|
43
|
+
|
44
|
+
// Transform the light vector according to this matrix
|
45
|
+
lightDir = normalize(mul(rotation, lightDir));
|
46
|
+
eyeDir = normalize(mul(rotation, eyeDir));
|
47
|
+
|
48
|
+
oLightDir = lightDir;
|
49
|
+
oEyeDir = eyeDir;
|
50
|
+
oHalfAngle = normalize(eyeDir + lightDir);
|
51
|
+
}
|
52
|
+
|
53
|
+
// General functions
|
54
|
+
|
55
|
+
// Expand a range-compressed vector
|
56
|
+
float3 expand(float3 v)
|
57
|
+
{
|
58
|
+
return (v - 0.5) * 2;
|
59
|
+
}
|
60
|
+
|
61
|
+
void main_fp(float2 uv : TEXCOORD0,
|
62
|
+
float3 lightDir : TEXCOORD1,
|
63
|
+
float3 eyeDir : TEXCOORD2,
|
64
|
+
float3 halfAngle : TEXCOORD3,
|
65
|
+
uniform float3 lightDiffuse,
|
66
|
+
uniform float3 lightSpecular,
|
67
|
+
uniform float4 scaleBias,
|
68
|
+
uniform sampler2D normalHeightMap,
|
69
|
+
uniform sampler2D diffuseMap,
|
70
|
+
out float4 oColor : COLOR)
|
71
|
+
{
|
72
|
+
// get the height using the tex coords
|
73
|
+
float height = tex2D(normalHeightMap, uv).a;
|
74
|
+
|
75
|
+
// scale and bias factors
|
76
|
+
float scale = scaleBias.x;
|
77
|
+
float bias = scaleBias.y;
|
78
|
+
|
79
|
+
// calculate displacement
|
80
|
+
float displacement = (height * scale) + bias;
|
81
|
+
|
82
|
+
float3 uv2 = float3(uv, 1);
|
83
|
+
|
84
|
+
// calculate the new tex coord to use for normal and diffuse
|
85
|
+
float2 newTexCoord = ((eyeDir * displacement) + uv2).xy;
|
86
|
+
|
87
|
+
// get the new normal and diffuse values
|
88
|
+
float3 normal = expand(tex2D(normalHeightMap, newTexCoord).xyz);
|
89
|
+
float3 diffuse = tex2D(diffuseMap, newTexCoord).xyz;
|
90
|
+
|
91
|
+
float3 specular = pow(saturate(dot(normal, halfAngle)), 32) * lightSpecular;
|
92
|
+
float3 col = diffuse * saturate(dot(normal, lightDir)) * lightDiffuse + specular;
|
93
|
+
|
94
|
+
oColor = float4(col, 1);
|
95
|
+
}
|
96
|
+
|
97
|
+
|
@@ -0,0 +1,135 @@
|
|
1
|
+
/* Offset mapping including a shadow element and multiple lights in one pass */
|
2
|
+
void integratedshadows_vp(float4 position : POSITION,
|
3
|
+
float3 normal : NORMAL,
|
4
|
+
float2 uv : TEXCOORD0,
|
5
|
+
float3 tangent : TANGENT0,
|
6
|
+
// outputs
|
7
|
+
out float4 oPosition : POSITION,
|
8
|
+
out float2 oUv : TEXCOORD0,
|
9
|
+
out float3 oLightDir : TEXCOORD1, // tangent space
|
10
|
+
out float3 oEyeDir : TEXCOORD2, // tangent space
|
11
|
+
out float3 oSpotDirection : TEXCOORD3, // tangent space
|
12
|
+
out float3 oLightDir1 : TEXCOORD4, // tangent space
|
13
|
+
out float3 oSpotDirection1 : TEXCOORD5, // tangent space
|
14
|
+
out float4 oShadowUV1 : TEXCOORD6,
|
15
|
+
out float4 oShadowUV2 : TEXCOORD7,
|
16
|
+
// parameters
|
17
|
+
uniform float4 lightPosition, // object space
|
18
|
+
uniform float4 lightPosition1, // object space
|
19
|
+
uniform float3 eyePosition, // object space
|
20
|
+
uniform float3 spotDirection, // object space
|
21
|
+
uniform float3 spotDirection1, // object space
|
22
|
+
uniform float4x4 worldViewProj,
|
23
|
+
uniform float4x4 worldMatrix,
|
24
|
+
uniform float4x4 texViewProj1,
|
25
|
+
uniform float4x4 texViewProj2)
|
26
|
+
{
|
27
|
+
// calculate output position
|
28
|
+
oPosition = mul(worldViewProj, position);
|
29
|
+
|
30
|
+
float4 worldPos = mul(worldMatrix, position);
|
31
|
+
oShadowUV1 = mul(texViewProj1, worldPos);
|
32
|
+
oShadowUV2 = mul(texViewProj2, worldPos);
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
// pass the main uvs straight through unchanged
|
37
|
+
oUv = uv;
|
38
|
+
|
39
|
+
// calculate tangent space light vector
|
40
|
+
// Get object space light direction
|
41
|
+
float3 lightDir = normalize(lightPosition.xyz - (position * lightPosition.w));
|
42
|
+
float3 lightDir1 = normalize(lightPosition1.xyz - (position * lightPosition1.w));
|
43
|
+
float3 eyeDir = eyePosition - position.xyz;
|
44
|
+
|
45
|
+
// Calculate the binormal (NB we assume both normal and tangent are
|
46
|
+
// already normalised)
|
47
|
+
// NB looks like nvidia cross params are BACKWARDS to what you'd expect
|
48
|
+
// this equates to NxT, not TxN
|
49
|
+
float3 binormal = cross(tangent, normal);
|
50
|
+
|
51
|
+
// Form a rotation matrix out of the vectors
|
52
|
+
float3x3 rotation = float3x3(tangent, binormal, normal);
|
53
|
+
|
54
|
+
// Transform the light vector according to this matrix
|
55
|
+
lightDir = normalize(mul(rotation, lightDir));
|
56
|
+
lightDir1 = normalize(mul(rotation, lightDir1));
|
57
|
+
eyeDir = normalize(mul(rotation, eyeDir));
|
58
|
+
|
59
|
+
oLightDir = lightDir;
|
60
|
+
oLightDir1 = lightDir1;
|
61
|
+
oEyeDir = eyeDir;
|
62
|
+
oSpotDirection = normalize(mul(rotation, -spotDirection));
|
63
|
+
oSpotDirection1 = normalize(mul(rotation, -spotDirection1));
|
64
|
+
}
|
65
|
+
|
66
|
+
// Expand a range-compressed vector
|
67
|
+
float3 expand(float3 v)
|
68
|
+
{
|
69
|
+
return (v - 0.5) * 2;
|
70
|
+
}
|
71
|
+
|
72
|
+
void integratedshadows_fp(
|
73
|
+
float2 uv : TEXCOORD0,
|
74
|
+
float3 lightDir : TEXCOORD1,
|
75
|
+
float3 eyeDir : TEXCOORD2,
|
76
|
+
float3 spotDir : TEXCOORD3,
|
77
|
+
float3 lightDir1 : TEXCOORD4,
|
78
|
+
float3 spotDir1 : TEXCOORD5,
|
79
|
+
float4 shadowUV1 : TEXCOORD6,
|
80
|
+
float4 shadowUV2 : TEXCOORD7,
|
81
|
+
uniform float3 lightDiffuse,
|
82
|
+
uniform float4 scaleBias,
|
83
|
+
uniform float4 spotParams,
|
84
|
+
uniform float3 lightDiffuse1,
|
85
|
+
uniform float4 spotParams1,
|
86
|
+
uniform sampler2D normalHeightMap : register(s0),
|
87
|
+
uniform sampler2D diffuseMap : register(s1),
|
88
|
+
uniform sampler2D shadowMap1 : register(s2),
|
89
|
+
uniform sampler2D shadowMap2 : register(s3),
|
90
|
+
out float4 oColour : COLOR)
|
91
|
+
{
|
92
|
+
// get the height using the tex coords
|
93
|
+
float height = tex2D(normalHeightMap, uv).a;
|
94
|
+
|
95
|
+
// scale and bias factors
|
96
|
+
float scale = scaleBias.x;
|
97
|
+
float bias = scaleBias.y;
|
98
|
+
|
99
|
+
// calculate displacement
|
100
|
+
float displacement = (height * scale) + bias;
|
101
|
+
|
102
|
+
float3 uv2 = float3(uv, 1);
|
103
|
+
|
104
|
+
float3 scaledEyeDir = eyeDir * displacement;
|
105
|
+
|
106
|
+
// calculate the new tex coord to use for normal and diffuse
|
107
|
+
float2 newTexCoord = (scaledEyeDir + uv2).xy;
|
108
|
+
|
109
|
+
// get the new normal and diffuse values
|
110
|
+
float3 normal = expand(tex2D(normalHeightMap, newTexCoord).xyz);
|
111
|
+
float3 diffuse = tex2D(diffuseMap, newTexCoord).xyz;
|
112
|
+
|
113
|
+
float3 col1 = diffuse * saturate(dot(normal, lightDir)) * lightDiffuse;
|
114
|
+
// factor in spotlight angle
|
115
|
+
float rho = saturate(dot(spotDir, lightDir));
|
116
|
+
// factor = (rho - cos(outer/2) / cos(inner/2) - cos(outer/2)) ^ falloff
|
117
|
+
float spotFactor = pow(
|
118
|
+
saturate(rho - spotParams.y) / (spotParams.x - spotParams.y), spotParams.z);
|
119
|
+
col1 = col1 * spotFactor;
|
120
|
+
float3 col2 = diffuse * saturate(dot(normal, lightDir1)) * lightDiffuse1;
|
121
|
+
// factor in spotlight angle
|
122
|
+
rho = saturate(dot(spotDir1, lightDir1));
|
123
|
+
// factor = (rho - cos(outer/2) / cos(inner/2) - cos(outer/2)) ^ falloff
|
124
|
+
spotFactor = pow(
|
125
|
+
saturate(rho - spotParams1.y) / (spotParams1.x - spotParams1.y), spotParams1.z);
|
126
|
+
col2 = col2 * spotFactor;
|
127
|
+
|
128
|
+
// shadow textures
|
129
|
+
col1 = col1 * tex2Dproj(shadowMap1, shadowUV1);
|
130
|
+
col2 = col2 * tex2Dproj(shadowMap2, shadowUV2);
|
131
|
+
|
132
|
+
oColour = float4(col1 + col2, 1);
|
133
|
+
|
134
|
+
}
|
135
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
uniform vec4 lightDiffuse;
|
2
|
+
uniform vec4 scaleBias;
|
3
|
+
uniform vec4 spotParams;
|
4
|
+
uniform vec4 lightDiffuse1;
|
5
|
+
uniform vec4 spotParams1;
|
6
|
+
|
7
|
+
uniform sampler2D normalHeightMap;
|
8
|
+
uniform sampler2D diffuseMap;
|
9
|
+
uniform sampler2D shadowMap1;
|
10
|
+
uniform sampler2D shadowMap2;
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
varying vec3 tangentEyeDir;
|
15
|
+
varying vec3 tangentLightDir[2];
|
16
|
+
varying vec3 tangentSpotDir[2];
|
17
|
+
varying vec4 shadowUV[2];
|
18
|
+
|
19
|
+
|
20
|
+
// Expand a range-compressed vector
|
21
|
+
vec3 expand(vec3 v)
|
22
|
+
{
|
23
|
+
return (v - 0.5) * 2.0;
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
void main()
|
28
|
+
{
|
29
|
+
// get the height using the tex coords
|
30
|
+
float height = texture2D(normalHeightMap, gl_TexCoord[0].xy).a;
|
31
|
+
// scale and bias factors
|
32
|
+
float scale = scaleBias.x;
|
33
|
+
float bias = scaleBias.y;
|
34
|
+
|
35
|
+
// calculate displacement
|
36
|
+
float displacement = (height * scale) + bias;
|
37
|
+
//float displacement = (height * 0.04) - 0.02;
|
38
|
+
|
39
|
+
vec3 scaledEyeDir = tangentEyeDir * displacement;
|
40
|
+
|
41
|
+
// calculate the new tex coord to use for normal and diffuse
|
42
|
+
vec2 newTexCoord = (scaledEyeDir + gl_TexCoord[0].xyz).xy;
|
43
|
+
|
44
|
+
// get the new normal and diffuse values
|
45
|
+
vec3 normal = expand(texture2D(normalHeightMap, newTexCoord).xyz);
|
46
|
+
vec4 diffuse = texture2D(diffuseMap, newTexCoord);
|
47
|
+
|
48
|
+
vec4 col1 = diffuse * clamp(dot(normal, tangentLightDir[0]),0.0,1.0) * lightDiffuse;
|
49
|
+
// factor in spotlight angle
|
50
|
+
float rho = clamp(dot(tangentSpotDir[0], tangentLightDir[0]),0.0,1.0);
|
51
|
+
// factor = (rho - cos(outer/2) / cos(inner/2) - cos(outer/2)) ^ falloff
|
52
|
+
float spotFactor = pow(
|
53
|
+
clamp(rho - spotParams.y,0.0,1.0) / (spotParams.x - spotParams.y), spotParams.z);
|
54
|
+
col1 = col1 * spotFactor;
|
55
|
+
vec4 col2 = diffuse * clamp(dot(normal, tangentLightDir[1]),0.0,1.0) * lightDiffuse1;
|
56
|
+
// factor in spotlight angle
|
57
|
+
rho = clamp(dot(tangentSpotDir[1], tangentLightDir[1]),0.0,1.0);
|
58
|
+
// factor = (rho - cos(outer/2) / cos(inner/2) - cos(outer/2)) ^ falloff
|
59
|
+
spotFactor = pow(
|
60
|
+
clamp(rho - spotParams1.y,0.0,1.0) / (spotParams1.x - spotParams1.y), spotParams1.z);
|
61
|
+
col2 = col2 * spotFactor;
|
62
|
+
|
63
|
+
// shadow textures
|
64
|
+
col1 = col1 * texture2DProj(shadowMap1, shadowUV[0]);
|
65
|
+
col2 = col2 * texture2DProj(shadowMap2, shadowUV[1]);
|
66
|
+
|
67
|
+
gl_FragColor = col1 + col2;
|
68
|
+
|
69
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
attribute vec3 tangent;
|
2
|
+
|
3
|
+
uniform vec4 lightPosition; // object space
|
4
|
+
uniform vec4 lightPosition1; // object space
|
5
|
+
uniform vec4 eyePosition; // object space
|
6
|
+
uniform vec4 spotDirection; // object space
|
7
|
+
uniform vec4 spotDirection1; // object space
|
8
|
+
uniform mat4 worldViewProj; // not actually used but here for compat with HLSL
|
9
|
+
uniform mat4 worldMatrix;
|
10
|
+
uniform mat4 texViewProj1;
|
11
|
+
uniform mat4 texViewProj2;
|
12
|
+
|
13
|
+
|
14
|
+
varying vec3 tangentEyeDir;
|
15
|
+
varying vec3 tangentLightDir[2];
|
16
|
+
varying vec3 tangentSpotDir[2];
|
17
|
+
varying vec4 shadowUV[2];
|
18
|
+
|
19
|
+
void main()
|
20
|
+
{
|
21
|
+
gl_Position = ftransform();
|
22
|
+
|
23
|
+
vec4 worldPos = worldMatrix * gl_Vertex;
|
24
|
+
|
25
|
+
shadowUV[0] = texViewProj1 * worldPos;
|
26
|
+
shadowUV[1] = texViewProj2 * worldPos;
|
27
|
+
|
28
|
+
// pass the main uvs straight through unchanged
|
29
|
+
gl_TexCoord[0] = gl_MultiTexCoord0;
|
30
|
+
|
31
|
+
// calculate tangent space light vector
|
32
|
+
// Get object space light direction
|
33
|
+
vec3 lightDir = normalize(lightPosition.xyz - (gl_Vertex.xyz * lightPosition.w));
|
34
|
+
vec3 lightDir1 = normalize(lightPosition1.xyz - (gl_Vertex.xyz * lightPosition1.w));
|
35
|
+
|
36
|
+
vec3 eyeDir = (eyePosition - gl_Vertex).xyz;
|
37
|
+
|
38
|
+
// Calculate the binormal (NB we assume both normal and tangent are
|
39
|
+
// already normalised)
|
40
|
+
vec3 binormal = cross(gl_Normal, tangent);
|
41
|
+
|
42
|
+
// Form a rotation matrix out of the vectors
|
43
|
+
mat3 rotation = mat3(tangent, binormal, gl_Normal);
|
44
|
+
|
45
|
+
// Transform the light vector according to this matrix
|
46
|
+
tangentLightDir[0] = normalize(rotation * lightDir);
|
47
|
+
tangentLightDir[1] = normalize(rotation * lightDir1);
|
48
|
+
// Invert the Y on the eye dir since we'll be using this to alter UVs and
|
49
|
+
// GL has Y inverted
|
50
|
+
tangentEyeDir = normalize(rotation * eyeDir) * vec3(1, -1, 1);
|
51
|
+
|
52
|
+
tangentSpotDir[0] = normalize(rotation * -spotDirection.xyz);
|
53
|
+
tangentSpotDir[1] = normalize(rotation * -spotDirection1.xyz);
|
54
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// Pixel Shader for doing bump mapping with parallax plus diffuse and specular lighting by nfz
|
2
|
+
|
3
|
+
// uv TEXCOORD0
|
4
|
+
// lightDir TEXCOORD1
|
5
|
+
// eyeDir TEXCOORD2
|
6
|
+
// half TEXCOORD3
|
7
|
+
|
8
|
+
// lightDiffuse c0
|
9
|
+
// lightSpecular c1
|
10
|
+
// Parallax scale and bias c2
|
11
|
+
// normal/height map texunit 0 - height map in alpha channel
|
12
|
+
// diffuse texture texunit 1
|
13
|
+
|
14
|
+
ps.1.4
|
15
|
+
|
16
|
+
|
17
|
+
texld r0, t0 // get height
|
18
|
+
texcrd r2.xyz, t0 // get uv coordinates
|
19
|
+
texcrd r3.xyz, t2 // get eyedir vector
|
20
|
+
|
21
|
+
|
22
|
+
mad r0.xyz, r0.a, c2.x, c2.y // displacement = height * scale + bias
|
23
|
+
mad r2.xyz, r3, r0, r2 // newtexcoord = eyedir * displacement + uv
|
24
|
+
|
25
|
+
phase
|
26
|
+
|
27
|
+
texld r0, r2.xyz // get normal N using newtexcoord
|
28
|
+
texld r1, r2.xyz // get diffuse texture using newtexcoord
|
29
|
+
texcrd r4.xyz, t1 // get lightdir vector
|
30
|
+
texcrd r5.xyz, t3 // get half angle vector
|
31
|
+
|
32
|
+
dp3_sat r5.rgb, r0_bx2, r5 // N dot H - spec calc
|
33
|
+
dp3_sat r4.rgb, r0_bx2, r4 // N dot L - diffuse calc
|
34
|
+
+ mul r5.a, r5.r, r5.r
|
35
|
+
mul r0.rgb, r4, r1 // colour = diffusetex * N dot L
|
36
|
+
+ mul r5.a, r5.a, r5.a
|
37
|
+
|
38
|
+
mul r5.rgb, r5.a, r5.a
|
39
|
+
mul r5.rgb, r5, r5
|
40
|
+
mul r5.rgb, r5, r5
|
41
|
+
mul r5.rgb, r5, c1 // specular = (N dot H)^32 * specularlight
|
42
|
+
|
43
|
+
mad r0.rgb, r0, c0, r5 // colour = diffusetex * (N dot L)* diffuselight + specular
|
44
|
+
+ mov r0.a, c2.b
|
@@ -0,0 +1,34 @@
|
|
1
|
+
material SceneSkyBox2
|
2
|
+
{
|
3
|
+
technique
|
4
|
+
{
|
5
|
+
pass
|
6
|
+
{
|
7
|
+
lighting off
|
8
|
+
depth_write off
|
9
|
+
|
10
|
+
texture_unit
|
11
|
+
{
|
12
|
+
cubic_texture cubescene_fr.jpg cubescene_bk.jpg cubescene_lf.jpg cubescene_rt.jpg cubescene_up.jpg cubescene_dn.jpg separateUV
|
13
|
+
tex_address_mode clamp
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
material SceneCubeMap2
|
19
|
+
{
|
20
|
+
technique
|
21
|
+
{
|
22
|
+
pass
|
23
|
+
{
|
24
|
+
lighting off
|
25
|
+
|
26
|
+
texture_unit
|
27
|
+
{
|
28
|
+
cubic_texture cubescene.jpg combinedUVW
|
29
|
+
tex_address_mode clamp
|
30
|
+
env_map cubic_reflection
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|