forked from Mirrors/openclonk
Compare commits
3 Commits
Author | SHA1 | Date |
---|---|---|
Peter Wortmann | 368a073415 | |
Peter Wortmann | 480ade634d | |
Peter Wortmann | 88ef1d40fa |
|
@ -1,40 +0,0 @@
|
||||||
|
|
||||||
// Ambient light calculation
|
|
||||||
|
|
||||||
#ifdef HAVE_LIGHT
|
|
||||||
uniform sampler2D ambientTex;
|
|
||||||
|
|
||||||
uniform mat3x2 ambientTransform;
|
|
||||||
uniform float ambientBrightness;
|
|
||||||
#endif
|
|
||||||
//uniform float cullMode; // 0 if backface culling is enabled, 1 if it is disabled
|
|
||||||
// Already declared in LightShader.glsl
|
|
||||||
|
|
||||||
slice(texture+6)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_LIGHT
|
|
||||||
// Ambient light
|
|
||||||
// Extra .xy since some old intel drivers return a vec3
|
|
||||||
float ambient = texture2D(ambientTex, (ambientTransform * vec3(gl_FragCoord.xy, 1.0)).xy).r * ambientBrightness;
|
|
||||||
#else
|
|
||||||
// Lighting disabled: Ambient light everywhere
|
|
||||||
float ambient = 1.0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(light+1)
|
|
||||||
{
|
|
||||||
// Add ambience to brightness
|
|
||||||
#ifdef LANDSCAPE
|
|
||||||
// For landscape, ambient brightness is coming from top
|
|
||||||
vec3 ambientDir = vec3(0.0, -1.0, 0.0);
|
|
||||||
light = mix(light, 1.0 + 1.0 * dot(normal, ambientDir), ambient);
|
|
||||||
#ifdef HAVE_2PX
|
|
||||||
light2 = mix(light2, 1.0 + 1.0 * dot(normal2, ambientDir), ambient);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
// For objects, ambient brightness is coming from the front
|
|
||||||
vec3 ambientDir = vec3(0.0, 0.0, 1.0);
|
|
||||||
light = mix(light, max(max(dot(normal, ambientDir), 0.0), cullMode * max(dot(-normal, ambientDir), 0.0)), ambient);
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
|
||||||
|
// uncomment the following lines for debugging light directions:
|
||||||
|
// yellow: light up, blue: light down, turqoise: light right, pink: light left
|
||||||
|
// brightness: light strength
|
||||||
|
//#define LIGHT_DEBUG
|
||||||
|
|
||||||
|
// uncomment the following lines for debugging light color:
|
||||||
|
// the light will always come from the front and have a uniform brightness.
|
||||||
|
//#define LIGHT_DEBUG_COLOR
|
||||||
|
|
||||||
|
// uncomment the following lines to set the light color to pink for all lights for debugging:
|
||||||
|
//#define LIGHT_DEBUG_PINK
|
||||||
|
|
||||||
|
// At what point of light intensity we set the "darkness" point. This
|
||||||
|
// is to compensate for the fact that the engine "smoothes" the light
|
||||||
|
// and therefore will often never arrive at 0 light intensity.
|
||||||
|
const float lightDarknessLevel = 8.0 / 256.0;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIGHT
|
||||||
|
uniform sampler2D ambientTex;
|
||||||
|
|
||||||
|
uniform mat3x2 ambientTransform;
|
||||||
|
uniform float ambientBrightness;
|
||||||
|
|
||||||
|
uniform sampler2D lightTex;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Gamma uniforms
|
||||||
|
uniform vec3 gamma;
|
||||||
|
|
||||||
|
// 0 if backface culling is enabled, 1 if it is disabled
|
||||||
|
uniform float cullMode;
|
||||||
|
|
||||||
|
// Light dot product, taking cull mode into account
|
||||||
|
float lightDot(vec3 normal, vec3 lightDir) {
|
||||||
|
return abs(max(-cullMode, dot(normalize(normal), lightDir)));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 extend_normal(vec2 v)
|
||||||
|
{
|
||||||
|
// the higher the second value, the further away the light source from the landscape
|
||||||
|
return normalize(vec3(v, 0.45));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts the pixel range 0.0..1.0 into the integer range 0..255
|
||||||
|
int f2i(float x) {
|
||||||
|
return int(x * 255.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(texture+5)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_LIGHT
|
||||||
|
|
||||||
|
// Query light texture
|
||||||
|
vec2 lightDirCoord = lightCoord.st;
|
||||||
|
|
||||||
|
vec4 lightPx = texture2D(lightTex, lightDirCoord);
|
||||||
|
float lightBright = 2.0*max(0.0, lightPx.a-lightDarknessLevel);
|
||||||
|
vec3 lightDir = extend_normal(vec2(1.0, 1.0) - lightPx.yz * 3.0);
|
||||||
|
|
||||||
|
// Query light color texture (part of the light texture)
|
||||||
|
vec2 lightColorCoord = lightCoord.st - vec2(0.0, 0.5); // subtract offset for the color texture
|
||||||
|
|
||||||
|
vec3 lightColor = texture2D(lightTex, lightColorCoord.st).rgb;
|
||||||
|
|
||||||
|
// Normalise light colour
|
||||||
|
#ifdef LIGHT_DEBUG_COLOR
|
||||||
|
lightBright = 0.5;
|
||||||
|
lightColor = vec4(1.0, 0.0, 1.0, 1.0);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
// When lighting is disabled, put a light source coming from the camera.
|
||||||
|
// Note that in most cases this does not actually matter, since in the
|
||||||
|
// case with lighting disabled, ambient lighting takes fully over.
|
||||||
|
float lightBright = 0.5;
|
||||||
|
vec3 lightDir = vec3(0.0, 0.0, 1.0);
|
||||||
|
vec3 lightColor = vec3(1.0, 1.0, 1.0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIGHT
|
||||||
|
// Ambient light
|
||||||
|
// Extra .xy since some old intel drivers return a vec3
|
||||||
|
float ambient = texture2D(ambientTex, (ambientTransform * vec3(gl_FragCoord.xy, 1.0)).xy).r * ambientBrightness;
|
||||||
|
#else
|
||||||
|
// Lighting disabled: Ambient light everywhere
|
||||||
|
float ambient = 1.0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(light)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Light dot product, taking backface culling into account
|
||||||
|
normal = normalize(normal);
|
||||||
|
float light = lightDot(normal, lightDir);
|
||||||
|
// Amount of reflection, depending on the angle where material reflects most
|
||||||
|
light = min(light / matAngle, 2.0 - light / matAngle);
|
||||||
|
|
||||||
|
#ifdef LANDSCAPE
|
||||||
|
normal2 = normalize(normal2);
|
||||||
|
float light2 = lightDot(normal2, lightDir);
|
||||||
|
light2 = min(light2 / matAngle2, 2.0 - light2 / matAngle2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(light+1)
|
||||||
|
{
|
||||||
|
#ifdef LANDSCAPE
|
||||||
|
// For landscape, ambient brightness is coming from top
|
||||||
|
vec3 ambientDir = normalize(vec3(0.0, -1.0, 1.0));
|
||||||
|
#else
|
||||||
|
// For objects, ambient brightness is coming from the front
|
||||||
|
vec3 ambientDir = vec3(0.0, 0.0, 1.0);
|
||||||
|
#endif
|
||||||
|
// Add ambience to brightness
|
||||||
|
lightBright = mix(lightBright, 1.0, ambient);
|
||||||
|
light = mix(light, 0.5 * (ambient + lightDot(normal, ambientDir)), ambient);
|
||||||
|
#ifdef LANDSCAPE
|
||||||
|
light2 = mix(light2, 0.5 * (ambient + lightDot(normal2, ambientDir)), ambient);
|
||||||
|
#endif
|
||||||
|
lightColor = mix(lightColor, vec3(1.0,1.0,1.0), ambient);
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(color+5)
|
||||||
|
{
|
||||||
|
// Normalize light colour
|
||||||
|
vec3 lightColorNorm = sqrt(3.0) * normalize(lightColor);
|
||||||
|
|
||||||
|
// Add light. Depending on material properties, we make it more
|
||||||
|
// "spotty" and allow the material to self-illuminate. The light
|
||||||
|
// brightness overrules everything though (= FoW is last factor).
|
||||||
|
vec3 spotLight = pow(vec3(light,light,light), matSpot);
|
||||||
|
color.rgb = lightBright * color.rgb * (matEmit + lightColorNorm * spotLight);
|
||||||
|
#ifdef LANDSCAPE
|
||||||
|
vec3 spotLight2 = pow(vec3(light2,light2,light2), matSpot2);
|
||||||
|
color2.rgb = lightBright * color2.rgb * (matEmit2 + lightColorNorm * spotLight2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(finish+5)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef LIGHT_DEBUG
|
||||||
|
#ifdef HAVE_LIGHT
|
||||||
|
float lightYDir = lightPx.b - 1.0/3.0;
|
||||||
|
float lightXDir = lightPx.g - 1.0/3.0;
|
||||||
|
float lightStrength = lightPx.a;
|
||||||
|
color =
|
||||||
|
vec4(lightStrength * vec3(1.0-1.5*(max(0.0, lightYDir) + max(0.0,lightXDir)),
|
||||||
|
1.0-1.5*(max(0.0, lightYDir) + max(0.0,-lightXDir)),
|
||||||
|
1.0-1.5*max(0.0, -lightYDir)),
|
||||||
|
1.0);
|
||||||
|
#else
|
||||||
|
color = vec4(0.0, 0.0, 0.0, 0.0); // invisible
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(finish+10) {
|
||||||
|
color = vec4(pow(color.rgb, gamma), color.a);
|
||||||
|
}
|
|
@ -1,7 +0,0 @@
|
||||||
|
|
||||||
// Gamma uniforms
|
|
||||||
uniform vec3 gamma;
|
|
||||||
|
|
||||||
slice(finish+10) {
|
|
||||||
color = vec4(pow(color.rgb, gamma), color.a);
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
|
|
||||||
|
|
||||||
// Input textures
|
// Input textures
|
||||||
uniform sampler2D landscapeTex[2];
|
uniform sampler2D landscapeTex[2];
|
||||||
uniform sampler2D scalerTex;
|
uniform sampler2D scalerTex;
|
||||||
|
@ -11,11 +10,7 @@ uniform vec2 resolution;
|
||||||
// Center position
|
// Center position
|
||||||
uniform vec2 center;
|
uniform vec2 center;
|
||||||
// Texture map
|
// Texture map
|
||||||
#ifndef NO_BROKEN_ARRAYS_WORKAROUND
|
|
||||||
uniform sampler1D matMapTex;
|
uniform sampler1D matMapTex;
|
||||||
#else
|
|
||||||
uniform float matMap[256];
|
|
||||||
#endif
|
|
||||||
uniform int materialDepth;
|
uniform int materialDepth;
|
||||||
uniform vec2 materialSize;
|
uniform vec2 materialSize;
|
||||||
|
|
||||||
|
@ -25,20 +20,15 @@ const vec2 scalerStepY = vec2(0.0, 1.0 / 32.0);
|
||||||
const vec2 scalerOffset = scalerStepX / 3.0 + scalerStepY / 3.0;
|
const vec2 scalerOffset = scalerStepX / 3.0 + scalerStepY / 3.0;
|
||||||
const vec2 scalerPixel = vec2(scalerStepX.x, scalerStepY.y) / 3.0;
|
const vec2 scalerPixel = vec2(scalerStepX.x, scalerStepY.y) / 3.0;
|
||||||
|
|
||||||
// Parameters
|
// How much % the normals from the normal map are added up to the
|
||||||
|
// landscape normal. The higher the strength, the more structure
|
||||||
|
// within the material is visible but also the less the borders
|
||||||
|
// between the different materials stand out.
|
||||||
|
const float normalMapStrength = 0.20;
|
||||||
|
|
||||||
// how much % the normals from the normal map are added up to the landscape normal. The higher the strength, the more
|
vec4 queryMatMap(int pix)
|
||||||
// structure within the material is visible but also the less the borders between the different materials stand out.
|
|
||||||
const float normalMapStrength = 0.75;
|
|
||||||
|
|
||||||
float queryMatMap(int pix)
|
|
||||||
{
|
{
|
||||||
#ifndef NO_BROKEN_ARRAYS_WORKAROUND
|
return texture1D(matMapTex, float(pix) / 2.0 / 256.0 + 0.5 / 2.0 / 256.0);
|
||||||
int idx = f2i(texture1D(matMapTex, float(pix) / 256.0 + 0.5 / 256.0).r);
|
|
||||||
return float(idx) / 256.0 + 0.5 / float(materialDepth);
|
|
||||||
#else
|
|
||||||
return matMap[pix];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slice(coordinate)
|
slice(coordinate)
|
||||||
|
@ -63,44 +53,74 @@ slice(texture)
|
||||||
// our pixel color (without/with interpolation)
|
// our pixel color (without/with interpolation)
|
||||||
vec4 landscapePx = texture2D(landscapeTex[0], centerCoo);
|
vec4 landscapePx = texture2D(landscapeTex[0], centerCoo);
|
||||||
vec4 realLandscapePx = texture2D(landscapeTex[0], texCoo);
|
vec4 realLandscapePx = texture2D(landscapeTex[0], texCoo);
|
||||||
|
|
||||||
|
// find scaler coordinate
|
||||||
|
vec2 scalerCoo = scalerOffset + mod(pixelCoo, vec2(1.0, 1.0)) * scalerPixel;
|
||||||
|
int iScaler = f2i(landscapePx.a), iRow = iScaler / 8;
|
||||||
|
scalerCoo.x += float(iScaler - iRow * 8) / 8.0;
|
||||||
|
scalerCoo.y += float(iScaler / 8) / 32.0;
|
||||||
|
|
||||||
|
// query scaler texture
|
||||||
|
vec4 scalerPx = texture2D(scalerTex, scalerCoo);
|
||||||
|
|
||||||
|
// Get "second" landscape pixel
|
||||||
|
vec2 centerCoo2 = centerCoo + fullStep * floor(vec2(-0.5, -0.5) +
|
||||||
|
scalerPx.gb * 255.0 / 64.0);
|
||||||
|
vec4 landscapePx2 = texture2D(landscapeTex[0], centerCoo2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slice(material)
|
slice(material)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get material pixels
|
// Get material properties from material map
|
||||||
float materialIx = queryMatMap(f2i(landscapePx.r));
|
int matMapIx = f2i(landscapePx.r);
|
||||||
|
vec4 matMap = queryMatMap(2*matMapIx);
|
||||||
|
vec4 matMapX = queryMatMap(2*matMapIx+1);
|
||||||
|
float materialIx = float(f2i(matMap.a)) / 256.0 + 0.5 / float(materialDepth);
|
||||||
|
vec3 matEmit = matMap.rgb;
|
||||||
|
vec3 matSpot = matMapX.rgb * 255.9f / 16.0f;
|
||||||
|
float matAngle = matMapX.a;
|
||||||
|
|
||||||
|
// Query material texture pixels
|
||||||
vec4 materialPx = texture3D(materialTex, vec3(materialCoo, materialIx));
|
vec4 materialPx = texture3D(materialTex, vec3(materialCoo, materialIx));
|
||||||
vec4 normalPx = texture3D(materialTex, vec3(materialCoo, materialIx+0.5));
|
vec4 normalPx = texture3D(materialTex, vec3(materialCoo, materialIx+0.5));
|
||||||
|
|
||||||
// Same for second pixel, but we'll simply use the first normal
|
// Same for second pixel
|
||||||
#ifdef HAVE_2PX
|
int matMapIx2 = f2i(landscapePx2.r);
|
||||||
float materialIx2 = queryMatMap(f2i(landscapePx2.r));
|
vec4 matMap2 = queryMatMap(2*matMapIx2);
|
||||||
|
vec4 matMapX2 = queryMatMap(2*matMapIx2+1);
|
||||||
|
float materialIx2 = float(f2i(matMap2.a)) / 256.0 + 0.5 / float(materialDepth);
|
||||||
|
vec3 matEmit2 = matMap2.rgb;
|
||||||
|
vec3 matSpot2 = matMapX2.rgb * 255.9f / 16.0f;
|
||||||
|
float matAngle2 = matMapX2.a;
|
||||||
|
|
||||||
|
// Query material texture pixels
|
||||||
vec4 materialPx2 = texture3D(materialTex, vec3(materialCoo, materialIx2));
|
vec4 materialPx2 = texture3D(materialTex, vec3(materialCoo, materialIx2));
|
||||||
vec4 normalPx2 = texture3D(materialTex, vec3(materialCoo, materialIx2+0.5));
|
vec4 normalPx2 = texture3D(materialTex, vec3(materialCoo, materialIx2+0.5));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slice(normal)
|
slice(normal)
|
||||||
{
|
{
|
||||||
// Normal calculation
|
// Normal calculation
|
||||||
vec3 normal = extend_normal(mix(realLandscapePx.yz, landscapePx.yz, scalerPx.a)
|
vec3 normal = extend_normal(1.5 * (mix(realLandscapePx.yz, landscapePx.yz, scalerPx.a)
|
||||||
- vec2(0.5, 0.5));
|
- vec2(0.5, 0.5)));
|
||||||
vec3 textureNormal = normalPx.xyz - vec3(0.5,0.5,0.5);
|
vec3 textureNormal = normalPx.xyz - vec3(0.5,0.5,0.5);
|
||||||
normal = normal + textureNormal * normalMapStrength;
|
normal = mix(textureNormal, normal, normalMapStrength);
|
||||||
|
|
||||||
#ifdef HAVE_2PX
|
|
||||||
vec3 normal2 = extend_normal(landscapePx2.yz - vec2(0.5, 0.5));
|
vec3 normal2 = extend_normal(landscapePx2.yz - vec2(0.5, 0.5));
|
||||||
vec3 textureNormal2 = normalPx2.xyz - vec3(0.5,0.5,0.5);
|
vec3 textureNormal2 = normalPx2.xyz - vec3(0.5,0.5,0.5);
|
||||||
normal2 = normal2 + textureNormal2 * normalMapStrength;
|
normal2 = mix(textureNormal2, normal2, normalMapStrength);
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slice(color) {
|
slice(color) {
|
||||||
#define color gl_FragColor
|
#define color gl_FragColor
|
||||||
color = materialPx;
|
color = materialPx;
|
||||||
#ifdef HAVE_2PX
|
|
||||||
vec4 color2 = materialPx2;
|
vec4 color2 = materialPx2;
|
||||||
#endif
|
}
|
||||||
|
|
||||||
|
slice(color+10) {
|
||||||
|
// Mix second color into main color according to scaler
|
||||||
|
color = mix(color2, color, scalerPx.r);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
|
|
||||||
// Base light calculations
|
|
||||||
|
|
||||||
#ifdef HAVE_LIGHT
|
|
||||||
uniform sampler2D lightTex;
|
|
||||||
#endif
|
|
||||||
uniform float cullMode; // 0 if backface culling is enabled, 1 if it is disabled
|
|
||||||
|
|
||||||
// uncomment the following lines for debugging light directions:
|
|
||||||
// yellow: light up, blue: light down, turqoise: light right, pink: light left
|
|
||||||
// brightness: light strength
|
|
||||||
//#define LIGHT_DEBUG
|
|
||||||
|
|
||||||
// uncomment the following lines for debugging light color:
|
|
||||||
// the light will always come from the front and have a uniform brightness.
|
|
||||||
//#define LIGHT_DEBUG_COLOR
|
|
||||||
|
|
||||||
// uncomment the following lines to set the light color to pink for all lights for debugging:
|
|
||||||
//#define LIGHT_DEBUG_PINK
|
|
||||||
|
|
||||||
// At what point of light intensity we set the "darkness" point. This
|
|
||||||
// is to compensate for the fact that the engine "smoothes" the light
|
|
||||||
// and therefore will often never arrive at 0 light intensity.
|
|
||||||
const float lightDarknessLevel = 8.0 / 256.0;
|
|
||||||
|
|
||||||
slice(texture+5)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_LIGHT
|
|
||||||
|
|
||||||
// Query light texture
|
|
||||||
vec2 lightDirCoord = lightCoord.st;
|
|
||||||
|
|
||||||
vec4 lightPx = texture2D(lightTex, lightDirCoord);
|
|
||||||
float lightBright = max(0.0, lightPx.a-lightDarknessLevel);
|
|
||||||
vec3 lightDir = extend_normal(vec2(1.0, 1.0) - lightPx.yz * 3.0);
|
|
||||||
|
|
||||||
// Query light color texture (part of the light texture)
|
|
||||||
vec2 lightColorCoord = lightCoord.st - vec2(0.0, 0.5); // subtract offset for the color texture
|
|
||||||
|
|
||||||
vec4 lightColor = texture2D(lightTex, lightColorCoord.st);
|
|
||||||
|
|
||||||
#ifdef LIGHT_DEBUG_COLOR
|
|
||||||
lightBright = 0.5;
|
|
||||||
lightDir = vec3(0.0, 0.0, 1.0);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
// When lighting is disabled, put a light source coming from the camera.
|
|
||||||
// Note that in most cases this does not actually matter, since in the
|
|
||||||
// case with lighting disabled, ambient lighting takes fully over.
|
|
||||||
float lightBright = 0.5;
|
|
||||||
vec3 lightDir = vec3(0.0, 0.0, 1.0);
|
|
||||||
|
|
||||||
vec4 lightColor = vec4(1.0, 1.0, 1.0, 1.0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(light)
|
|
||||||
{
|
|
||||||
float light = 2.0 * lightBright * max(max(dot(normal, lightDir), 0.0), cullMode * max(dot(-normal, lightDir), 0.0));
|
|
||||||
#ifdef HAVE_2PX
|
|
||||||
float light2 = 2.0 * lightBright * max(max(dot(normal2, lightDir), 0.0), cullMode * max(dot(-normal2, lightDir), 0.0));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(color+5)
|
|
||||||
{
|
|
||||||
// pink shade for debugging!
|
|
||||||
#ifdef LIGHT_DEBUG_PINK
|
|
||||||
lightColor = vec4(1.0, 0.0, 1.0, 1.0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
lightColor.rgb = sqrt(3.0) * normalize(lightColor.rgb);
|
|
||||||
|
|
||||||
// Add light
|
|
||||||
color.rgb = light * color.rgb * lightColor.rgb;
|
|
||||||
#ifdef HAVE_2PX
|
|
||||||
color2.rgb = light2 * color2.rgb * lightColor.rgb;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(finish+5)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef LIGHT_DEBUG
|
|
||||||
#ifdef HAVE_LIGHT
|
|
||||||
float lightYDir = lightPx.b - 1.0/3.0;
|
|
||||||
float lightXDir = lightPx.g - 1.0/3.0;
|
|
||||||
float lightStrength = lightPx.a;
|
|
||||||
color =
|
|
||||||
vec4(lightStrength * vec3(1.0-1.5*(max(0.0, lightYDir) + max(0.0,lightXDir)),
|
|
||||||
1.0-1.5*(max(0.0, lightYDir) + max(0.0,-lightXDir)),
|
|
||||||
1.0-1.5*max(0.0, -lightYDir)),
|
|
||||||
1.0);
|
|
||||||
#else
|
|
||||||
color = vec4(0.0, 0.0, 0.0, 0.0); // invisible
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
uniform vec4 clrMod;
|
|
||||||
|
|
||||||
slice(init)
|
|
||||||
{
|
|
||||||
#define color gl_FragColor
|
|
||||||
|
|
||||||
#ifdef MESH
|
|
||||||
// TODO: Add emission part of the material. Note we cannot just
|
|
||||||
// add this to the color, but it would need to be handled separately,
|
|
||||||
// such that it is independent from the incident light direction.
|
|
||||||
color = gl_FrontMaterial.diffuse;
|
|
||||||
#else
|
|
||||||
vec4 baseColor = gl_Color;
|
|
||||||
color = baseColor;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(color)
|
|
||||||
{
|
|
||||||
// TODO: Instead of a conditional, we could compute the color as
|
|
||||||
// color = A + B*color + C*clrMod + D*color*clrMod;
|
|
||||||
// Then, mod2 would be A=-0.5, B=1, C=1, D=0
|
|
||||||
// and default would be A=0,B=0,C=0,D=1
|
|
||||||
// Would allow to avoid conditionsals and #ifdefs, but need 4 uniforms...
|
|
||||||
|
|
||||||
// Could also try some sort of 3x3 matrix:
|
|
||||||
// out = (color, clrmod, 1) * (A,B,C,D,E,F,0,0,G) * (color, clrmod, 1)
|
|
||||||
|
|
||||||
#ifdef CLRMOD_MOD2
|
|
||||||
color = clamp(color + clrMod - 0.5, 0.0, 1.0);
|
|
||||||
#else
|
|
||||||
color = color * clrMod;
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
uniform mat3x2 lightTransform;
|
|
||||||
#ifdef HAVE_NORMALMAP
|
|
||||||
uniform sampler2D normalTex;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MESH
|
|
||||||
varying vec3 normalDir;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
slice(texture+4)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_LIGHT
|
|
||||||
// prepare texture coordinate for light lookup in LightShader.c
|
|
||||||
// Extra .xy since some old intel drivers return a vec3
|
|
||||||
vec2 lightCoord = (lightTransform * vec3(gl_FragCoord.xy, 1.0)).xy;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(normal)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NORMALMAP
|
|
||||||
vec4 normalPx = texture2D(normalTex, texcoord.xy);
|
|
||||||
vec3 normalPxDir = 2.0 * (normalPx.xyz - vec3(0.5, 0.5, 0.5));
|
|
||||||
#ifdef MESH
|
|
||||||
// For meshes, the normal matrix is typically provided in Clonk
|
|
||||||
// coordinates, but the normal matrix incorporates a component that
|
|
||||||
// transforms from Ogre to Clonk coordinates. Therefore, we need to
|
|
||||||
// reverse that transformation for meshes.
|
|
||||||
// TODO: This could be optimized since the matrix is so simple that
|
|
||||||
// we don't need to do a full matrix multiplication.
|
|
||||||
mat3 c2o = mat3(0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0);
|
|
||||||
vec3 normal = normalize(c2o * gl_NormalMatrix * normalPxDir);
|
|
||||||
#else
|
|
||||||
vec3 normal = normalize(gl_NormalMatrix * normalPxDir);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#ifdef MESH
|
|
||||||
vec3 normal = normalDir; // Normal matrix is already applied in vertex shader
|
|
||||||
#else
|
|
||||||
vec3 normal = vec3(0.0, 0.0, 1.0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
|
||||||
|
uniform mat3x2 lightTransform;
|
||||||
|
|
||||||
|
#ifdef HAVE_NORMALMAP
|
||||||
|
uniform sampler2D normalTex;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MESH
|
||||||
|
varying vec3 normalDir;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uniform vec4 clrMod;
|
||||||
|
|
||||||
|
#ifdef HAVE_BASE
|
||||||
|
uniform sampler2D baseTex;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_OVERLAY
|
||||||
|
uniform vec4 overlayClr;
|
||||||
|
uniform sampler2D overlayTex;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
slice(material)
|
||||||
|
{
|
||||||
|
// Default material properties. TODO: Populate them?
|
||||||
|
vec3 matEmit = vec3(0.0,0.0,0.0);
|
||||||
|
vec3 matSpot = vec3(1.0,1.0,1.0);
|
||||||
|
float matAngle = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(texture)
|
||||||
|
{
|
||||||
|
#define color gl_FragColor
|
||||||
|
|
||||||
|
#ifdef MESH
|
||||||
|
// TODO: Add emission part of the material. Note we cannot just
|
||||||
|
// add this to the color, but it would need to be handled separately,
|
||||||
|
// such that it is independent from the incident light direction.
|
||||||
|
color = gl_FrontMaterial.diffuse;
|
||||||
|
#else
|
||||||
|
vec4 baseColor = gl_Color;
|
||||||
|
color = baseColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_BASE
|
||||||
|
color = baseColor * texture2D(baseTex, texcoord.xy);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_OVERLAY
|
||||||
|
// Get overlay color from overlay texture
|
||||||
|
vec4 overlay = baseColor * overlayClr * texture2D(overlayTex, texcoord.xy);
|
||||||
|
// Mix overlay with texture
|
||||||
|
float alpha0 = 1.0 - (1.0 - color.a) * (1.0 - overlay.a);
|
||||||
|
color = vec4(mix(color.rgb, overlay.rgb, overlay.a / alpha0), alpha0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(texture+4)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_LIGHT
|
||||||
|
// prepare texture coordinate for light lookup in LightShader.c
|
||||||
|
// Extra .xy since some old intel drivers return a vec3
|
||||||
|
vec2 lightCoord = (lightTransform * vec3(gl_FragCoord.xy, 1.0)).xy;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(normal)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_NORMALMAP
|
||||||
|
vec4 normalPx = texture2D(normalTex, texcoord.xy);
|
||||||
|
vec3 normalPxDir = 2.0 * (normalPx.xyz - vec3(0.5, 0.5, 0.5));
|
||||||
|
#ifdef MESH
|
||||||
|
// For meshes, the normal matrix is typically provided in Clonk
|
||||||
|
// coordinates, but the normal matrix incorporates a component that
|
||||||
|
// transforms from Ogre to Clonk coordinates. Therefore, we need to
|
||||||
|
// reverse that transformation for meshes.
|
||||||
|
// TODO: This could be optimized since the matrix is so simple that
|
||||||
|
// we don't need to do a full matrix multiplication.
|
||||||
|
mat3 c2o = mat3(0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0);
|
||||||
|
vec3 normal = normalize(c2o * gl_NormalMatrix * normalPxDir);
|
||||||
|
#else
|
||||||
|
vec3 normal = normalize(gl_NormalMatrix * normalPxDir);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef MESH
|
||||||
|
vec3 normal = normalDir; // Normal matrix is already applied in vertex shader
|
||||||
|
#else
|
||||||
|
vec3 normal = vec3(0.0, 0.0, 1.0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
slice(color)
|
||||||
|
{
|
||||||
|
// TODO: Instead of a conditional, we could compute the color as
|
||||||
|
// color = A + B*color + C*clrMod + D*color*clrMod;
|
||||||
|
// Then, mod2 would be A=-0.5, B=1, C=1, D=0
|
||||||
|
// and default would be A=0,B=0,C=0,D=1
|
||||||
|
// Would allow to avoid conditionsals and #ifdefs, but need 4 uniforms...
|
||||||
|
|
||||||
|
// Could also try some sort of 3x3 matrix:
|
||||||
|
// out = (color, clrmod, 1) * (A,B,C,D,E,F,0,0,G) * (color, clrmod, 1)
|
||||||
|
|
||||||
|
#ifdef HAVE_MOD2
|
||||||
|
color = clamp(color + clrMod - 0.5, 0.0, 1.0);
|
||||||
|
#else
|
||||||
|
color = color * clrMod;
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -1,49 +0,0 @@
|
||||||
|
|
||||||
#define HAVE_2PX
|
|
||||||
|
|
||||||
slice(texture+5)
|
|
||||||
{
|
|
||||||
// find scaler coordinate
|
|
||||||
vec2 scalerCoo = scalerOffset + mod(pixelCoo, vec2(1.0, 1.0)) * scalerPixel;
|
|
||||||
|
|
||||||
#ifdef SCALER_IN_GPU
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo - fullStepX - fullStepY).r == landscapePx.r)
|
|
||||||
scalerCoo += scalerStepX;
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo - fullStepY).r == landscapePx.r)
|
|
||||||
scalerCoo += 2.0 * scalerStepX;
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo + fullStepX - fullStepY).r == landscapePx.r)
|
|
||||||
scalerCoo += 4.0 * scalerStepX;
|
|
||||||
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo - fullStepX ).r == landscapePx.r)
|
|
||||||
scalerCoo += scalerStepY;
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo + fullStepX ).r == landscapePx.r)
|
|
||||||
scalerCoo += 2.0 * scalerStepY;
|
|
||||||
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo - fullStepX + fullStepY).r == landscapePx.r)
|
|
||||||
scalerCoo += 4.0 * scalerStepY;
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo + fullStepY).r == landscapePx.r)
|
|
||||||
scalerCoo += 8.0 * scalerStepY;
|
|
||||||
if(texture2D(landscapeTex[0], centerCoo + fullStepX + fullStepY).r == landscapePx.r)
|
|
||||||
scalerCoo += 16.0 * scalerStepY;
|
|
||||||
#else
|
|
||||||
int iScaler = f2i(landscapePx.a), iRow = iScaler / 8;
|
|
||||||
scalerCoo.x += float(iScaler - iRow * 8) / 8.0;
|
|
||||||
scalerCoo.y += float(iScaler / 8) / 32.0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Note: scalerCoo will jump around a lot, causing some GPUs to
|
|
||||||
// apparantly get confused with the level-of-detail
|
|
||||||
// calculation. We therefore try to disable LOD.
|
|
||||||
vec4 scalerPx = texture2DLod(scalerTex, scalerCoo, 0.0);
|
|
||||||
|
|
||||||
// gen3 other coordinate calculation. Still struggles a bit with 3-ways
|
|
||||||
vec2 centerCoo2 = centerCoo + fullStep * floor(vec2(-0.5, -0.5) +
|
|
||||||
scalerPx.gb * 255.0 / 64.0);
|
|
||||||
vec4 landscapePx2 = texture2D(landscapeTex[0], centerCoo2);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
slice(color+10) {
|
|
||||||
// Mix second color into main color according to scaler
|
|
||||||
color = mix(color2, color, scalerPx.r);
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
uniform vec4 overlayClr;
|
|
||||||
uniform sampler2D overlayTex;
|
|
||||||
|
|
||||||
slice(texture+1)
|
|
||||||
{
|
|
||||||
// Get overlay color from overlay texture
|
|
||||||
vec4 overlay = baseColor * overlayClr * texture2D(overlayTex, texcoord.xy);
|
|
||||||
// Mix overlay with texture
|
|
||||||
float alpha0 = 1.0 - (1.0 - color.a) * (1.0 - overlay.a);
|
|
||||||
color = vec4(mix(color.rgb, overlay.rgb, overlay.a / alpha0), alpha0);
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
uniform sampler2D baseTex;
|
|
||||||
|
|
||||||
slice(texture)
|
|
||||||
{
|
|
||||||
color = baseColor * texture2D(baseTex, texcoord.xy);
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
|
|
||||||
// #ifdef NO_TEXTURE_LOD_IN_FRAGMENT
|
|
||||||
#define texture1DLod(t,c,l) texture1D(t,c)
|
|
||||||
#define texture2DLod(t,c,l) texture2D(t,c)
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
vec3 extend_normal(vec2 v)
|
|
||||||
{
|
|
||||||
// the higher the second value, the further away the light source from the landscape
|
|
||||||
return normalize(vec3(v, 0.45));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Converts the pixel range 0.0..1.0 into the integer range 0..255
|
|
||||||
int f2i(float x) {
|
|
||||||
return int(x * 255.9);
|
|
||||||
}
|
|
||||||
|
|
|
@ -9,4 +9,7 @@ Blast2ObjectRatio=100
|
||||||
MaxAirSpeed=100
|
MaxAirSpeed=100
|
||||||
MaxSlide=1
|
MaxSlide=1
|
||||||
Placement=50
|
Placement=50
|
||||||
TextureOverlay=gold
|
TextureOverlay=gold
|
||||||
|
LightEmit=0,215,255
|
||||||
|
LightSpot=64,64,64
|
||||||
|
LightAngle=220
|
||||||
|
|
|
@ -672,7 +672,7 @@ bool C4Group::AddEntry(C4GroupEntry::EntryStatus status,
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case C4GroupEntry::C4GRES_InMemory: // Save buffer to file in folder
|
case C4GroupEntry::C4GRES_InMemory: { // Save buffer to file in folder
|
||||||
CStdFile hFile;
|
CStdFile hFile;
|
||||||
bool fOkay = false;
|
bool fOkay = false;
|
||||||
if (hFile.Create(tfname, !!childgroup))
|
if (hFile.Create(tfname, !!childgroup))
|
||||||
|
@ -683,8 +683,9 @@ bool C4Group::AddEntry(C4GroupEntry::EntryStatus status,
|
||||||
if (fHoldBuffer) { if (fBufferIsStdbuf) StdBuf::DeletePointer(membuf); else delete [] membuf; }
|
if (fHoldBuffer) { if (fBufferIsStdbuf) StdBuf::DeletePointer(membuf); else delete [] membuf; }
|
||||||
|
|
||||||
return fOkay;
|
return fOkay;
|
||||||
|
}
|
||||||
|
|
||||||
// InGrp & Deleted ignored
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
return Error("Add to folder: Invalid request");
|
return Error("Add to folder: Invalid request");
|
||||||
|
@ -1025,6 +1026,7 @@ void C4Group::ResetSearch(bool reload_contents)
|
||||||
case GRPF_File:
|
case GRPF_File:
|
||||||
SearchPtr=FirstEntry;
|
SearchPtr=FirstEntry;
|
||||||
break;
|
break;
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1073,6 +1075,7 @@ C4GroupEntry* C4Group::SearchNextEntry(const char *szName)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
// No entry found: reset search pointer
|
// No entry found: reset search pointer
|
||||||
SearchPtr=NULL;
|
SearchPtr=NULL;
|
||||||
|
@ -1151,6 +1154,7 @@ bool C4Group::Read(void *pBuffer, size_t iSize)
|
||||||
case GRPF_Folder:
|
case GRPF_Folder:
|
||||||
if (!StdFile.Read(pBuffer,iSize)) return Error("Read: Error reading from folder contents");
|
if (!StdFile.Read(pBuffer,iSize)) return Error("Read: Error reading from folder contents");
|
||||||
break;
|
break;
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1412,6 +1416,7 @@ bool C4Group::DeleteEntry(const char *szFilename, bool fRecycle)
|
||||||
break;
|
break;
|
||||||
// refresh file list
|
// refresh file list
|
||||||
ResetSearch(true);
|
ResetSearch(true);
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1443,6 +1448,7 @@ bool C4Group::Rename(const char *szFile, const char *szNewName)
|
||||||
// refresh file list
|
// refresh file list
|
||||||
ResetSearch(true);
|
ResetSearch(true);
|
||||||
break;
|
break;
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1570,6 +1576,7 @@ bool C4Group::ExtractEntry(const char *szFilename, const char *szExtractTo)
|
||||||
if (!CopyItem(szPath,szTargetFName))
|
if (!CopyItem(szPath,szTargetFName))
|
||||||
return Error("ExtractEntry: Cannot copy item");
|
return Error("ExtractEntry: Cannot copy item");
|
||||||
break;
|
break;
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1751,13 +1758,15 @@ bool C4Group::SetFilePtr2Entry(const char *szName, bool NeedsToBeAGroup)
|
||||||
if ((!centry) || (centry->Status != C4GroupEntry::C4GRES_InGroup)) return false;
|
if ((!centry) || (centry->Status != C4GroupEntry::C4GRES_InGroup)) return false;
|
||||||
return SetFilePtr(centry->Offset);
|
return SetFilePtr(centry->Offset);
|
||||||
|
|
||||||
case GRPF_Folder:
|
case GRPF_Folder: {
|
||||||
StdFile.Close();
|
StdFile.Close();
|
||||||
char path[_MAX_FNAME+1]; SCopy(FileName,path,_MAX_FNAME);
|
char path[_MAX_FNAME+1]; SCopy(FileName,path,_MAX_FNAME);
|
||||||
AppendBackslash(path); SAppend(szName,path);
|
AppendBackslash(path); SAppend(szName,path);
|
||||||
bool fSuccess = StdFile.Open(path, NeedsToBeAGroup);
|
bool fSuccess = StdFile.Open(path, NeedsToBeAGroup);
|
||||||
return fSuccess;
|
return fSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: break; // InGrp & Deleted ignored
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1805,7 +1814,7 @@ bool C4Group::Add(const char *szName, StdBuf &pBuffer, bool fChild, bool fHoldBu
|
||||||
szName,
|
szName,
|
||||||
pBuffer.getSize(),
|
pBuffer.getSize(),
|
||||||
szName,
|
szName,
|
||||||
(BYTE*) pBuffer.getData(),
|
(BYTE*) pBuffer.getMData(),
|
||||||
false,
|
false,
|
||||||
fHoldBuffer,
|
fHoldBuffer,
|
||||||
fExecutable,
|
fExecutable,
|
||||||
|
@ -1822,7 +1831,7 @@ bool C4Group::Add(const char *szName, StdStrBuf &pBuffer, bool fChild, bool fHol
|
||||||
szName,
|
szName,
|
||||||
pBuffer.getLength(),
|
pBuffer.getLength(),
|
||||||
szName,
|
szName,
|
||||||
(BYTE*) pBuffer.getData(),
|
(BYTE*) pBuffer.getMData(),
|
||||||
false,
|
false,
|
||||||
fHoldBuffer,
|
fHoldBuffer,
|
||||||
fExecutable,
|
fExecutable,
|
||||||
|
|
|
@ -72,8 +72,8 @@ void DisplayGroup(const C4Group &grp, const char *filter = NULL)
|
||||||
if (filter != NULL && !WildcardMatch(filter, entry->FileName))
|
if (filter != NULL && !WildcardMatch(filter, entry->FileName))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
printf("%*s %8d Bytes",
|
printf("%*s %8u Bytes",
|
||||||
max_fn_len,
|
int(max_fn_len),
|
||||||
entry->FileName,
|
entry->FileName,
|
||||||
entry->Size);
|
entry->Size);
|
||||||
if (entry->ChildGroup != 0)
|
if (entry->ChildGroup != 0)
|
||||||
|
@ -85,7 +85,7 @@ void DisplayGroup(const C4Group &grp, const char *filter = NULL)
|
||||||
++file_count;
|
++file_count;
|
||||||
byte_count += entry->Size;
|
byte_count += entry->Size;
|
||||||
}
|
}
|
||||||
printf("%d Entries, %d Bytes\n", file_count, byte_count);
|
printf("%lu Entries, %lu Bytes\n", file_count, byte_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintGroupInternals(C4Group &grp, int indent_level = 0)
|
void PrintGroupInternals(C4Group &grp, int indent_level = 0)
|
||||||
|
|
|
@ -247,7 +247,7 @@ bool CStdFile::Write(const void *pBuffer, int iSize)
|
||||||
int transfer;
|
int transfer;
|
||||||
if (!pBuffer) return false;
|
if (!pBuffer) return false;
|
||||||
if (!ModeWrite) return false;
|
if (!ModeWrite) return false;
|
||||||
BYTE *bypBuffer= (BYTE*) pBuffer;
|
const BYTE *bypBuffer= (const BYTE*) pBuffer;
|
||||||
while (iSize>0)
|
while (iSize>0)
|
||||||
{
|
{
|
||||||
// Space in buffer: Transfer as much as possible
|
// Space in buffer: Transfer as much as possible
|
||||||
|
@ -268,10 +268,10 @@ bool CStdFile::Write(const void *pBuffer, int iSize)
|
||||||
bool CStdFile::WriteString(const char *szStr)
|
bool CStdFile::WriteString(const char *szStr)
|
||||||
{
|
{
|
||||||
thread_check.Check();
|
thread_check.Check();
|
||||||
BYTE nl[2]={0x0D,0x0A};
|
BYTE nl[2]={0x0D,0x0A};
|
||||||
if (!szStr) return false;
|
if (!szStr) return false;
|
||||||
int size=SLen(szStr);
|
int size=SLen(szStr);
|
||||||
if (!Write((void*)szStr,size)) return false;
|
if (!Write((const void*)szStr,size)) return false;
|
||||||
if (!Write(nl,2)) return false;
|
if (!Write(nl,2)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,6 @@ void C4ConfigGraphics::CompileFunc(StdCompiler *pComp)
|
||||||
pComp->Value(mkNamingAdapt(RefreshRate, "RefreshRate", 0 ));
|
pComp->Value(mkNamingAdapt(RefreshRate, "RefreshRate", 0 ));
|
||||||
pComp->Value(mkNamingAdapt(SplitscreenDividers, "SplitscreenDividers", 1 ));
|
pComp->Value(mkNamingAdapt(SplitscreenDividers, "SplitscreenDividers", 1 ));
|
||||||
pComp->Value(mkNamingAdapt(ShowStartupMessages, "ShowStartupMessages", 1 ,false, true));
|
pComp->Value(mkNamingAdapt(ShowStartupMessages, "ShowStartupMessages", 1 ,false, true));
|
||||||
pComp->Value(mkNamingAdapt(ColorAnimation, "ColorAnimation", 0 ,false, true));
|
|
||||||
pComp->Value(mkNamingAdapt(HighResLandscape, "HighResLandscape", 1 ,false, true));
|
pComp->Value(mkNamingAdapt(HighResLandscape, "HighResLandscape", 1 ,false, true));
|
||||||
pComp->Value(mkNamingAdapt(VerboseObjectLoading, "VerboseObjectLoading", 0 ));
|
pComp->Value(mkNamingAdapt(VerboseObjectLoading, "VerboseObjectLoading", 0 ));
|
||||||
pComp->Value(mkNamingAdapt(VideoModule, "VideoModule", 0 ,false, true));
|
pComp->Value(mkNamingAdapt(VideoModule, "VideoModule", 0 ,false, true));
|
||||||
|
|
|
@ -94,7 +94,6 @@ public:
|
||||||
int32_t SplitscreenDividers;
|
int32_t SplitscreenDividers;
|
||||||
int32_t ShowStartupMessages;
|
int32_t ShowStartupMessages;
|
||||||
int32_t VerboseObjectLoading;
|
int32_t VerboseObjectLoading;
|
||||||
int32_t ColorAnimation;
|
|
||||||
int32_t HighResLandscape;
|
int32_t HighResLandscape;
|
||||||
int32_t VideoModule;
|
int32_t VideoModule;
|
||||||
int32_t MenuTransparency;
|
int32_t MenuTransparency;
|
||||||
|
|
|
@ -310,7 +310,6 @@ void C4ControlMsgBoardReply::CompileFunc(StdCompiler *pComp)
|
||||||
// *** C4ControlMsgBoardCmd
|
// *** C4ControlMsgBoardCmd
|
||||||
void C4ControlMsgBoardCmd::Execute() const
|
void C4ControlMsgBoardCmd::Execute() const
|
||||||
{
|
{
|
||||||
C4Player *source_player = ::Players.Get(player);
|
|
||||||
|
|
||||||
// don't handle this if the game isn't actually running
|
// don't handle this if the game isn't actually running
|
||||||
if (!::Game.IsRunning) return;
|
if (!::Game.IsRunning) return;
|
||||||
|
|
|
@ -479,8 +479,8 @@ void C4GameParameters::EnforceLeagueRules(C4Scenario *pScenario)
|
||||||
if (pScenario) MaxPlayers = pScenario->Head.MaxPlayerLeague;
|
if (pScenario) MaxPlayers = pScenario->Head.MaxPlayerLeague;
|
||||||
// forced league values in custom scenario parameters
|
// forced league values in custom scenario parameters
|
||||||
size_t idx=0; const C4ScenarioParameterDef *pdef; int32_t val;
|
size_t idx=0; const C4ScenarioParameterDef *pdef; int32_t val;
|
||||||
while(pdef = ::Game.ScenarioParameterDefs.GetParameterDefByIndex(idx++))
|
while((pdef = ::Game.ScenarioParameterDefs.GetParameterDefByIndex(idx++)))
|
||||||
if (val = pdef->GetLeagueValue())
|
if ((val = pdef->GetLeagueValue()))
|
||||||
ScenarioParameters.SetValue(pdef->GetID(), val, false);
|
ScenarioParameters.SetValue(pdef->GetID(), val, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -990,7 +990,7 @@ StdStrBuf GetDbgRecPktData(C4RecordChunkType eType, const StdBuf & RawData)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
for (unsigned int i=0; i<RawData.getSize(); ++i)
|
for (unsigned int i=0; i<RawData.getSize(); ++i)
|
||||||
r.AppendFormat("%02x ", (uint32_t) ((uint8_t *)RawData.getData())[i]);
|
r.AppendFormat("%02x ", (uint32_t) *getBufPtr<uint8_t>(RawData, i));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
|
@ -1083,7 +1083,7 @@ void C4Playback::Check(C4RecordChunkType eType, const uint8_t *pData, int iSize)
|
||||||
DebugRecError(FormatString("Type %s != %s", GetRecordChunkTypeName(PktInReplay.getType()), GetRecordChunkTypeName(eType)).getData());
|
DebugRecError(FormatString("Type %s != %s", GetRecordChunkTypeName(PktInReplay.getType()), GetRecordChunkTypeName(eType)).getData());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (PktInReplay.getSize() != iSize)
|
if (PktInReplay.getSize() != unsigned(iSize))
|
||||||
{
|
{
|
||||||
DebugRecError(FormatString("Size %d != %d", (int) PktInReplay.getSize(), (int) iSize).getData());
|
DebugRecError(FormatString("Size %d != %d", (int) PktInReplay.getSize(), (int) iSize).getData());
|
||||||
}
|
}
|
||||||
|
|
|
@ -521,7 +521,6 @@ void C4EditCursor::Draw(C4TargetFacet &cgo)
|
||||||
cobj->ColorMod = 0xffffffff;
|
cobj->ColorMod = 0xffffffff;
|
||||||
cobj->BlitMode = C4GFXBLIT_CLRSFC_MOD2 | C4GFXBLIT_ADDITIVE;
|
cobj->BlitMode = C4GFXBLIT_CLRSFC_MOD2 | C4GFXBLIT_ADDITIVE;
|
||||||
|
|
||||||
StdMeshInstance::FaceOrdering old_fo = StdSubMeshInstance::FO_Fixed;
|
|
||||||
if(cobj->pMeshInstance)
|
if(cobj->pMeshInstance)
|
||||||
cobj->pMeshInstance->SetFaceOrdering(StdSubMeshInstance::FO_NearestToFarthest);
|
cobj->pMeshInstance->SetFaceOrdering(StdSubMeshInstance::FO_NearestToFarthest);
|
||||||
|
|
||||||
|
|
|
@ -699,6 +699,7 @@ static void name_cell_data_func(GtkTreeViewColumn* column, GtkCellRenderer* rend
|
||||||
|
|
||||||
enum { ICON_SIZE = 24 };
|
enum { ICON_SIZE = 24 };
|
||||||
|
|
||||||
|
#ifdef _UNUSED_
|
||||||
static void icon_cell_data_func(GtkTreeViewColumn* column, GtkCellRenderer* renderer, GtkTreeModel* model, GtkTreeIter* iter, gpointer data)
|
static void icon_cell_data_func(GtkTreeViewColumn* column, GtkCellRenderer* renderer, GtkTreeModel* model, GtkTreeIter* iter, gpointer data)
|
||||||
{
|
{
|
||||||
C4Object* object = c4_list_iter_get_C4Object(model, iter);
|
C4Object* object = c4_list_iter_get_C4Object(model, iter);
|
||||||
|
@ -755,6 +756,7 @@ static void icon_cell_data_func(GtkTreeViewColumn* column, GtkCellRenderer* rend
|
||||||
|
|
||||||
g_object_set(G_OBJECT(renderer), "pixbuf", pixbuf, NULL);
|
g_object_set(G_OBJECT(renderer), "pixbuf", pixbuf, NULL);
|
||||||
}
|
}
|
||||||
|
#endif // _UNUSED_
|
||||||
|
|
||||||
void C4ObjectListDlg::Open()
|
void C4ObjectListDlg::Open()
|
||||||
{
|
{
|
||||||
|
|
|
@ -154,7 +154,7 @@ static void crash_handler(int signo, siginfo_t * si, void *)
|
||||||
case SIGTERM: write(logfd, "SIGTERM", sizeof ("SIGTERM") - 1); break;
|
case SIGTERM: write(logfd, "SIGTERM", sizeof ("SIGTERM") - 1); break;
|
||||||
}
|
}
|
||||||
char hex[sizeof(void *) * 2];
|
char hex[sizeof(void *) * 2];
|
||||||
int i; intptr_t x = reinterpret_cast<intptr_t>(si->si_addr);
|
intptr_t x = reinterpret_cast<intptr_t>(si->si_addr);
|
||||||
switch (signo)
|
switch (signo)
|
||||||
{
|
{
|
||||||
case SIGILL: case SIGFPE: case SIGSEGV: case SIGBUS: case SIGTRAP:
|
case SIGILL: case SIGFPE: case SIGSEGV: case SIGBUS: case SIGTRAP:
|
||||||
|
|
|
@ -516,7 +516,7 @@ static bool FnSoundAt(C4PropList * _this, C4String *szSound, long iX, long iY, N
|
||||||
iX += pObj->GetX();
|
iX += pObj->GetX();
|
||||||
iY += pObj->GetY();
|
iY += pObj->GetY();
|
||||||
}
|
}
|
||||||
StartSoundEffectAt(FnStringPar(szSound), iX, iY, iLevel, iCustomFalloffDistance, iPitch);
|
StartSoundEffectAt(FnStringPar(szSound), iX, iY, iLevel, iCustomFalloffDistance, iPitch, modifier);
|
||||||
// always return true (network safety!)
|
// always return true (network safety!)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2632,18 +2632,16 @@ static bool FnGainScenarioAchievement(C4PropList * _this, C4String *achievement_
|
||||||
// default parameter
|
// default parameter
|
||||||
long value = avalue.IsNil() ? 1 : (long)avalue;
|
long value = avalue.IsNil() ? 1 : (long)avalue;
|
||||||
// gain achievement
|
// gain achievement
|
||||||
bool result = true;
|
|
||||||
if (!player.IsNil() && player != NO_OWNER)
|
if (!player.IsNil() && player != NO_OWNER)
|
||||||
{
|
{
|
||||||
C4Player *plr = ::Players.Get(player);
|
C4Player *plr = ::Players.Get(player);
|
||||||
if (!plr) return false;
|
if (!plr) return false;
|
||||||
result = plr->GainScenarioAchievement(achievement_name->GetCStr(), value, for_scenario ? for_scenario->GetCStr() : NULL);
|
plr->GainScenarioAchievement(achievement_name->GetCStr(), value, for_scenario ? for_scenario->GetCStr() : NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (C4Player *plr = ::Players.First; plr; plr = plr->Next)
|
for (C4Player *plr = ::Players.First; plr; plr = plr->Next)
|
||||||
if (!plr->GainScenarioAchievement(achievement_name->GetCStr(), value, for_scenario ? for_scenario->GetCStr() : NULL))
|
plr->GainScenarioAchievement(achievement_name->GetCStr(), value, for_scenario ? for_scenario->GetCStr() : NULL);
|
||||||
result = false;
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ void C4BMPInfo::Set(int iWdt, int iHgt, int iBitDepth)
|
||||||
{
|
{
|
||||||
Default();
|
Default();
|
||||||
// Set header
|
// Set header
|
||||||
Head.bfType=*((WORD*)"BM");
|
Head.bfType=*((const WORD*)"BM");
|
||||||
Head.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+DWordAligned(iWdt)*iHgt;
|
Head.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+DWordAligned(iWdt)*iHgt;
|
||||||
Head.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
|
Head.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
|
||||||
// Set bitmap info
|
// Set bitmap info
|
||||||
|
@ -62,7 +62,7 @@ C4BMP256Info::C4BMP256Info()
|
||||||
|
|
||||||
bool C4BMP256Info::Valid()
|
bool C4BMP256Info::Valid()
|
||||||
{
|
{
|
||||||
if (Head.bfType != *((WORD*)"BM") ) return false;
|
if (Head.bfType != *((const WORD*)"BM") ) return false;
|
||||||
if ((Info.biBitCount!=8) || (Info.biCompression!=0)) return false;
|
if ((Info.biBitCount!=8) || (Info.biCompression!=0)) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ void C4BMP256Info::Set(int iWdt, int iHgt, CStdPalette *Palette)
|
||||||
{
|
{
|
||||||
Default();
|
Default();
|
||||||
// Set header
|
// Set header
|
||||||
Head.bfType=*((WORD*)"BM");
|
Head.bfType=*((const WORD*)"BM");
|
||||||
Head.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+DWordAligned(iWdt)*iHgt;
|
Head.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+DWordAligned(iWdt)*iHgt;
|
||||||
Head.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
|
Head.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
|
||||||
// Set bitmap info
|
// Set bitmap info
|
||||||
|
|
|
@ -598,22 +598,15 @@ bool CStdGL::CreateSpriteShader(C4Shader& shader, const char* name, int ssc, C4G
|
||||||
shader.AddTexCoord("texcoord");
|
shader.AddTexCoord("texcoord");
|
||||||
|
|
||||||
// Then load slices for fragment shader
|
// Then load slices for fragment shader
|
||||||
shader.AddFragmentSlice(-1, "#define OPENCLONK");
|
shader.AddFragmentSlice(-1, "#define OPENCLONK\n#define SPRITE");
|
||||||
if (ssc & C4SSC_MOD2) shader.AddFragmentSlice(-1, "#define CLRMOD_MOD2");
|
if (ssc & C4SSC_MOD2) shader.AddFragmentSlice(-1, "#define HAVE_MOD2");
|
||||||
if (ssc & C4SSC_NORMAL) shader.AddFragmentSlice(-1, "#define HAVE_NORMALMAP");
|
if (ssc & C4SSC_NORMAL) shader.AddFragmentSlice(-1, "#define HAVE_NORMALMAP");
|
||||||
if (ssc & C4SSC_LIGHT) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT");
|
if (ssc & C4SSC_LIGHT) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT");
|
||||||
shader.LoadSlices(pGroups, "UtilShader.glsl");
|
if (ssc & C4SSC_BASE) shader.AddFragmentSlice(-1, "#define HAVE_BASE");
|
||||||
shader.LoadSlices(pGroups, "ObjectBaseShader.glsl");
|
if (ssc & C4SSC_OVERLAY) shader.AddFragmentSlice(-1, "#define HAVE_OVERLAY");
|
||||||
|
|
||||||
if (ssc & C4SSC_BASE) shader.LoadSlices(pGroups, "SpriteTextureShader.glsl");
|
shader.LoadSlices(pGroups, "CommonShader.glsl");
|
||||||
if (ssc & C4SSC_OVERLAY) shader.LoadSlices(pGroups, "SpriteOverlayShader.glsl");
|
shader.LoadSlices(pGroups, "ObjectShader.glsl");
|
||||||
|
|
||||||
// In case light is disabled, these shaders use a default light source
|
|
||||||
// (typically ambient light everywhere).
|
|
||||||
shader.LoadSlices(pGroups, "ObjectLightShader.glsl");
|
|
||||||
shader.LoadSlices(pGroups, "LightShader.glsl");
|
|
||||||
shader.LoadSlices(pGroups, "AmbientShader.glsl");
|
|
||||||
shader.LoadSlices(pGroups, "GammaShader.glsl");
|
|
||||||
|
|
||||||
if (!shader.Init(name, uniformNames))
|
if (!shader.Init(name, uniformNames))
|
||||||
{
|
{
|
||||||
|
|
|
@ -380,9 +380,9 @@ bool CStdFont::AddRenderedChar(uint32_t dwChar, C4Facet *pfctTarget)
|
||||||
int at_x = iCurrentSfcX + Max(slot->bitmap_left,0);
|
int at_x = iCurrentSfcX + Max(slot->bitmap_left,0);
|
||||||
// Copy to the surface
|
// Copy to the surface
|
||||||
if (!sfcCurrent->Lock()) return false;
|
if (!sfcCurrent->Lock()) return false;
|
||||||
for (int y = 0; y < slot->bitmap.rows + fDoShadow; ++y)
|
for (unsigned int y = 0; y < slot->bitmap.rows + fDoShadow; ++y)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < slot->bitmap.width + fDoShadow; ++x)
|
for (unsigned int x = 0; x < slot->bitmap.width + fDoShadow; ++x)
|
||||||
{
|
{
|
||||||
unsigned char bAlpha, bAlphaShadow;
|
unsigned char bAlpha, bAlphaShadow;
|
||||||
if (x < slot->bitmap.width && y < slot->bitmap.rows)
|
if (x < slot->bitmap.width && y < slot->bitmap.rows)
|
||||||
|
|
|
@ -198,7 +198,7 @@ int C4Shader::ParsePosition(const char *szWhat, const char **ppPos)
|
||||||
|
|
||||||
// Lookup name
|
// Lookup name
|
||||||
int iPosition = -1;
|
int iPosition = -1;
|
||||||
for (int i = 0; i < sizeof(C4SH_PosNames) / sizeof(*C4SH_PosNames); i++) {
|
for (unsigned int i = 0; i < sizeof(C4SH_PosNames) / sizeof(*C4SH_PosNames); i++) {
|
||||||
if (SEqual(Name.getData(), C4SH_PosNames[i].Name)) {
|
if (SEqual(Name.getData(), C4SH_PosNames[i].Name)) {
|
||||||
iPosition = C4SH_PosNames[i].Position;
|
iPosition = C4SH_PosNames[i].Position;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -107,7 +107,7 @@ void C4GameOptionsList::OptionScenarioParameter::DoDropdownFill(C4GUI::ComboBox_
|
||||||
{
|
{
|
||||||
// Fill dropdown menuy with known possible options for this parameter
|
// Fill dropdown menuy with known possible options for this parameter
|
||||||
size_t idx=0; const C4ScenarioParameterDef::Option *option;
|
size_t idx=0; const C4ScenarioParameterDef::Option *option;
|
||||||
while (option = ParameterDef->GetOptionByIndex(idx++))
|
while ((option = ParameterDef->GetOptionByIndex(idx++)))
|
||||||
{
|
{
|
||||||
pFiller->AddEntry(option->Name.getData(), option->Value);
|
pFiller->AddEntry(option->Name.getData(), option->Value);
|
||||||
}
|
}
|
||||||
|
@ -333,7 +333,7 @@ void C4GameOptionsList::InitOptions()
|
||||||
if (param_defs)
|
if (param_defs)
|
||||||
{
|
{
|
||||||
size_t idx = 0; const C4ScenarioParameterDef *def;
|
size_t idx = 0; const C4ScenarioParameterDef *def;
|
||||||
while (def = param_defs->GetParameterDefByIndex(idx++))
|
while ((def = param_defs->GetParameterDefByIndex(idx++)))
|
||||||
if (!def->IsAchievement()) // achievements are displayed in scenario selection. no need to repeat them here
|
if (!def->IsAchievement()) // achievements are displayed in scenario selection. no need to repeat them here
|
||||||
new OptionScenarioParameter(this, def);
|
new OptionScenarioParameter(this, def);
|
||||||
}
|
}
|
||||||
|
@ -354,7 +354,7 @@ void C4GameOptionsList::InitOptions()
|
||||||
void C4GameOptionsList::ClearOptions()
|
void C4GameOptionsList::ClearOptions()
|
||||||
{
|
{
|
||||||
C4GUI::Element *pFirst;
|
C4GUI::Element *pFirst;
|
||||||
while (pFirst = GetFirst()) delete pFirst;
|
while ((pFirst = GetFirst())) delete pFirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
void C4GameOptionsList::Update()
|
void C4GameOptionsList::Update()
|
||||||
|
|
|
@ -129,7 +129,8 @@ void C4StartupNetListEntry::SetRefQuery(const char *szAddress, enum QueryType eQ
|
||||||
// safety: clear previous
|
// safety: clear previous
|
||||||
ClearRef();
|
ClearRef();
|
||||||
// setup layout
|
// setup layout
|
||||||
((C4Facet &) pIcon->GetFacet()) = (const C4Facet &) C4Startup::Get()->Graphics.fctNetGetRef;
|
const_cast<C4Facet &>(reinterpret_cast<const C4Facet &>(pIcon->GetFacet()))
|
||||||
|
= (const C4Facet &) C4Startup::Get()->Graphics.fctNetGetRef;
|
||||||
pIcon->SetAnimated(true, 1);
|
pIcon->SetAnimated(true, 1);
|
||||||
pIcon->SetBounds(rctIconLarge);
|
pIcon->SetBounds(rctIconLarge);
|
||||||
// init a new ref client to query
|
// init a new ref client to query
|
||||||
|
|
|
@ -537,15 +537,11 @@ bool C4LandscapeRenderGL::LoadShader(C4GroupSet *pGroups, C4Shader& shader, cons
|
||||||
if(ssc & C4SSC_LIGHT) hLightTexCoord = shader.AddTexCoord("lightCoord");
|
if(ssc & C4SSC_LIGHT) hLightTexCoord = shader.AddTexCoord("lightCoord");
|
||||||
|
|
||||||
// Then load slices for fragment shader
|
// Then load slices for fragment shader
|
||||||
shader.AddFragmentSlice(-1, "#define LANDSCAPE");
|
shader.AddFragmentSlice(-1, "#define OPENCLONK\n#define LANDSCAPE");
|
||||||
if(ssc & C4SSC_LIGHT) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT"); // sample light from light texture
|
if(ssc & C4SSC_LIGHT) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT"); // sample light from light texture
|
||||||
|
|
||||||
shader.LoadSlices(pGroups, "UtilShader.glsl");
|
shader.LoadSlices(pGroups, "CommonShader.glsl");
|
||||||
shader.LoadSlices(pGroups, "LandscapeShader.glsl");
|
shader.LoadSlices(pGroups, "LandscapeShader.glsl");
|
||||||
shader.LoadSlices(pGroups, "LightShader.glsl");
|
|
||||||
shader.LoadSlices(pGroups, "AmbientShader.glsl");
|
|
||||||
shader.LoadSlices(pGroups, "ScalerShader.glsl");
|
|
||||||
shader.LoadSlices(pGroups, "GammaShader.glsl");
|
|
||||||
|
|
||||||
// Initialise!
|
// Initialise!
|
||||||
if (!shader.Init(name, UniformNames)) {
|
if (!shader.Init(name, UniformNames)) {
|
||||||
|
@ -578,7 +574,6 @@ bool C4LandscapeRenderGL::LoadShaders(C4GroupSet *pGroups)
|
||||||
UniformNames[C4LRU_Gamma] = "gamma";
|
UniformNames[C4LRU_Gamma] = "gamma";
|
||||||
UniformNames[C4LRU_Resolution] = "resolution";
|
UniformNames[C4LRU_Resolution] = "resolution";
|
||||||
UniformNames[C4LRU_Center] = "center";
|
UniformNames[C4LRU_Center] = "center";
|
||||||
UniformNames[C4LRU_MatMap] = "matMap";
|
|
||||||
UniformNames[C4LRU_MatMapTex] = "matMapTex";
|
UniformNames[C4LRU_MatMapTex] = "matMapTex";
|
||||||
UniformNames[C4LRU_MaterialDepth] = "materialDepth";
|
UniformNames[C4LRU_MaterialDepth] = "materialDepth";
|
||||||
UniformNames[C4LRU_MaterialSize] = "materialSize";
|
UniformNames[C4LRU_MaterialSize] = "materialSize";
|
||||||
|
@ -800,7 +795,7 @@ void C4LandscapeRenderGL::AddTexturesFromMap(C4TextureMap *pMap)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void C4LandscapeRenderGL::BuildMatMap(GLfloat *pFMap, GLubyte *pIMap)
|
void C4LandscapeRenderGL::BuildMatMap(uint32_t *pTex)
|
||||||
{
|
{
|
||||||
// TODO: Still merely an inefficient placeholder for things to come...
|
// TODO: Still merely an inefficient placeholder for things to come...
|
||||||
|
|
||||||
|
@ -812,8 +807,8 @@ void C4LandscapeRenderGL::BuildMatMap(GLfloat *pFMap, GLubyte *pIMap)
|
||||||
if(!pEntry->GetTextureName())
|
if(!pEntry->GetTextureName())
|
||||||
{
|
{
|
||||||
// Undefined textures transparent
|
// Undefined textures transparent
|
||||||
if(pFMap) pFMap[pix] = 0.5 / iMaterialTextureDepth;
|
pTex[2*pix] = 0;
|
||||||
if(pIMap) pIMap[pix] = 0;
|
pTex[2*pix+1] = RGBA(0,0,0,255);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,8 +816,13 @@ void C4LandscapeRenderGL::BuildMatMap(GLfloat *pFMap, GLubyte *pIMap)
|
||||||
int iPhases = 1; const char *p = pEntry->GetTextureName();
|
int iPhases = 1; const char *p = pEntry->GetTextureName();
|
||||||
while((p = strchr(p, '-'))) { p++; iPhases++; }
|
while((p = strchr(p, '-'))) { p++; iPhases++; }
|
||||||
// Hard-coded hack. Fix me!
|
// Hard-coded hack. Fix me!
|
||||||
const int iPhaseLength = 300;
|
C4Material *pMaterial = pEntry->GetMaterial();
|
||||||
float phase = (iPhases == 1 ? 0 : float(C4TimeMilliseconds::Now().AsInt() % (iPhases * iPhaseLength)) / iPhaseLength);
|
const int iPhaseLength = pMaterial->AnimationSpeed;
|
||||||
|
float phase = 0;
|
||||||
|
if (iPhases > 1) {
|
||||||
|
phase = C4TimeMilliseconds::Now().AsInt() % (iPhases * iPhaseLength);
|
||||||
|
phase /= iPhaseLength;
|
||||||
|
}
|
||||||
|
|
||||||
// Find our transition
|
// Find our transition
|
||||||
const char *pFrom = pEntry->GetTextureName();
|
const char *pFrom = pEntry->GetTextureName();
|
||||||
|
@ -851,8 +851,17 @@ void C4LandscapeRenderGL::BuildMatMap(GLfloat *pFMap, GLubyte *pIMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign texture
|
// Assign texture
|
||||||
if(pFMap) pFMap[pix] = (gTexCoo + 0.5) / iMaterialTextureDepth;
|
int iTexCoo = int((gTexCoo * 256.0 / iMaterialTextureDepth) + 0.5);
|
||||||
if(pIMap) pIMap[pix] = int((gTexCoo * 256.0 / iMaterialTextureDepth) + 0.5);
|
pTex[2*pix] = RGBA(
|
||||||
|
Clamp(pMaterial->LightEmit[0], 0, 255),
|
||||||
|
Clamp(pMaterial->LightEmit[1], 0, 255),
|
||||||
|
Clamp(pMaterial->LightEmit[2], 0, 255),
|
||||||
|
iTexCoo);
|
||||||
|
pTex[2*pix+1] = RGBA(
|
||||||
|
Clamp(pMaterial->LightSpot[0], 0, 255),
|
||||||
|
Clamp(pMaterial->LightSpot[1], 0, 255),
|
||||||
|
Clamp(pMaterial->LightSpot[2], 0, 255),
|
||||||
|
Clamp(pMaterial->LightAngle, 0, 255));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -889,12 +898,6 @@ void C4LandscapeRenderGL::Draw(const C4TargetFacet &cgo, const C4FoWRegion *Ligh
|
||||||
ShaderCall.SetUniform2f(C4LRU_Center,
|
ShaderCall.SetUniform2f(C4LRU_Center,
|
||||||
centerX / float(Surfaces[0]->Wdt),
|
centerX / float(Surfaces[0]->Wdt),
|
||||||
centerY / float(Surfaces[0]->Hgt));
|
centerY / float(Surfaces[0]->Hgt));
|
||||||
if (shader->HaveUniform(C4LRU_MatMap))
|
|
||||||
{
|
|
||||||
GLfloat MatMap[256];
|
|
||||||
BuildMatMap(MatMap, NULL);
|
|
||||||
ShaderCall.SetUniform1fv(C4LRU_MatMap, 256, MatMap);
|
|
||||||
}
|
|
||||||
ShaderCall.SetUniform1i(C4LRU_MaterialDepth, iMaterialTextureDepth);
|
ShaderCall.SetUniform1i(C4LRU_MaterialDepth, iMaterialTextureDepth);
|
||||||
ShaderCall.SetUniform2f(C4LRU_MaterialSize,
|
ShaderCall.SetUniform2f(C4LRU_MaterialSize,
|
||||||
float(iMaterialWidth) / ::Game.C4S.Landscape.MaterialZoom,
|
float(iMaterialWidth) / ::Game.C4S.Landscape.MaterialZoom,
|
||||||
|
@ -960,9 +963,9 @@ void C4LandscapeRenderGL::Draw(const C4TargetFacet &cgo, const C4FoWRegion *Ligh
|
||||||
}
|
}
|
||||||
if(ShaderCall.AllocTexUnit(C4LRU_MatMapTex, GL_TEXTURE_1D))
|
if(ShaderCall.AllocTexUnit(C4LRU_MatMapTex, GL_TEXTURE_1D))
|
||||||
{
|
{
|
||||||
GLubyte MatMap[256];
|
uint32_t MatMap[2*256];
|
||||||
BuildMatMap(NULL, MatMap);
|
BuildMatMap(MatMap);
|
||||||
glTexImage1D(GL_TEXTURE_1D, 0, 1, 256, 0, GL_RED, GL_UNSIGNED_BYTE, MatMap);
|
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, 2*256, 0, GL_RGBA, GL_UNSIGNED_BYTE, MatMap);
|
||||||
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,6 @@ enum C4LR_Uniforms
|
||||||
C4LRU_Gamma,
|
C4LRU_Gamma,
|
||||||
C4LRU_Resolution,
|
C4LRU_Resolution,
|
||||||
C4LRU_Center,
|
C4LRU_Center,
|
||||||
C4LRU_MatMap,
|
|
||||||
C4LRU_MatMapTex,
|
C4LRU_MatMapTex,
|
||||||
C4LRU_MaterialDepth,
|
C4LRU_MaterialDepth,
|
||||||
C4LRU_MaterialSize,
|
C4LRU_MaterialSize,
|
||||||
|
@ -150,7 +149,7 @@ private:
|
||||||
void AddTextureTransition(const char *szFrom, const char *szTo);
|
void AddTextureTransition(const char *szFrom, const char *szTo);
|
||||||
void AddTextureAnim(const char *szTextureAnim);
|
void AddTextureAnim(const char *szTextureAnim);
|
||||||
void AddTexturesFromMap(C4TextureMap *pMap);
|
void AddTexturesFromMap(C4TextureMap *pMap);
|
||||||
void BuildMatMap(GLfloat *pFMap, GLubyte *pIMap);
|
void BuildMatMap(uint32_t *pTex);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -262,11 +262,16 @@ void C4MaterialCore::Clear()
|
||||||
BelowTempConvertDir = 0;
|
BelowTempConvertDir = 0;
|
||||||
AboveTempConvert = 0;
|
AboveTempConvert = 0;
|
||||||
AboveTempConvertDir = 0;
|
AboveTempConvertDir = 0;
|
||||||
ColorAnimation = 0;
|
|
||||||
TempConvStrength = 0;
|
TempConvStrength = 0;
|
||||||
MinHeightCount = 0;
|
MinHeightCount = 0;
|
||||||
SplashRate=10;
|
SplashRate=10;
|
||||||
KeepSinglePixels=false;
|
KeepSinglePixels=false;
|
||||||
|
AnimationSpeed = 20;
|
||||||
|
LightAngle = 255;
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
LightEmit[i] = 0;
|
||||||
|
LightSpot[i] = 16;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void C4MaterialCore::Default()
|
void C4MaterialCore::Default()
|
||||||
|
@ -304,7 +309,6 @@ void C4MaterialCore::CompileFunc(StdCompiler *pComp)
|
||||||
if (pComp->isCompiler()) Clear();
|
if (pComp->isCompiler()) Clear();
|
||||||
pComp->Name("Material");
|
pComp->Name("Material");
|
||||||
pComp->Value(mkNamingAdapt(toC4CStr(Name), "Name", ""));
|
pComp->Value(mkNamingAdapt(toC4CStr(Name), "Name", ""));
|
||||||
pComp->Value(mkNamingAdapt(ColorAnimation, "ColorAnimation", 0));
|
|
||||||
|
|
||||||
const StdEnumEntry<C4MaterialCoreShape> Shapes[] =
|
const StdEnumEntry<C4MaterialCoreShape> Shapes[] =
|
||||||
{
|
{
|
||||||
|
@ -368,6 +372,10 @@ void C4MaterialCore::CompileFunc(StdCompiler *pComp)
|
||||||
pComp->Value(mkNamingAdapt(MinHeightCount, "MinHeightCount", 0));
|
pComp->Value(mkNamingAdapt(MinHeightCount, "MinHeightCount", 0));
|
||||||
pComp->Value(mkNamingAdapt(SplashRate, "SplashRate", 10));
|
pComp->Value(mkNamingAdapt(SplashRate, "SplashRate", 10));
|
||||||
pComp->Value(mkNamingAdapt(KeepSinglePixels, "KeepSinglePixels", false));
|
pComp->Value(mkNamingAdapt(KeepSinglePixels, "KeepSinglePixels", false));
|
||||||
|
pComp->Value(mkNamingAdapt(AnimationSpeed, "AnimationSpeed", 100));
|
||||||
|
pComp->Value(mkNamingAdapt(LightAngle, "LightAngle", 255));
|
||||||
|
pComp->Value(mkNamingAdapt(mkArrayAdaptDM(LightEmit, 0), "LightEmit"));
|
||||||
|
pComp->Value(mkNamingAdapt(mkArrayAdaptDM(LightSpot, 16),"LightSpot"));
|
||||||
pComp->NameEnd();
|
pComp->NameEnd();
|
||||||
// material reactions
|
// material reactions
|
||||||
pComp->Value(mkNamingAdapt(mkSTLContainerAdapt(CustomReactionList),
|
pComp->Value(mkNamingAdapt(mkSTLContainerAdapt(CustomReactionList),
|
||||||
|
|
|
@ -175,11 +175,14 @@ public:
|
||||||
int32_t AboveTempConvert;
|
int32_t AboveTempConvert;
|
||||||
int32_t AboveTempConvertDir;
|
int32_t AboveTempConvertDir;
|
||||||
StdCopyStrBuf sAboveTempConvertTo;
|
StdCopyStrBuf sAboveTempConvertTo;
|
||||||
int32_t ColorAnimation;
|
|
||||||
int32_t TempConvStrength;
|
int32_t TempConvStrength;
|
||||||
int32_t MinHeightCount; // minimum material thickness in order for it to be counted
|
int32_t MinHeightCount; // minimum material thickness in order for it to be counted
|
||||||
int32_t SplashRate;
|
int32_t SplashRate;
|
||||||
bool KeepSinglePixels; // if true, single pixels are not destroyed (for vehicle)
|
bool KeepSinglePixels; // if true, single pixels are not destroyed (for vehicle)
|
||||||
|
int32_t AnimationSpeed; // frames per animation phase
|
||||||
|
int32_t LightAngle; // light angle at which we have maximum reflection
|
||||||
|
int32_t LightEmit[3]; // amount the material lights up itself
|
||||||
|
int32_t LightSpot[3]; // spot strength
|
||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
void Default();
|
void Default();
|
||||||
|
|
|
@ -854,7 +854,6 @@ bool StdMeshMaterialProgram::AddParameterNames(const StdMeshMaterialShaderParame
|
||||||
bool StdMeshMaterialProgram::CompileShader(StdMeshMaterialLoader& loader, C4Shader& shader, int ssc)
|
bool StdMeshMaterialProgram::CompileShader(StdMeshMaterialLoader& loader, C4Shader& shader, int ssc)
|
||||||
{
|
{
|
||||||
// Add standard slices
|
// Add standard slices
|
||||||
shader.AddFragmentSlice(-1, "#define MESH");
|
|
||||||
loader.AddShaderSlices(shader, ssc);
|
loader.AddShaderSlices(shader, ssc);
|
||||||
// Add our slices
|
// Add our slices
|
||||||
shader.AddVertexSlice(-1, "varying vec2 texcoord;");
|
shader.AddVertexSlice(-1, "varying vec2 texcoord;");
|
||||||
|
|
|
@ -1886,8 +1886,8 @@ bool C4NetIOUDP::InitBroadcast(addr_t *pBroadcastAddr)
|
||||||
for (int iRetries = 1000; iRetries; iRetries--)
|
for (int iRetries = 1000; iRetries; iRetries--)
|
||||||
{
|
{
|
||||||
// create new - random - address
|
// create new - random - address
|
||||||
MCAddr.sin_addr.s_addr = MCAddr.sin_addr.s_addr =
|
MCAddr.sin_addr.s_addr =
|
||||||
0x000000ef | ((rand() & 0xff) << 24) | ((rand() & 0xff) << 16) | ((rand() & 0xff) << 8);
|
0x000000ef | ((rand() & 0xff) << 24) | ((rand() & 0xff) << 16) | ((rand() & 0xff) << 8);
|
||||||
// init broadcast
|
// init broadcast
|
||||||
if (!C4NetIOSimpleUDP::InitBroadcast(&MCAddr))
|
if (!C4NetIOSimpleUDP::InitBroadcast(&MCAddr))
|
||||||
return false;
|
return false;
|
||||||
|
@ -2634,7 +2634,7 @@ void C4NetIOUDP::Peer::OnRecv(const C4NetIOPacket &rPacket) // (mt-safe)
|
||||||
}
|
}
|
||||||
// set packet counter
|
// set packet counter
|
||||||
if (fBroadcasted)
|
if (fBroadcasted)
|
||||||
iRIMCPacketCounter = iRIMCPacketCounter = pPkt->Nr;
|
iRIMCPacketCounter = iIMCPacketCounter = pPkt->Nr;
|
||||||
else
|
else
|
||||||
iRIPacketCounter = iIPacketCounter = pPkt->Nr;
|
iRIPacketCounter = iIPacketCounter = pPkt->Nr;
|
||||||
// clear incoming packets
|
// clear incoming packets
|
||||||
|
@ -2927,9 +2927,8 @@ void C4NetIOUDP::Peer::CheckCompleteIPackets()
|
||||||
// advance packet counter
|
// advance packet counter
|
||||||
iIPacketCounter = pPkt->GetNr() + pPkt->FragmentCnt();
|
iIPacketCounter = pPkt->GetNr() + pPkt->FragmentCnt();
|
||||||
// remove packet from queue
|
// remove packet from queue
|
||||||
int iNr = pPkt->GetNr();
|
|
||||||
IPackets.DeletePacket(pPkt);
|
IPackets.DeletePacket(pPkt);
|
||||||
assert(!IPackets.GetPacketFrgm(iNr));
|
assert(!IPackets.GetPacketFrgm(pPkt->GetNr()));
|
||||||
}
|
}
|
||||||
while ((pPkt = IMCPackets.GetFirstPacketComplete()))
|
while ((pPkt = IMCPackets.GetFirstPacketComplete()))
|
||||||
{
|
{
|
||||||
|
@ -2941,9 +2940,8 @@ void C4NetIOUDP::Peer::CheckCompleteIPackets()
|
||||||
// advance packet counter
|
// advance packet counter
|
||||||
iIMCPacketCounter = pPkt->GetNr() + pPkt->FragmentCnt();
|
iIMCPacketCounter = pPkt->GetNr() + pPkt->FragmentCnt();
|
||||||
// remove packet from queue
|
// remove packet from queue
|
||||||
int iNr = pPkt->GetNr();
|
|
||||||
IMCPackets.DeletePacket(pPkt);
|
IMCPackets.DeletePacket(pPkt);
|
||||||
assert(!IMCPackets.GetPacketFrgm(iNr));
|
assert(!IMCPackets.GetPacketFrgm(pPkt->GetNr()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,27 +61,15 @@ public:
|
||||||
{
|
{
|
||||||
#ifndef USE_CONSOLE
|
#ifndef USE_CONSOLE
|
||||||
// Add mesh-independent slices
|
// Add mesh-independent slices
|
||||||
shader.AddFragmentSlice(-1, "#define OPENCLONK");
|
shader.AddFragmentSlice(-1, "#define OPENCLONK\n#define MESH");
|
||||||
shader.AddVertexSlice(-1, "#define OPENCLONK");
|
shader.AddVertexSlice(-1, "#define OPENCLONK\n#define MESH");
|
||||||
|
if (ssc & C4SSC_MOD2) shader.AddFragmentSlice(-1, "#define HAVE_MOD2");
|
||||||
if (ssc & C4SSC_MOD2) shader.AddFragmentSlice(-1, "#define CLRMOD_MOD2");
|
|
||||||
if (ssc & C4SSC_LIGHT) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT");
|
if (ssc & C4SSC_LIGHT) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT");
|
||||||
|
if (ssc & C4SSC_BASE) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT");
|
||||||
|
if (ssc & C4SSC_OVERLAY) shader.AddFragmentSlice(-1, "#define HAVE_LIGHT");
|
||||||
|
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "UtilShader.glsl");
|
shader.LoadSlices(&::GraphicsResource.Files, "CommonShader.glsl");
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "ObjectBaseShader.glsl");
|
shader.LoadSlices(&::GraphicsResource.Files, "ObjectShader.glsl");
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "MeshShader.glsl");
|
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "GammaShader.glsl");
|
|
||||||
|
|
||||||
// Note that these shader slices are always loaded, even if lighting
|
|
||||||
// is disabled. The shaders then assume a default light if HAVE_LIGHT
|
|
||||||
// is not defined. This avoids completely flat shading for meshes
|
|
||||||
// that are shown as picture graphics for example.
|
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "ObjectLightShader.glsl");
|
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "LightShader.glsl");
|
|
||||||
shader.LoadSlices(&::GraphicsResource.Files, "AmbientShader.glsl");
|
|
||||||
|
|
||||||
if (ssc & C4SSC_BASE) shader.LoadSlices(&::GraphicsResource.Files, "SpriteTextureShader.glsl");
|
|
||||||
if (ssc & C4SSC_OVERLAY) shader.LoadSlices(&::GraphicsResource.Files, "SpriteOverlayShader.glsl");
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -138,12 +138,12 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
|
||||||
if (!fFullScreen)
|
if (!fFullScreen)
|
||||||
{
|
{
|
||||||
RestoreVideoMode();
|
RestoreVideoMode();
|
||||||
if (iXRes != -1)
|
if (iXRes != -1u)
|
||||||
pWindow->SetSize(iXRes, iYRes);
|
pWindow->SetSize(iXRes, iYRes);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Priv->xrandr_major_version >= 0 && !(iXRes == -1 && iYRes == -1))
|
if (Priv->xrandr_major_version >= 0 && !(iXRes == -1u && iYRes == -1u))
|
||||||
{
|
{
|
||||||
// randr spec says to always get fresh info, so don't cache.
|
// randr spec says to always get fresh info, so don't cache.
|
||||||
XRRScreenConfiguration * conf = XRRGetScreenInfo (dpy, pWindow->wnd);
|
XRRScreenConfiguration * conf = XRRGetScreenInfo (dpy, pWindow->wnd);
|
||||||
|
@ -153,7 +153,7 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
|
||||||
XRRScreenSize * sizes = XRRConfigSizes(conf, &n);
|
XRRScreenSize * sizes = XRRConfigSizes(conf, &n);
|
||||||
for (int i = 0; i < n; ++i)
|
for (int i = 0; i < n; ++i)
|
||||||
{
|
{
|
||||||
if (sizes[i].width == iXRes && sizes[i].height == iYRes)
|
if (unsigned(sizes[i].width) == iXRes && unsigned(sizes[i].height) == iYRes)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
LogF("XRRSetScreenConfig %d", i);
|
LogF("XRRSetScreenConfig %d", i);
|
||||||
|
@ -165,7 +165,7 @@ bool C4AbstractApp::SetVideoMode(unsigned int iXRes, unsigned int iYRes, unsigne
|
||||||
XRRFreeScreenConfigInfo(conf);
|
XRRFreeScreenConfigInfo(conf);
|
||||||
}
|
}
|
||||||
gtk_window_fullscreen(GTK_WINDOW(pWindow->window));
|
gtk_window_fullscreen(GTK_WINDOW(pWindow->window));
|
||||||
return fDspModeSet || (iXRes == -1 && iYRes == -1);
|
return fDspModeSet || (iXRes == -1u && iYRes == -1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
void C4AbstractApp::RestoreVideoMode()
|
void C4AbstractApp::RestoreVideoMode()
|
||||||
|
@ -204,46 +204,6 @@ bool C4AbstractApp::GetIndexedDisplayMode(int32_t iIndex, int32_t *piXRes, int32
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static XRROutputInfo* GetXRROutputInfoForWindow(Display* dpy, Window w)
|
|
||||||
{
|
|
||||||
XRRScreenResources * r = XRRGetScreenResources(dpy, w);
|
|
||||||
if (!r) return NULL;
|
|
||||||
|
|
||||||
XRROutputInfo * info = NULL;
|
|
||||||
RROutput output = XRRGetOutputPrimary(dpy, w);
|
|
||||||
if(output != 0)
|
|
||||||
{
|
|
||||||
info = XRRGetOutputInfo(dpy, r, output);
|
|
||||||
if (!info)
|
|
||||||
{
|
|
||||||
XRRFreeScreenResources(r);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!info || info->connection == RR_Disconnected || info->crtc == 0)
|
|
||||||
{
|
|
||||||
// The default "primary" output does not seem to be connected
|
|
||||||
// to a piece of actual hardware. As a fallback, go through
|
|
||||||
// all outputs and choose the first active one.
|
|
||||||
XRRFreeOutputInfo(info);
|
|
||||||
info = NULL;
|
|
||||||
for(int i = 0; i < r->noutput; ++i)
|
|
||||||
{
|
|
||||||
info = XRRGetOutputInfo(dpy, r, r->outputs[i]);
|
|
||||||
if(info->connection != RR_Disconnected && info->crtc != 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
XRRFreeOutputInfo(info);
|
|
||||||
info = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XRRFreeScreenResources(r);
|
|
||||||
if(!info) return NULL;
|
|
||||||
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the text to the clipboard or the primary selection
|
// Copy the text to the clipboard or the primary selection
|
||||||
bool C4AbstractApp::Copy(const StdStrBuf & text, bool fClipboard)
|
bool C4AbstractApp::Copy(const StdStrBuf & text, bool fClipboard)
|
||||||
{
|
{
|
||||||
|
|
|
@ -74,13 +74,13 @@ bool C4FileMonitor::Execute(int iTimeout, pollfd * pfd) // some other thread
|
||||||
uint32_t mask = event->mask;
|
uint32_t mask = event->mask;
|
||||||
C4InteractiveThread &Thread = Application.InteractiveThread;
|
C4InteractiveThread &Thread = Application.InteractiveThread;
|
||||||
if (mask & IN_CREATE)
|
if (mask & IN_CREATE)
|
||||||
Thread.PushEvent(Ev_FileChange, (void*)file);
|
Thread.PushEvent(Ev_FileChange, const_cast<char*>(file));
|
||||||
if (mask & IN_MODIFY)
|
if (mask & IN_MODIFY)
|
||||||
Thread.PushEvent(Ev_FileChange, (void*)file);
|
Thread.PushEvent(Ev_FileChange, const_cast<char*>(file));
|
||||||
if (mask & IN_MOVED_TO)
|
if (mask & IN_MOVED_TO)
|
||||||
Thread.PushEvent(Ev_FileChange, (void*)file);
|
Thread.PushEvent(Ev_FileChange, const_cast<char*>(file));
|
||||||
if (mask & IN_MOVE_SELF)
|
if (mask & IN_MOVE_SELF)
|
||||||
Thread.PushEvent(Ev_FileChange, (void*)file);
|
Thread.PushEvent(Ev_FileChange, const_cast<char*>(file));
|
||||||
// FIXME: (*(inotify_event*)buf).name);
|
// FIXME: (*(inotify_event*)buf).name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -310,7 +310,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors)
|
||||||
if (!pPar2->_getInt())
|
if (!pPar2->_getInt())
|
||||||
throw new C4AulExecError("division by zero");
|
throw new C4AulExecError("division by zero");
|
||||||
// INT_MIN/-1 cannot be represented in an int and would cause an uncaught exception
|
// INT_MIN/-1 cannot be represented in an int and would cause an uncaught exception
|
||||||
if (pPar1->_getInt()==0x80000000 && pPar2->_getInt()==-1)
|
if (pPar1->_getInt()==INT32_MAX && pPar2->_getInt()==-1)
|
||||||
throw new C4AulExecError("division overflow");
|
throw new C4AulExecError("division overflow");
|
||||||
pPar1->SetInt(pPar1->_getInt() / pPar2->_getInt());
|
pPar1->SetInt(pPar1->_getInt() / pPar2->_getInt());
|
||||||
PopValue();
|
PopValue();
|
||||||
|
@ -329,7 +329,7 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors)
|
||||||
CheckOpPars(C4V_Int, C4V_Int, "%");
|
CheckOpPars(C4V_Int, C4V_Int, "%");
|
||||||
C4Value *pPar1 = pCurVal - 1, *pPar2 = pCurVal;
|
C4Value *pPar1 = pCurVal - 1, *pPar2 = pCurVal;
|
||||||
// INT_MIN%-1 cannot be represented in an int and would cause an uncaught exception
|
// INT_MIN%-1 cannot be represented in an int and would cause an uncaught exception
|
||||||
if (pPar1->_getInt()==0x80000000 && pPar2->_getInt()==-1)
|
if (pPar1->_getInt()==INT32_MAX && pPar2->_getInt()==-1)
|
||||||
throw new C4AulExecError("modulo division overflow");
|
throw new C4AulExecError("modulo division overflow");
|
||||||
if (pPar2->_getInt())
|
if (pPar2->_getInt())
|
||||||
pPar1->SetInt(pPar1->_getInt() % pPar2->_getInt());
|
pPar1->SetInt(pPar1->_getInt() % pPar2->_getInt());
|
||||||
|
|
|
@ -57,11 +57,15 @@ C4String::C4String()
|
||||||
C4String::~C4String()
|
C4String::~C4String()
|
||||||
{
|
{
|
||||||
// unreg
|
// unreg
|
||||||
|
#ifdef _DEBUG
|
||||||
static bool remove = false;
|
static bool remove = false;
|
||||||
assert(!remove);
|
assert(!remove);
|
||||||
remove = true;
|
remove = true;
|
||||||
|
#endif
|
||||||
Strings.Set.Remove(this);
|
Strings.Set.Remove(this);
|
||||||
|
#ifdef _DEBUG
|
||||||
remove = false;
|
remove = false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void C4String::operator=(const char * s)
|
void C4String::operator=(const char * s)
|
||||||
|
|
Loading…
Reference in New Issue