Skip to content

Commit c9260b9

Browse files
committed
reintroducing shader
1 parent cf5c98a commit c9260b9

3 files changed

Lines changed: 197 additions & 1 deletion

File tree

src/main/java/dev/propulsionteam/propulsionsimulated/content/thruster/MeshedThrusterFlameUtils.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727

2828
public class MeshedThrusterFlameUtils {
2929

30-
public static final ResourceLocation THRUSTER_FLAME_SHADER = ResourceLocation.fromNamespaceAndPath("aeronautics", "burner_flame");
30+
public static final ResourceLocation THRUSTER_FLAME_SHADER = CreatePropulsion.loc("thruster_flame");
31+
// ResourceLocation.fromNamespaceAndPath("aeronautics", "burner_flame");
3132
private static final float FLAME_SIZE = 2f;
3233
private static final float BLOCK_PIXEL = 1f / 16f;
3334
private static final float FLAME_PIXEL = BLOCK_PIXEL / FLAME_SIZE;
@@ -156,6 +157,7 @@ public static void renderMeshVectorFlame(AbstractThrusterBlockEntity be, float p
156157

157158
/**
158159
* return a random float between 0 and 1 based on the seed
160+
*
159161
* @param seed
160162
* @return
161163
*/
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
#include aeronautics:util
2+
#include veil:fog
3+
4+
// Vertex shader inputs & Fragment outputs
5+
in float vertexDistance;
6+
in vec2 texCoord0;
7+
out vec4 fragColor;
8+
9+
// External engine uniforms (names preserved to maintain host application bindings)
10+
uniform sampler2D FirePalette;
11+
uniform float FlameRenderTime;
12+
uniform float Intensity;
13+
uniform float Palette;
14+
uniform float WidthMultiplier;
15+
uniform float LengthMultiplier;
16+
uniform float FogStart;
17+
uniform float FogEnd;
18+
uniform vec4 FogColor;
19+
20+
/**
21+
* Obtains the final color map vector from the color palette texture.
22+
*/
23+
vec3 retrieve_palette_color(float value) {
24+
float brightness_offset = mix(0.9, 0.1, Intensity);
25+
float map_index = value + brightness_offset;
26+
27+
// Sample using inversed color step mapping
28+
return texture(FirePalette, vec2(1.0 - map_index, Palette)).rgb + 0.1;
29+
}
30+
31+
/**
32+
* Generates the central structural layer of the jet flame using animated circles.
33+
*/
34+
vec4 render_core_fire(vec2 coordinates, float t) {
35+
vec4 accumulated_color = vec4(0.0);
36+
const int MAX_BLOBS = 6;
37+
38+
vec2 size_bounds = vec2(0.15, 0.4);
39+
float horizontal_spread = 0.05;
40+
float animation_progress = t * 0.5;
41+
42+
vec2[MAX_BLOBS] dynamic_positions;
43+
44+
// Phase 1: Compute positions for individual fire elements
45+
for(int step = 0; step < MAX_BLOBS; step++) {
46+
float progression = float(step) / float(MAX_BLOBS);
47+
float current_y = mod(progression + animation_progress, 1.0);
48+
49+
int target_idx = int((1.0 - current_y) * float(MAX_BLOBS));
50+
target_idx = clamp(target_idx, 0, MAX_BLOBS);
51+
52+
int is_odd = step & 1;
53+
float shift_x = float(is_odd) * horizontal_spread - (horizontal_spread * 0.5);
54+
dynamic_positions[target_idx] = vec2(shift_x, current_y);
55+
}
56+
57+
// Phase 2: Render shapes and perform color accumulation
58+
for(int step = 0; step < MAX_BLOBS; step++) {
59+
vec2 active_pos = dynamic_positions[step];
60+
vec2 delta_pos = coordinates - active_pos;
61+
62+
float current_radius = mix(size_bounds.x, size_bounds.y, active_pos.y);
63+
vec4 blob_shape = simple_circle(delta_pos, current_radius);
64+
65+
blob_shape.xyz *= (active_pos.y * 0.8);
66+
67+
if (blob_shape.a > 0.0) {
68+
blob_shape = mix(blob_shape, vec4(1.0), abs(delta_pos.x));
69+
}
70+
71+
accumulated_color = alpha_composite(accumulated_color, blob_shape);
72+
}
73+
74+
return accumulated_color;
75+
}
76+
77+
/**
78+
* Maps continuous UV coordinates into discrete steps based on a target grid.
79+
*/
80+
vec2 apply_pixel_snapping(vec2 coord, vec2 resolution) {
81+
vec2 bounded_res = max(resolution, vec2(1.0));
82+
return (floor(coord * bounded_res) + vec2(0.5)) / bounded_res;
83+
}
84+
85+
/**
86+
* Calculates dynamic procedural mask hulls to punch holes out of the flame silhouette.
87+
*/
88+
vec2 evaluate_subtractive_masks(vec2 position, float timeline) {
89+
float intensity_modifier = (1.0 - Intensity) * 0.1;
90+
const int MASK_ELEMENTS = 9;
91+
92+
vec2 radius_limits = vec2(0.08, 0.24 + intensity_modifier);
93+
float horizontal_deviation = 0.1;
94+
float travel_speed = timeline * 1.2;
95+
float shortest_distance = 5.0;
96+
97+
for(int idx = 0; idx < MASK_ELEMENTS; idx++) {
98+
float fractional_step = float(idx) / float(MASK_ELEMENTS);
99+
float normal_y = mod(fractional_step * 2.0 + travel_speed, 2.0);
100+
101+
// Retained expression logic to preserve matching pipeline execution state
102+
int unused_index = int(floor((1.0 - normal_y) * float(MASK_ELEMENTS)));
103+
unused_index = min(max(unused_index, 0), MASK_ELEMENTS);
104+
105+
int check_odd = idx & 1;
106+
float offset_x = float(check_odd) * horizontal_deviation - (horizontal_deviation * 0.5);
107+
108+
vec2 bubble_center = vec2(offset_x, normal_y);
109+
float dynamic_r = mix(radius_limits.x, radius_limits.y, bubble_center.y);
110+
vec2 relative_vector = position - bubble_center;
111+
vec4 mask_shape = simple_circle(relative_vector, dynamic_r);
112+
113+
shortest_distance = min(shortest_distance, length(relative_vector) - dynamic_r);
114+
115+
if (mask_shape.r >= 1.0) {
116+
return vec2(0.0, 0.0);
117+
}
118+
}
119+
120+
return vec2(shortest_distance, 1.0);
121+
}
122+
123+
void main() {
124+
// Standardize viewport space and invert vertical alignment
125+
vec2 custom_uv = vec2(texCoord0.x, 1.0 - texCoord0.y);
126+
float internal_time = FlameRenderTime;
127+
128+
// Resolve targeted grid alignment dimensions
129+
vec2 calculated_res = vec2(max(WidthMultiplier, 0.03125), max(LengthMultiplier, 0.03125));
130+
vec2 grid_resolution = max(vec2(1.0), round(32.0 * calculated_res));
131+
132+
// Shift and quantize local texture spaces
133+
custom_uv.x += 0.5 / grid_resolution.x;
134+
custom_uv = apply_pixel_snapping(custom_uv, grid_resolution);
135+
custom_uv -= vec2(0.5, 0.12);
136+
custom_uv *= 1.6;
137+
138+
vec4 final_color = vec4(0.0);
139+
140+
// Render primary core flame graphics
141+
vec4 primary_flame_layer = render_core_fire(custom_uv, internal_time);
142+
final_color = alpha_composite(final_color, primary_flame_layer) * 1.3;
143+
144+
// Apply basic root base element overlay
145+
vec4 base_anchor_circle = simple_circle(custom_uv, 0.15);
146+
base_anchor_circle.rgb = vec3(0.01);
147+
final_color = alpha_composite(final_color, base_anchor_circle);
148+
149+
// First subtractive mask displacement block
150+
custom_uv -= vec2(0.3, -0.3);
151+
vec2 negative_space_a = evaluate_subtractive_masks(custom_uv, internal_time);
152+
153+
// Invert horizontal orientation and apply the secondary mask layer
154+
custom_uv *= vec2(-1.0, 1.0);
155+
custom_uv -= vec2(0.6, 0.0);
156+
vec2 negative_space_b = evaluate_subtractive_masks(custom_uv, internal_time + 0.35);
157+
158+
// Execute alpha masking operations
159+
final_color.a *= negative_space_a.y * negative_space_b.y;
160+
float proximity_boundary = min(negative_space_a.x, negative_space_b.x);
161+
162+
// Perform outer heat-burn edge color bleeding logic
163+
if (final_color.a > 0.0) {
164+
float edge_scorch = clamp((1.0 - proximity_boundary - 0.95) * 100.0, 0.0, 1.0);
165+
final_color.r = mix(final_color.r, 1.0, edge_scorch * 0.3);
166+
}
167+
168+
// Discard non-opaque edge particles early
169+
if (final_color.a < 1.0) {
170+
discard;
171+
}
172+
173+
// Color conversion lookups and structural environment fog blending
174+
final_color.rgb = retrieve_palette_color(final_color.r);
175+
fragColor = linear_fog(final_color, vertexDistance, FogStart, FogEnd, FogColor);
176+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include veil:fog
2+
3+
layout(location = 0) in vec3 Position;
4+
layout(location = 1) in vec2 UV0;
5+
6+
uniform mat4 ModelViewMat;
7+
uniform mat4 ProjMat;
8+
uniform int FogShape;
9+
10+
out vec2 texCoord0;
11+
out float vertexDistance;
12+
13+
void main() {
14+
gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0);
15+
vertexDistance = fog_distance(ModelViewMat, Position, FogShape);
16+
17+
texCoord0 = UV0;
18+
}

0 commit comments

Comments
 (0)