File: Twisted.cg

package info (click to toggle)
vtk 5.8.0-13
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 130,524 kB
  • sloc: cpp: 1,129,256; ansic: 708,203; tcl: 48,526; python: 20,875; xml: 6,779; yacc: 4,208; perl: 3,121; java: 2,788; lex: 931; sh: 660; asm: 471; makefile: 299
file content (92 lines) | stat: -rw-r--r-- 2,429 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// define inputs from application
struct vertin
{
  float4 Position : POSITION;
  float4 Color    : COLOR0;
  float3 Normal   : NORMAL;
};

// define outputs from vertex shader
struct vertout
{
  float4 HPosition : POSITION;
  float4 Color    : COLOR0;
};

vertout main(vertin IN, 
  uniform float4x4 ModelViewProj,
  uniform float4x4 ModelViewIT,
  uniform float Rate,
  uniform float Ka,
  uniform float3 AmbientColor,
  uniform float Kd,
  uniform float3 DiffuseColor,
  uniform float Ks,
  uniform float Ksp,
  uniform float3 SpecularColor,

  uniform float3 lightPosition,
  uniform float3 eyePosition,
  uniform float3 lightDiffuseColor,
  uniform float3 lightAmbientColor,
  uniform float3 lightSpecularColor)
{
  vertout OUT;

  int twist = 1;
  float rate = Rate ;

  // transform vertex position into homogenous clip-space
  float4 inPosition = IN.Position;
  float3 inNormal = IN.Normal;

  float4 usedPosition;
  float3 usedNormal;

  if ( twist )
    {
    float angle = inPosition[2];

    float4 twistedPosition;
    twistedPosition[0] = cos(angle*rate) * inPosition[0] + sin(angle*rate) * inPosition[1];
    twistedPosition[1] = -sin(angle*rate) * inPosition[0] + cos(angle*rate)* inPosition[1];
    twistedPosition[2] = inPosition[2];
    twistedPosition[3] = inPosition[3];

    usedPosition = twistedPosition;

    float3 twistedNormal; 
    twistedNormal[0] = cos(angle*rate) * inNormal[0] + sin(angle*rate) * inNormal[1];
    twistedNormal[1] = -sin(angle*rate) * inNormal[0] + cos(angle*rate)* inNormal[1];
    twistedNormal[2] = inNormal[2];

    usedNormal = twistedNormal;
    }
  else
    {
    usedPosition = inPosition;
    usedNormal = inNormal;
    }

  OUT.HPosition = mul(ModelViewProj, usedPosition);

  // Computer Ambient intensity.
  float3 ambient = Ka * AmbientColor * lightAmbientColor;

  // Comput Diffuse intensity.
  float3 L = normalize(lightPosition - usedPosition);
  float diffuseLight = max(dot(usedNormal.xyz, L), 0);
  float3 diffuse = Kd * DiffuseColor * lightDiffuseColor * diffuseLight;

  // Compute Specular intensity.
  float3 V = normalize(eyePosition - usedPosition);
  float3 H = normalize(L + V);
  float specularLight = pow(max(dot(usedNormal.xyz, H), 0), Ksp);
  if (diffuseLight <= 0) specularLight = 0;
  float3 specular = Ks * SpecularColor * lightSpecularColor * specularLight;

  OUT.Color.xyz = ambient + diffuse + specular;
  OUT.Color.w = 1;

  return OUT;
}