New clouds that actually looks realistic. Closes #99.

This commit is contained in:
Quantum 2013-11-09 14:27:35 -05:00
parent 59b6f2c7c0
commit c0f4807d88
7 changed files with 61 additions and 22 deletions

View file

@ -3,6 +3,7 @@
mercury.jpg
earth.jpg
cloudmap.jpg
moon.jpg
mars.jpg
jupiter.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

View file

@ -337,14 +337,14 @@ class Applet(pyglet.window.Window):
if self.cloud and hasattr(entity, 'cloudmap') and entity.cloudmap:
glPushMatrix()
glEnable(GL_ALPHA_TEST)
glEnable(GL_BLEND)
glTranslatef(*entity.location)
pitch, yaw, roll = entity.rotation
glRotatef(pitch, 1, 0, 0)
glRotatef(yaw, 0, 1, 0)
glRotatef(roll, 0, 0, 1)
glCallList(entity.cloudmap)
glDisable(GL_ALPHA_TEST)
glDisable(GL_BLEND)
glPopMatrix()
if self.orbit and hasattr(entity, 'get_orbit') and hasattr(entity, 'parent'):

View file

@ -3,6 +3,7 @@ from pyglet.gl import *
from ctypes import c_int, byref, c_ulong
import os.path
import struct
import itertools
try:
from _glgeom import bgr_to_rgb
@ -41,7 +42,7 @@ try:
except ImportError:
from StringIO import StringIO
__all__ = ['load_texture']
__all__ = ['load_texture', 'load_clouds', 'load_image']
id = 0
cache = {}
@ -147,15 +148,7 @@ def check_size(width, height):
raise ValueError('Texture not power of two')
def load_texture(file):
if os.path.isabs(file):
path = file
file = os.path.basename(path)
else:
path = os.path.join(os.path.dirname(__file__), "assets", "textures", file)
if path in cache:
return cache[path]
def load_image(file, path):
print "Loading image %s..." % file,
try:
@ -163,7 +156,7 @@ def load_texture(file):
except IOError:
print 'exists not'
raise ValueError('Texture exists not')
type, width, height = image_info(file.read(8192))
type, width, height = image_info(file.read(65536))
file.seek(0, 0)
if type:
check_size(width, height)
@ -192,9 +185,6 @@ def load_texture(file):
mode = GL_RGBA if 'A' in raw.format else GL_RGB
# Flip from BGR to RGB
# I hate you too, Pyglet...
# REGULAR EXPRESSIONS ARE NOT MEANT TO PARSE BINARY DATA!!!
#texture = raw.get_data('RGBA', width * 4) if safe else raw.data[::-1] if 'BGR' in raw.format else raw.data
if raw.format in ('BGR', 'BGRA'):
if bgra:
mode = {GL_RGBA: GL_BGRA, GL_RGB: GL_BGR}[mode]
@ -205,6 +195,20 @@ def load_texture(file):
texture = raw.data
else:
texture = raw.get_data('RGBA', width * 4)
return path, width, height, len(raw.format), mode, texture
def load_texture(file):
if os.path.isabs(file):
path = file
file = os.path.basename(path)
else:
path = os.path.join(os.path.dirname(__file__), 'assets', 'textures', file)
if path in cache:
return cache[path]
path, width, height, depth, mode, texture = load_image(file, path)
buffer = c_ulong()
glGenTextures(1, byref(buffer))
@ -215,7 +219,41 @@ def load_texture(file):
filter = GL_NEAREST if badcard else GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter)
gluBuild2DMipmaps(GL_TEXTURE_2D, len(raw.format), width, height, mode, GL_UNSIGNED_BYTE, texture)
gluBuild2DMipmaps(GL_TEXTURE_2D, depth, width, height, mode, GL_UNSIGNED_BYTE, texture)
cache[path] = id
return id
def load_clouds(file):
if os.path.isabs(file):
path = file
file = os.path.basename(path)
else:
path = os.path.join(os.path.dirname(__file__), 'assets', 'textures', file)
if path in cache:
return cache[path]
path, width, height, depth, mode, texture = load_image(file, path)
buffer = c_ulong()
glGenTextures(1, byref(buffer))
id = buffer.value
pixels = bytearray(len(texture) * 4)
white = chr(255)
pixels[:] = itertools.chain.from_iterable(itertools.izip(itertools.repeat(white), itertools.repeat(white),
itertools.repeat(white),
itertools.islice(texture, 0, None, depth)))
glBindTexture(GL_TEXTURE_2D, id)
filter = GL_NEAREST if badcard else GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, str(pixels))
cache[path] = id

View file

@ -59,7 +59,7 @@
"rotation": 86400,
"division": 70,
"atmosphere": {
"cloud_texture": "cloudmap.png",
"cloud_texture": ["cloudmap.jpg", "cloudmap_small.jpg"],
"diffuse_texture": "atmosphere_earth.png",
"diffuse_size": 30
},

View file

@ -24,7 +24,7 @@ from math import pi, sqrt
G = 6.67384e-11 # Gravitation Constant
def get_best_texture(info, optional=False):
def get_best_texture(info, optional=False, loader=load_texture):
cheap = False
skip = False
texture = None
@ -37,14 +37,14 @@ def get_best_texture(info, optional=False):
break
continue
try:
texture = load_texture(item)
texture = loader(item)
except ValueError:
pass
else:
break
else:
try:
texture = load_texture(info)
texture = loader(info)
except ValueError:
if optional:
skip = True
@ -139,7 +139,7 @@ def load_world(file):
cloud_texture = atmosphere_data.get('cloud_texture', None)
corona_texture = atmosphere_data.get('corona_texture', None)
if cloud_texture is not None:
cheap, _, cloud_texture = get_best_texture(cloud_texture)
cheap, _, cloud_texture = get_best_texture(cloud_texture, loader=load_clouds)
if not cheap:
cloudmap_id = compile(sphere, radius + 2, division, division, cloud_texture,
lighting=False)