Skip to content

Commit 90f173f

Browse files
finished!
1 parent 3da4a46 commit 90f173f

File tree

1 file changed

+46
-34
lines changed

1 file changed

+46
-34
lines changed

src/translucent cube.py

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import pygame
22
import moderngl
33
import numpy as np
4-
from pygame.locals import DOUBLEBUF, OPENGL
4+
from pygame.locals import DOUBLEBUF, OPENGL, FULLSCREEN
55
from pyrr import Matrix44
6+
import pmma
7+
import time
68

9+
pmma.init()
10+
11+
12+
inner = pmma.ColorConverter()
13+
outer = pmma.ColorConverter()
714

815
class Cube:
916
def __init__(self, ctx, outer_size, inner_size, outer_color=(1.0, 0.0, 0.0, 1.0), inner_color=(0.0, 1.0, 0.0, 1.0), scale=1.0):
@@ -93,20 +100,16 @@ def __init__(self, ctx, outer_size, inner_size, outer_color=(1.0, 0.0, 0.0, 1.0)
93100
# Initialize rotation matrix
94101
self.rotation_matrix = Matrix44.identity()
95102

96-
def set_outer_color(self, color):
97-
self.outer_color = color
98-
self.vertices[::7] = color[0]
99-
self.vertices[1::7] = color[1]
100-
self.vertices[2::7] = color[2]
101-
self.vertices[3::7] = color[3]
102-
self.vbo.write(self.vertices)
103-
104-
def set_inner_color(self, color):
105-
self.inner_color = color
106-
self.vertices[::7] = color[0]
107-
self.vertices[1::7] = color[1]
108-
self.vertices[2::7] = color[2]
109-
self.vertices[3::7] = color[3]
103+
def set_color(self, outer_color, inner_color):
104+
self.outer_color = outer_color
105+
self.inner_color = inner_color
106+
# Update the vertex buffer with new colors
107+
for i in range(8): # Outer cube vertices
108+
start = i * 7
109+
self.vertices[start + 3:start + 7] = outer_color
110+
for i in range(8, 16): # Inner cube vertices
111+
start = i * 7
112+
self.vertices[start + 3:start + 7] = inner_color
110113
self.vbo.write(self.vertices)
111114

112115
def update_rotation(self, angle):
@@ -123,56 +126,65 @@ def lerp_color(color1, color2, t):
123126

124127
# Initialize Pygame and ModernGL
125128
pygame.init()
126-
screen = pygame.display.set_mode((800, 600), DOUBLEBUF | OPENGL)
129+
screen = pygame.display.set_mode((0, 0), DOUBLEBUF | OPENGL | FULLSCREEN)
127130
ctx = moderngl.create_context()
128131

129132
ctx.enable(moderngl.BLEND)
130133
ctx.blend_func = moderngl.SRC_ALPHA, moderngl.ONE_MINUS_SRC_ALPHA
131134

132-
big_inner_color = (0, 1, 0)
133-
big_outer_color = (1, 0, 0)
135+
# Define your outer and inner colors
136+
outer_color = (1.0, 0.0, 0.0, 0.5) # Red (RGBA)
137+
inner_color = (0.0, 0.0, 1.0, 0.5) # Blue (RGBA)
134138

135-
# Create multiple cubes with progressively smaller sizes
139+
# Create multiple cubes with progressively smaller sizes and color gradient
136140
cubes = []
137-
num_cubes = 25
138-
delta = 1/num_cubes
141+
num_cubes = 150
142+
delta = 1 / num_cubes
139143
for i in range(num_cubes):
140144
outer_size = np.array([1.0, 1.0, 1.0]) * (1.0 - (i * delta)) # Outer size gradually decreases
141145
inner_size = np.array([1.0, 1.0, 1.0]) * (1.0 - (i * delta)) # Inner size slightly smaller
142-
outer_color = (1.0 - i * delta, i * delta, 0.0, 0.5) # Gradient color for outer part (1, 0, 0, 0.5)
143-
inner_color = (i * delta, 1.0 - i * delta, 0.0, 0.5) # Gradient color for inner part (0, 1, 0, 0.5)
144-
cubes.append(Cube(ctx, outer_size=outer_size, inner_size=inner_size, outer_color=outer_color, inner_color=inner_color, scale=1.0))
146+
147+
# Interpolate between the outer and inner color based on the cube index
148+
ratio = i / (num_cubes - 1) # A ratio from 0 to 1 for each cube
149+
outer_grad = tuple(outer_color[j] * (1 - ratio) + inner_color[j] * ratio for j in range(4)) # Interpolate colors
150+
inner_grad = tuple(inner_color[j] * (1 - ratio) + outer_color[j] * ratio for j in range(4)) # Interpolate colors
151+
152+
cubes.append(Cube(ctx, outer_size=outer_size, inner_size=inner_size, outer_color=outer_grad, inner_color=inner_grad, scale=1.0))
145153

146154
# Main loop
147155
clock = pygame.time.Clock()
148156
running = True
149157
angle = 0
158+
now_time = 0
159+
start = time.perf_counter()
150160
while running:
151161
for event in pygame.event.get():
152162
if event.type == pygame.QUIT:
153163
running = False
154164

155165
ctx.clear()
156166

167+
outer_color = (*outer.generate_color_from_perlin_noise(value=now_time/7, format=pmma.Constants.SMALL_RGB), 0.5)
168+
inner_color = (*inner.generate_color_from_perlin_noise(value=now_time/10, format=pmma.Constants.SMALL_RGB), 0.5)
169+
170+
for i in range(num_cubes):
171+
cube = cubes[i]
172+
ratio = i / (num_cubes - 1) # A ratio from 0 to 1 for each cube
173+
outer_grad = tuple(outer_color[j] * (1 - ratio) + inner_color[j] * ratio for j in range(4)) # Interpolate colors
174+
inner_grad = tuple(inner_color[j] * (1 - ratio) + outer_color[j] * ratio for j in range(4)) # Interpolate colors
175+
cube.set_color(outer_grad, inner_grad)
176+
157177
# Update rotation for each cube
158178
for cube in cubes:
159179
cube.update_rotation(angle)
160180
cube.render()
161181

162-
new_inner_color = (0.0, 1.0, 0.0, 0.5) # New color for inner part
163-
new_outer_color = (1.0, 0.0, 0.0, 0.5) # New color for outer part
164-
165-
for i in range(num_cubes):
166-
cube = cubes[i]
167-
outer_color = (1.0 - i * delta, i * delta, 0.0, 0.5) # Gradient color for outer part
168-
inner_color = (i * delta, 1.0 - i * delta, 0.0, 0.5) # Gradient color for inner part
169-
cube.set_outer_color(outer_color)
170-
cube.set_inner_color(inner_color)
171-
172182
# Increment angle for rotation
173183
angle += 0.01
174184

175185
pygame.display.flip()
176186
clock.tick(60)
187+
pmma.compute()
188+
now_time = time.perf_counter() - start
177189

178190
pygame.quit()

0 commit comments

Comments
 (0)