11import pygame
22import moderngl
33import numpy as np
4- from pygame .locals import DOUBLEBUF , OPENGL
4+ from pygame .locals import DOUBLEBUF , OPENGL , FULLSCREEN
55from pyrr import Matrix44
6+ import pmma
7+ import time
68
9+ pmma .init ()
10+
11+
12+ inner = pmma .ColorConverter ()
13+ outer = pmma .ColorConverter ()
714
815class 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
125128pygame .init ()
126- screen = pygame .display .set_mode ((800 , 600 ), DOUBLEBUF | OPENGL )
129+ screen = pygame .display .set_mode ((0 , 0 ), DOUBLEBUF | OPENGL | FULLSCREEN )
127130ctx = moderngl .create_context ()
128131
129132ctx .enable (moderngl .BLEND )
130133ctx .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
136140cubes = []
137- num_cubes = 25
138- delta = 1 / num_cubes
141+ num_cubes = 150
142+ delta = 1 / num_cubes
139143for 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
147155clock = pygame .time .Clock ()
148156running = True
149157angle = 0
158+ now_time = 0
159+ start = time .perf_counter ()
150160while 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
178190pygame .quit ()
0 commit comments