Add blob and fix some issues

This commit is contained in:
schmelczerandras 2020-08-18 09:40:51 +02:00
commit edca93fcfe

View file

@ -3,10 +3,7 @@
precision mediump float;
#define LINE_COUNT {lineCount}
#define CAVE_COLOR vec3(0.36, 0.38, 0.76)
#define AIR_COLOR vec3(0.7)
#define DISTANCE_SCALE {distanceScale}
#define DISTANCE_OFFSET {distanceOffset}
#define BLOB_COUNT {blobCount}
uniform float maxMinDistance;
@ -17,32 +14,76 @@ uniform float maxMinDistance;
float fromRadius;
float toRadius;
}[LINE_COUNT] lines;
#endif
in vec2 worldCoordinates;
out vec4 fragmentColor;
void main() {
float realDistance = 0.0;
#if LINE_COUNT > 0
float minDistance = maxMinDistance;
void lineMinDistance(vec2 worldCoordinates, inout float minDistance) {
minDistance = maxMinDistance;
for (int i = 0; i < LINE_COUNT; i++) {
vec2 targetFromDelta = worldCoordinates - lines[i].from;
vec2 toFromDelta = lines[i].toFromDelta;
float h = clamp(dot(targetFromDelta, toFromDelta) / dot(toFromDelta, toFromDelta), 0.0, 1.0);
float lineDistance = distance(targetFromDelta, toFromDelta * h) - mix(lines[i].fromRadius, lines[i].toRadius, h);
float h = clamp(
dot(targetFromDelta, toFromDelta) / dot(toFromDelta, toFromDelta),
0.0, 1.0
);
float lineDistance = (
distance(targetFromDelta, toFromDelta * h)
- mix(lines[i].fromRadius, lines[i].toRadius, h)
);
minDistance = min(minDistance, lineDistance);
}
realDistance = -minDistance;
minDistance *= -1.0;
}
#endif
#if BLOB_COUNT > 0
#define headRadius {headRadius}
#define torsoRadius {torsoRadius}
#define footRadius {footRadius}
uniform struct Blob {
vec2 headCenter;
vec2 torsoCenter;
vec2 leftFootCenter;
vec2 rightFootCenter;
}[BLOB_COUNT] blobs;
float circleMinDistance(vec2 worldCoordinates, vec2 circleCenter, float radius) {
return distance(worldCoordinates, circleCenter) - radius;
}
void blobMinDistance(vec2 worldCoordinates, inout float minDistance) {
float k = 1.0;
for (int i = 0; i < BLOB_COUNT; i++) {
float res = exp2(-k * circleMinDistance(worldCoordinates, blobs[i].headCenter, headRadius));
res += exp2(-k * circleMinDistance(worldCoordinates, blobs[i].torsoCenter, torsoRadius));
res += exp2(-k * circleMinDistance(worldCoordinates, blobs[i].leftFootCenter, footRadius));
res += exp2(-k * circleMinDistance(worldCoordinates, blobs[i].rightFootCenter, footRadius));
minDistance = min(minDistance, -log2(res) / k);
}
}
#endif
in vec2 worldCoordinates;
out vec2 fragmentColor;
void main() {
float minDistance = -maxMinDistance;
#if LINE_COUNT > 0
lineMinDistance(worldCoordinates, minDistance);
#endif
fragmentColor = vec4(
mix(CAVE_COLOR, AIR_COLOR, clamp(realDistance, 0.0, 1.0)),
(realDistance + DISTANCE_OFFSET) / DISTANCE_SCALE
#if BLOB_COUNT > 0
blobMinDistance(worldCoordinates, minDistance);
#endif
);
fragmentColor = vec2(minDistance, 0.0);
}