mirror of
https://github.com/quantum5/punyverse.git
synced 2025-04-24 13:11:57 -04:00
Converted atmosphere to shaders.
This commit is contained in:
parent
a172d5bc4b
commit
696591d885
|
@ -330,7 +330,7 @@ class SphericalBody(Body):
|
||||||
self.clouds = self._get_sphere(division, tangent=False)
|
self.clouds = self._get_sphere(division, tangent=False)
|
||||||
|
|
||||||
if atm_texture is not None:
|
if atm_texture is not None:
|
||||||
self.atm_texture = get_best_texture(atm_texture, clamp=True)
|
self.atm_texture = load_texture_1d(atm_texture, clamp=True)
|
||||||
self.atmosphere = Disk(self.radius, self.radius + atm_size, 30)
|
self.atmosphere = Disk(self.radius, self.radius + atm_size, 30)
|
||||||
|
|
||||||
if 'ring' in info:
|
if 'ring' in info:
|
||||||
|
@ -432,18 +432,31 @@ class SphericalBody(Body):
|
||||||
raise ValueError('Invalid type: %s' % self.type)
|
raise ValueError('Invalid type: %s' % self.type)
|
||||||
|
|
||||||
def _draw_atmosphere(self):
|
def _draw_atmosphere(self):
|
||||||
with glRestore(GL_ENABLE_BIT | GL_CURRENT_BIT | GL_TEXTURE_BIT):
|
glEnable(GL_BLEND)
|
||||||
mv = self.mv_matrix.matrix
|
glDisable(GL_CULL_FACE)
|
||||||
matrix = Matrix4f([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, mv[12], mv[13], mv[14], 1])
|
shader = self.world.activate_shader('atmosphere')
|
||||||
glLoadMatrixf(matrix)
|
|
||||||
|
|
||||||
glDisable(GL_LIGHTING)
|
mv = self.mv_matrix.matrix
|
||||||
glEnable(GL_TEXTURE_2D)
|
matrix = Matrix4f([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, mv[12], mv[13], mv[14], 1])
|
||||||
glEnable(GL_BLEND)
|
shader.uniform_mat4('u_mvpMatrix', self.world.projection_matrix() * matrix)
|
||||||
glDisable(GL_CULL_FACE)
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, self.atm_texture)
|
glActiveTexture(GL_TEXTURE0)
|
||||||
self.atmosphere.draw()
|
glBindTexture(GL_TEXTURE_1D, self.atm_texture)
|
||||||
|
shader.uniform_texture('u_texture', 0)
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, self.atmosphere.vbo)
|
||||||
|
shader.vertex_attribute('a_position', self.atmosphere.position_size, self.atmosphere.type, GL_FALSE,
|
||||||
|
self.atmosphere.stride, self.atmosphere.position_offset)
|
||||||
|
shader.vertex_attribute('a_u', self.atmosphere.u_size, self.atmosphere.type, GL_FALSE,
|
||||||
|
self.atmosphere.stride, self.atmosphere.u_offset)
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, self.atmosphere.vertex_count)
|
||||||
|
|
||||||
|
shader.deactivate_attributes()
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
||||||
|
self.world.activate_shader(None)
|
||||||
|
glDisable(GL_BLEND)
|
||||||
|
glEnable(GL_CULL_FACE)
|
||||||
|
|
||||||
def _draw_clouds(self):
|
def _draw_clouds(self):
|
||||||
glEnable(GL_BLEND)
|
glEnable(GL_BLEND)
|
||||||
|
|
|
@ -199,16 +199,6 @@ class Disk(object):
|
||||||
buffer[6*res:6*res+6] = buffer[:6]
|
buffer[6*res:6*res+6] = buffer[:6]
|
||||||
self.vbo = array_to_gl_buffer(buffer)
|
self.vbo = array_to_gl_buffer(buffer)
|
||||||
|
|
||||||
def draw(self):
|
|
||||||
with glRestoreClient(GL_CLIENT_VERTEX_ARRAY_BIT):
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY)
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY)
|
|
||||||
glVertexPointer(3, GL_FLOAT, 12, 0)
|
|
||||||
glTexCoordPointer(1, GL_FLOAT, 12, 8)
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, self.vertex_count)
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
|
||||||
|
|
||||||
|
|
||||||
class SimpleSphere(object):
|
class SimpleSphere(object):
|
||||||
type = GL_FLOAT
|
type = GL_FLOAT
|
||||||
|
@ -229,6 +219,8 @@ class SimpleSphere(object):
|
||||||
reverse = False
|
reverse = False
|
||||||
for i in range(longs + 1):
|
for i in range(longs + 1):
|
||||||
phi1, phi2 = i * phi_div, (i + 1) * phi_div
|
phi1, phi2 = i * phi_div, (i + 1) * phi_div
|
||||||
|
if reverse:
|
||||||
|
phi1, phi2 = phi2, phi1
|
||||||
for j in range(lats + 1):
|
for j in range(lats + 1):
|
||||||
theta = j * theta_div
|
theta = j * theta_div
|
||||||
if reverse:
|
if reverse:
|
||||||
|
@ -265,6 +257,8 @@ class TangentSphere(object):
|
||||||
reverse = False
|
reverse = False
|
||||||
for i in range(longs + 1):
|
for i in range(longs + 1):
|
||||||
phi1, phi2 = i * phi_div, (i + 1) * phi_div
|
phi1, phi2 = i * phi_div, (i + 1) * phi_div
|
||||||
|
if reverse:
|
||||||
|
phi1, phi2 = phi2, phi1
|
||||||
for j in range(lats + 1):
|
for j in range(lats + 1):
|
||||||
theta = j * theta_div
|
theta = j * theta_div
|
||||||
if reverse:
|
if reverse:
|
||||||
|
|
10
punyverse/shaders/atmosphere.fragment.glsl
Normal file
10
punyverse/shaders/atmosphere.fragment.glsl
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#version 130
|
||||||
|
|
||||||
|
in float v_u;
|
||||||
|
|
||||||
|
out vec4 o_fragColor;
|
||||||
|
uniform sampler1D u_texture;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
o_fragColor = texture(u_texture, v_u);
|
||||||
|
}
|
13
punyverse/shaders/atmosphere.vertex.glsl
Normal file
13
punyverse/shaders/atmosphere.vertex.glsl
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#version 130
|
||||||
|
|
||||||
|
in vec2 a_position;
|
||||||
|
in float a_u;
|
||||||
|
|
||||||
|
out float v_u;
|
||||||
|
|
||||||
|
uniform mat4 u_mvpMatrix;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = u_mvpMatrix * vec4(a_position, 0, 1);
|
||||||
|
v_u = a_u;
|
||||||
|
}
|
|
@ -23,6 +23,7 @@ class World(object):
|
||||||
'clouds': ('clouds.vertex.glsl', 'clouds.fragment.glsl'),
|
'clouds': ('clouds.vertex.glsl', 'clouds.fragment.glsl'),
|
||||||
'star': ('star.vertex.glsl', 'star.fragment.glsl'),
|
'star': ('star.vertex.glsl', 'star.fragment.glsl'),
|
||||||
'ring': ('ring.vertex.glsl', 'ring.fragment.glsl'),
|
'ring': ('ring.vertex.glsl', 'ring.fragment.glsl'),
|
||||||
|
'atmosphere': ('atmosphere.vertex.glsl', 'atmosphere.fragment.glsl'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, file, callback):
|
def __init__(self, file, callback):
|
||||||
|
|
Loading…
Reference in a new issue