diff options
Diffstat (limited to 'chart2/opengl/shape3DFragmentShaderBatchScroll.glsl')
-rw-r--r-- | chart2/opengl/shape3DFragmentShaderBatchScroll.glsl | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/chart2/opengl/shape3DFragmentShaderBatchScroll.glsl b/chart2/opengl/shape3DFragmentShaderBatchScroll.glsl new file mode 100644 index 000000000000..33e970fb918c --- /dev/null +++ b/chart2/opengl/shape3DFragmentShaderBatchScroll.glsl @@ -0,0 +1,111 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#version 330 core +#define MAX_LIGHT_NUM 8 + +in vec3 positionWorldspace; +in vec3 normalCameraspace; +in vec4 fragBarColor; +uniform mat4 V; +uniform int undraw; +uniform float minCoordX; +out vec4 actualColor; +struct MaterialParameters +{ + vec4 ambient; + vec4 diffuse; + vec4 specular; + vec4 materialColor; + + int twoSidesLighting; + float shininess; + float pad; + float pad1; +}; + +layout(std140) uniform GlobalMaterialParameters +{ + MaterialParameters matralParameter; +}Material; + +struct LightSource +{ + vec4 lightColor; + vec4 positionWorldspace; + float lightPower; + float pad1; + float pad2; + float pad3; +}; + +layout(std140) uniform GlobalLights +{ + int lightNum; + vec4 ambient; + LightSource light[MAX_LIGHT_NUM]; +} Lights; + +void main() +{ + if ((positionWorldspace.x <= minCoordX) && (undraw == 1)) + discard; + vec3 colorTotal = vec3(0.0f, 0.0f, 0.0f); + + vec3 vertexPositionCameraspace = (V * vec4(positionWorldspace,1)).xyz; + + vec3 MaterialDiffuseColor = fragBarColor.rgb; + + vec3 normalDirectionCameraspace = normalCameraspace; + vec3 eyeDirectionCameraspace = normalize(vec3(0, 0, 0) - vertexPositionCameraspace); + float attenuation = 1.0; + int i = 0; + vec3 lightDirectionCameraspace; + vec3 vertexToLightSource; + + vec3 lightAmbient = Lights.ambient.rgb * + MaterialDiffuseColor * + Material.matralParameter.ambient.rgb; + + for (i = 0; i < Lights.lightNum; i++) + { + float LightPower = Lights.light[i].lightPower; + lightDirectionCameraspace = normalize((V * Lights.light[i].positionWorldspace).xyz); + + float cosTheta = clamp(dot(normalDirectionCameraspace,lightDirectionCameraspace), 0,1); + vec3 lightDiffuse = LightPower * + attenuation * + Lights.light[i].lightColor.rgb * + MaterialDiffuseColor * + Material.matralParameter.diffuse.rgb * + cosTheta; + + vec3 specularReflection; + if (dot(normalDirectionCameraspace, lightDirectionCameraspace) < 0) + { + specularReflection = vec3(0.0, 0.0, 0.0); + } + else + { + vec3 R = reflect(-lightDirectionCameraspace,normalDirectionCameraspace); + float cosAlpha = clamp(dot(eyeDirectionCameraspace, R), 0,1); + specularReflection = attenuation * + LightPower * + Lights.light[i].lightColor.rgb * + Material.matralParameter.specular.rgb * + MaterialDiffuseColor * + pow(max(0.0, cosAlpha), Material.matralParameter.shininess); + } + colorTotal += lightDiffuse + specularReflection; + + } + colorTotal += lightAmbient; + actualColor = vec4(colorTotal, 1.0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |