mirror of
https://github.com/quantum5/punyverse.git
synced 2025-04-24 13:11:57 -04:00
Compare commits
6 commits
Author | SHA1 | Date | |
---|---|---|---|
|
e77d4661cc | ||
|
7cb34c9142 | ||
|
e72a3bc623 | ||
|
9cdf3b8513 | ||
|
885194c7a0 | ||
|
8739120036 |
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -62,3 +62,7 @@ library.zip
|
||||||
|
|
||||||
# Our special launcher
|
# Our special launcher
|
||||||
!/punyverse/launcher.c
|
!/punyverse/launcher.c
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
._.DS_Store
|
||||||
|
|
|
@ -5,4 +5,5 @@ include punyverse/world.json
|
||||||
graft punyverse/assets
|
graft punyverse/assets
|
||||||
include punyverse/shaders/*.glsl
|
include punyverse/shaders/*.glsl
|
||||||
include punyverse/*.c
|
include punyverse/*.c
|
||||||
|
include punyverse/*.h
|
||||||
exclude punyverse/*.pyx
|
exclude punyverse/*.pyx
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# punyverse [](https://travis-ci.org/quantum5/punyverse) [](https://ci.appveyor.com/project/quantum5/punyverse) [](https://pypi.org/project/punyverse/) [](https://pypi.org/project/punyverse/) [](https://pypi.org/project/punyverse/)
|
# punyverse [](https://travis-ci.org/quantum5/punyverse) [](https://ci.appveyor.com/project/quantum5/punyverse) [](https://pypi.org/project/punyverse/) [](https://pypi.org/project/punyverse/) [](https://pypi.org/project/punyverse/)
|
||||||
|
|
||||||
Python simulator of a puny universe. (How many words can I stick into one?)
|
Python simulator of a puny universe. (How many words can I stick into one?)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
IF UNAME_SYSNAME == "Windows":
|
cdef extern from "glwrapper.h":
|
||||||
cdef extern from "windows.h":
|
|
||||||
pass
|
|
||||||
|
|
||||||
cdef extern from "GL/gl.h":
|
|
||||||
ctypedef unsigned int GLenum
|
ctypedef unsigned int GLenum
|
||||||
ctypedef unsigned char GLboolean
|
ctypedef unsigned char GLboolean
|
||||||
ctypedef unsigned int GLbitfield
|
ctypedef unsigned int GLbitfield
|
||||||
|
|
9
punyverse/glwrapper.h
Normal file
9
punyverse/glwrapper.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
# include <OpenGL/gl.h>
|
||||||
|
#else
|
||||||
|
# include <GL/gl.h>
|
||||||
|
#endif
|
|
@ -134,10 +134,10 @@ class LoaderWindow(pyglet.window.Window):
|
||||||
self.flip()
|
self.flip()
|
||||||
self.dispatch_events()
|
self.dispatch_events()
|
||||||
|
|
||||||
def load(self):
|
def load(self, **kwargs):
|
||||||
start = time.clock()
|
start = time.clock()
|
||||||
with glContext(self._main_context):
|
with glContext(self._main_context):
|
||||||
world = World('world.json', self._load_callback)
|
world = World('world.json', self._load_callback, **kwargs)
|
||||||
print('Loaded in %s seconds.' % (time.clock() - start))
|
print('Loaded in %s seconds.' % (time.clock() - start))
|
||||||
return world
|
return world
|
||||||
|
|
||||||
|
@ -167,10 +167,10 @@ class LoaderConsole(object):
|
||||||
def _load_callback(self, phase, message, progress):
|
def _load_callback(self, phase, message, progress):
|
||||||
print(message, file=self._output)
|
print(message, file=self._output)
|
||||||
|
|
||||||
def load(self):
|
def load(self, **kwargs):
|
||||||
start = time.clock()
|
start = time.clock()
|
||||||
with glContext(self._main_context):
|
with glContext(self._main_context):
|
||||||
world = World('world.json', self._load_callback)
|
world = World('world.json', self._load_callback, **kwargs)
|
||||||
print('Loaded in %s seconds.' % (time.clock() - start), file=self._output)
|
print('Loaded in %s seconds.' % (time.clock() - start), file=self._output)
|
||||||
return world
|
return world
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import argparse
|
import argparse
|
||||||
|
import sys
|
||||||
|
|
||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
|
@ -8,9 +9,12 @@ DEBUG = False
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
macos = sys.platform == 'darwin'
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(prog='punyverse', description='''
|
parser = argparse.ArgumentParser(prog='punyverse', description='''
|
||||||
Python simulator of a puny universe.
|
Python simulator of a puny universe.
|
||||||
''')
|
''')
|
||||||
|
parser.set_defaults(sky=not macos)
|
||||||
parser.add_argument('-D', '--debug', help='Enable pyglet OpenGL debugging', action='store_true')
|
parser.add_argument('-D', '--debug', help='Enable pyglet OpenGL debugging', action='store_true')
|
||||||
parser.add_argument('-d', '--high-depth', help='Use a larger depth buffer',
|
parser.add_argument('-d', '--high-depth', help='Use a larger depth buffer',
|
||||||
const=32, default=24, dest='depth', nargs='?', type=int)
|
const=32, default=24, dest='depth', nargs='?', type=int)
|
||||||
|
@ -20,14 +24,21 @@ def main():
|
||||||
action='store_false', dest='vsync')
|
action='store_false', dest='vsync')
|
||||||
parser.add_argument('-n', '--normal', help='Enables the use of normal maps',
|
parser.add_argument('-n', '--normal', help='Enables the use of normal maps',
|
||||||
action='store_true')
|
action='store_true')
|
||||||
|
parser.add_argument('-s', '--sky', help='Enables the sky', dest='sky',
|
||||||
|
action='store_true')
|
||||||
|
parser.add_argument('-S', '--no-sky', help='Disables the sky', dest='sky',
|
||||||
|
action='store_false')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
versioning = dict(major_version=3, minor_version=3)
|
||||||
pyglet.options['debug_gl'] = args.debug
|
pyglet.options['debug_gl'] = args.debug
|
||||||
|
if macos:
|
||||||
|
pyglet.options['shadow_window'] = False
|
||||||
|
versioning = dict(major_version=4, minor_version=1, forward_compatible=True)
|
||||||
|
|
||||||
template = pyglet.gl.Config(depth_size=args.depth, double_buffer=True,
|
template = pyglet.gl.Config(depth_size=args.depth, double_buffer=True,
|
||||||
sample_buffers=args.multisample > 1,
|
sample_buffers=args.multisample > 1,
|
||||||
samples=args.multisample,
|
samples=args.multisample, **versioning)
|
||||||
major_version=3, minor_version=3)
|
|
||||||
|
|
||||||
platform = pyglet.window.get_platform()
|
platform = pyglet.window.get_platform()
|
||||||
display = platform.get_default_display()
|
display = platform.get_default_display()
|
||||||
|
@ -64,7 +75,7 @@ def main():
|
||||||
loader.context.set_current()
|
loader.context.set_current()
|
||||||
|
|
||||||
loader.set_main_context(punyverse.context)
|
loader.set_main_context(punyverse.context)
|
||||||
world = loader.load()
|
world = loader.load(sky=args.sky)
|
||||||
punyverse.context.set_current()
|
punyverse.context.set_current()
|
||||||
punyverse.initialize(world)
|
punyverse.initialize(world)
|
||||||
loader.close()
|
loader.close()
|
||||||
|
|
|
@ -34,7 +34,7 @@ void main() {
|
||||||
float diffuseIntensity = max(dot(v_normal, incident), 0.0);
|
float diffuseIntensity = max(dot(v_normal, incident), 0.0);
|
||||||
float shininess = pow(max(dot(normalize(v_camDirection), reflected), 0), u_material.shininess);
|
float shininess = pow(max(dot(normalize(v_camDirection), reflected), 0), u_material.shininess);
|
||||||
|
|
||||||
vec3 diffuse = u_material.hasDiffuse ? texture2D(u_material.diffuseMap, v_uv).rgb : vec3(1);
|
vec3 diffuse = u_material.hasDiffuse ? texture(u_material.diffuseMap, v_uv).rgb : vec3(1);
|
||||||
vec3 ambient = u_material.ambient * u_sun.ambient * diffuse;
|
vec3 ambient = u_material.ambient * u_sun.ambient * diffuse;
|
||||||
vec3 specular = u_material.specular * u_sun.specular * max(shininess, 0) * diffuseIntensity;
|
vec3 specular = u_material.specular * u_sun.specular * max(shininess, 0) * diffuseIntensity;
|
||||||
diffuse *= u_material.diffuse * u_sun.diffuse * diffuseIntensity;
|
diffuse *= u_material.diffuse * u_sun.diffuse * diffuseIntensity;
|
||||||
|
|
|
@ -35,10 +35,10 @@ uniform Sun u_sun;
|
||||||
uniform Surface u_planet;
|
uniform Surface u_planet;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec3 normal = u_planet.hasNormal ? normalize(v_TBN * texture2D(u_planet.normalMap, v_uv).rgb * 2 - 1) : v_normal;
|
vec3 normal = u_planet.hasNormal ? normalize(v_TBN * texture(u_planet.normalMap, v_uv).rgb * 2 - 1) : v_normal;
|
||||||
vec3 diffuse = texture2D(u_planet.diffuseMap, v_uv).rgb;
|
vec3 diffuse = texture(u_planet.diffuseMap, v_uv).rgb;
|
||||||
vec3 specular = u_planet.hasSpecular ? texture2D(u_planet.specularMap, v_uv).rgb : vec3(1);
|
vec3 specular = u_planet.hasSpecular ? texture(u_planet.specularMap, v_uv).rgb : vec3(1);
|
||||||
vec3 emission = u_planet.hasEmission ? texture2D(u_planet.emissionMap, v_uv).rgb : vec3(1);
|
vec3 emission = u_planet.hasEmission ? texture(u_planet.emissionMap, v_uv).rgb : vec3(1);
|
||||||
|
|
||||||
vec3 incident = normalize(u_sun.position - v_position);
|
vec3 incident = normalize(u_sun.position - v_position);
|
||||||
vec3 reflected = normalize(reflect(-incident, normal));
|
vec3 reflected = normalize(reflect(-incident, normal));
|
||||||
|
|
|
@ -131,10 +131,6 @@ def check_size(width, height):
|
||||||
if width > max_texture or height > max_texture:
|
if width > max_texture or height > max_texture:
|
||||||
print('too large')
|
print('too large')
|
||||||
raise ValueError('Texture too large')
|
raise ValueError('Texture too large')
|
||||||
elif not gl_info.have_version(2) and not gl_info.have_extension('GL_ARB_texture_non_power_of_two'):
|
|
||||||
if not is_power2(width) or not is_power2(height):
|
|
||||||
print('not power of two')
|
|
||||||
raise ValueError('Texture not power of two')
|
|
||||||
|
|
||||||
|
|
||||||
def load_image(file, path):
|
def load_image(file, path):
|
||||||
|
@ -217,12 +213,8 @@ def load_texture(file, clamp=False):
|
||||||
|
|
||||||
id = create_texture()
|
id = create_texture()
|
||||||
glBindTexture(GL_TEXTURE_2D, id)
|
glBindTexture(GL_TEXTURE_2D, id)
|
||||||
|
|
||||||
if gl_info.have_version(3) or gl_info.have_extension('GL_ARB_framebuffer_object'):
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, get_internal_mode(mode), width, height, 0, mode, GL_UNSIGNED_BYTE, texture)
|
glTexImage2D(GL_TEXTURE_2D, 0, get_internal_mode(mode), width, height, 0, mode, GL_UNSIGNED_BYTE, texture)
|
||||||
glGenerateMipmap(GL_TEXTURE_2D)
|
glGenerateMipmap(GL_TEXTURE_2D)
|
||||||
else:
|
|
||||||
gluBuild2DMipmaps(GL_TEXTURE_2D, depth, width, height, mode, GL_UNSIGNED_BYTE, texture)
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
|
||||||
|
@ -245,11 +237,8 @@ def load_texture_1d(file, clamp=False):
|
||||||
id = create_texture()
|
id = create_texture()
|
||||||
glBindTexture(GL_TEXTURE_1D, id)
|
glBindTexture(GL_TEXTURE_1D, id)
|
||||||
|
|
||||||
if gl_info.have_version(3) or gl_info.have_extension('GL_ARB_framebuffer_object'):
|
|
||||||
glTexImage1D(GL_TEXTURE_1D, 0, get_internal_mode(mode), width, 0, mode, GL_UNSIGNED_BYTE, texture)
|
glTexImage1D(GL_TEXTURE_1D, 0, get_internal_mode(mode), width, 0, mode, GL_UNSIGNED_BYTE, texture)
|
||||||
glGenerateMipmap(GL_TEXTURE_1D)
|
glGenerateMipmap(GL_TEXTURE_1D)
|
||||||
else:
|
|
||||||
gluBuild1DMipmaps(GL_TEXTURE_1D, depth, width, mode, GL_UNSIGNED_BYTE, texture)
|
|
||||||
|
|
||||||
if clamp:
|
if clamp:
|
||||||
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
|
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
|
||||||
|
@ -272,12 +261,8 @@ def load_alpha_mask(file, clamp=False):
|
||||||
id = buffer.value
|
id = buffer.value
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, id)
|
glBindTexture(GL_TEXTURE_2D, id)
|
||||||
|
|
||||||
if gl_info.have_version(3) or gl_info.have_extension('GL_ARB_framebuffer_object'):
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, texture)
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, texture)
|
||||||
glGenerateMipmap(GL_TEXTURE_2D)
|
glGenerateMipmap(GL_TEXTURE_2D)
|
||||||
else:
|
|
||||||
gluBuild2DMipmaps(GL_TEXTURE_2D, 1, width, height, GL_RED, GL_UNSIGNED_BYTE, texture)
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
|
||||||
|
|
|
@ -199,6 +199,8 @@ class Punyverse(pyglet.window.Window):
|
||||||
if not width or not height:
|
if not width or not height:
|
||||||
# Sometimes this happen for no reason?
|
# Sometimes this happen for no reason?
|
||||||
return
|
return
|
||||||
|
if hasattr(self, 'get_viewport_size'):
|
||||||
|
width, height = self.get_viewport_size()
|
||||||
glViewport(0, 0, width, height)
|
glViewport(0, 0, width, height)
|
||||||
self.world.resize(width, height)
|
self.world.resize(width, height)
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ class World(object):
|
||||||
'belt': ('belt.vertex.glsl', 'model.fragment.glsl'),
|
'belt': ('belt.vertex.glsl', 'model.fragment.glsl'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, file, callback):
|
def __init__(self, file, callback, sky=True):
|
||||||
self.tracker = []
|
self.tracker = []
|
||||||
self.x = None
|
self.x = None
|
||||||
self.y = None
|
self.y = None
|
||||||
|
@ -40,6 +40,8 @@ class World(object):
|
||||||
self.asteroids = AsteroidManager(self)
|
self.asteroids = AsteroidManager(self)
|
||||||
self.cam = Camera()
|
self.cam = Camera()
|
||||||
|
|
||||||
|
self._sky = sky
|
||||||
|
|
||||||
self._program = None
|
self._program = None
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
self.programs = self._load_programs()
|
self.programs = self._load_programs()
|
||||||
|
@ -127,7 +129,7 @@ class World(object):
|
||||||
'Loading %s.' % name, i / belt_count)
|
'Loading %s.' % name, i / belt_count)
|
||||||
self.tracker.append(Belt(name, self, info))
|
self.tracker.append(Belt(name, self, info))
|
||||||
|
|
||||||
if 'sky' in root:
|
if 'sky' in root and self._sky:
|
||||||
def callback(index, file):
|
def callback(index, file):
|
||||||
self.callback('Loading sky...', 'Loading %s.' % file, index / 6)
|
self.callback('Loading sky...', 'Loading %s.' % file, index / 6)
|
||||||
self.tracker.append(Sky(self, root['sky'], callback))
|
self.tracker.append(Sky(self, root['sky'], callback))
|
||||||
|
|
14
setup.py
14
setup.py
|
@ -26,9 +26,16 @@ else:
|
||||||
|
|
||||||
if os.name == 'nt':
|
if os.name == 'nt':
|
||||||
gl_libs = ['opengl32']
|
gl_libs = ['opengl32']
|
||||||
|
elif sys.platform == 'darwin':
|
||||||
|
gl_libs = []
|
||||||
else:
|
else:
|
||||||
gl_libs = ['GL']
|
gl_libs = ['GL']
|
||||||
|
|
||||||
|
if sys.platform == 'darwin':
|
||||||
|
extra_compile_args = extra_link_args = ['-framework', 'OpenGL']
|
||||||
|
else:
|
||||||
|
extra_compile_args = extra_link_args = []
|
||||||
|
|
||||||
with open(os.path.join(os.path.dirname(__file__), 'README.md')) as f:
|
with open(os.path.join(os.path.dirname(__file__), 'README.md')) as f:
|
||||||
long_description = f.read()
|
long_description = f.read()
|
||||||
|
|
||||||
|
@ -105,7 +112,7 @@ else:
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='punyverse',
|
name='punyverse',
|
||||||
version='1.1',
|
version='1.2',
|
||||||
packages=['punyverse'],
|
packages=['punyverse'],
|
||||||
package_data={
|
package_data={
|
||||||
'punyverse': [
|
'punyverse': [
|
||||||
|
@ -124,7 +131,8 @@ setup(
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
ext_modules=cythonize([
|
ext_modules=cythonize([
|
||||||
Extension('punyverse._glgeom', sources=[pyx_path('punyverse/_glgeom.pyx')], libraries=gl_libs),
|
Extension('punyverse._glgeom', sources=[pyx_path('punyverse/_glgeom.pyx')], libraries=gl_libs,
|
||||||
|
extra_compile_args=extra_compile_args, extra_link_args=extra_link_args),
|
||||||
]) + extra_libs,
|
]) + extra_libs,
|
||||||
cmdclass={'build_ext': build_ext},
|
cmdclass={'build_ext': build_ext},
|
||||||
|
|
||||||
|
@ -139,7 +147,7 @@ setup(
|
||||||
]
|
]
|
||||||
|
|
||||||
},
|
},
|
||||||
install_requires=['pyglet', 'Pillow', 'six'],
|
install_requires=['pyglet<1.4', 'Pillow', 'six'],
|
||||||
|
|
||||||
author='quantum',
|
author='quantum',
|
||||||
author_email='quantum2048@gmail.com',
|
author_email='quantum2048@gmail.com',
|
||||||
|
|
Loading…
Reference in a new issue