Integrated major improvements from shooter2 project, including slick UI module!
|
@ -1,6 +1,6 @@
|
||||||
syntax: glob
|
syntax: glob
|
||||||
*.pyc
|
*.pyc
|
||||||
settings.cfg
|
settings.cfg
|
||||||
lib
|
lib
|
||||||
bin
|
bin
|
||||||
include
|
include
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from roc_core import *
|
from roc_core import *
|
||||||
import universe
|
import roc_engine
|
||||||
import pipeline
|
import pipeline
|
||||||
import inputs
|
import inputs
|
||||||
import physics
|
import physics
|
||||||
|
|
BIN
data/ui/button_bg_corner.png
Executable file
After Width: | Height: | Size: 2.8 KiB |
BIN
data/ui/button_bg_edge.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
data/ui/button_corner.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
data/ui/button_edge.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
data/ui/frame_bg_corner.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
data/ui/frame_bg_edge.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
data/ui/frame_corner.png
Executable file
After Width: | Height: | Size: 2.8 KiB |
BIN
data/ui/frame_edge.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
|
@ -1,6 +1,6 @@
|
||||||
<xml_binary_packing name="constants">
|
<xml_binary_packing name="constants">
|
||||||
<datatag name="planet_scale" data="float"/>
|
<datatag name="planet_scale" data="float"/>
|
||||||
<datatag name="system_scale" data="float"/>
|
<datatag name="system_scale" data="float"/>
|
||||||
<datatag name="ship_scale" data="float"/>
|
<datatag name="ship_scale" data="float"/>
|
||||||
<datatag name="
|
<datatag name="xx" data="float"/>
|
||||||
</xml_binary_packing>
|
</xml_binary_packing>
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
<attribute name="y" data="float" default="1.0"/>
|
<attribute name="y" data="float" default="1.0"/>
|
||||||
<attribute name="z" data="float" default="1.0"/>
|
<attribute name="z" data="float" default="1.0"/>
|
||||||
</datatag>
|
</datatag>
|
||||||
|
<datatag name="scale_to_tex" data="bool" default=""/>
|
||||||
|
<datatag name="rot" optional="yes">
|
||||||
|
<attribute name="x" data="float" default="0.0"/>
|
||||||
|
<attribute name="y" data="float" default="0.0"/>
|
||||||
|
<attribute name="z" data="float" default="0.0"/>
|
||||||
|
</datatag>
|
||||||
</datatag>
|
</datatag>
|
||||||
<datatag name="material">
|
<datatag name="material">
|
||||||
<datatag name="ref" data="string"/>
|
<datatag name="ref" data="string"/>
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
<models>
|
<models>
|
||||||
<mesh id="mesh_sprite">
|
<mesh id="mesh_sprite">
|
||||||
<sprite/>
|
<centered_sprite/>
|
||||||
</mesh>
|
</mesh>
|
||||||
<mesh id="mesh_centered_sprite">
|
<mesh id="mesh_centered_sprite">
|
||||||
<centered_sprite/>
|
<centered_sprite/>
|
||||||
</mesh>
|
</mesh>
|
||||||
|
<mesh id="mesh_offset_sprite">
|
||||||
|
<sprite/>
|
||||||
|
</mesh>
|
||||||
|
|
||||||
<model id="m_test">
|
<model id="m_test">
|
||||||
<render layer="0">
|
<render layer="0">
|
||||||
<mesh><ref>mesh_sprite</ref><scale x="200" y="200"/></mesh>
|
<mesh><ref>mesh_sprite</ref><scale x="200" y="200"/></mesh>
|
||||||
|
@ -31,10 +35,187 @@
|
||||||
</model>
|
</model>
|
||||||
<model id="m_dralthi">
|
<model id="m_dralthi">
|
||||||
<render layer="0">
|
<render layer="0">
|
||||||
<mesh><ref>mesh_centered_sprite</ref><scale x="50" y="50"/></mesh>
|
<mesh><ref>mesh_centered_sprite</ref><scale x="40" y="40"/></mesh>
|
||||||
<material><ref>mat_dralthi</ref></material>
|
<material><ref>mat_dralthi</ref></material>
|
||||||
</render>
|
</render>
|
||||||
</model>
|
</model>
|
||||||
|
|
||||||
|
<model id="ui_frame_tl">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_tc">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_tr">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_cl">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_cc">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref></mesh>
|
||||||
|
<material><ref>mat_blank</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_cr">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_bl">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_bc">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_frame_br">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_frame_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<model id="ui_button_tl">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_button_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_tc">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_button_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_tr">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_cl">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_cc">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref></mesh>
|
||||||
|
<material><ref>mat_blank</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_cr">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="90.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_bl">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="270.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_bc">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_edge</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
<model id="ui_button_br">
|
||||||
|
<render layer="0">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
<render layer="1">
|
||||||
|
<mesh><ref>mesh_sprite</ref><scale_to_tex/><rot z="180.0"/></mesh>
|
||||||
|
<material><ref>mat_ui_button_bg_corner</ref></material>
|
||||||
|
</render>
|
||||||
|
</model>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</models>
|
</models>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<uniform/>
|
<uniform/>
|
||||||
</texture>
|
</texture>
|
||||||
<material id="mat_blank">
|
<material id="mat_blank">
|
||||||
<texture ref="t_white" type="diffuse"/>
|
<texture ref="t_white" type="noaa"/>
|
||||||
<texture ref="tnm_flat" type="normal"/>
|
<texture ref="tnm_flat" type="normal"/>
|
||||||
</material>
|
</material>
|
||||||
<texture id="t_test">
|
<texture id="t_test">
|
||||||
|
@ -28,6 +28,56 @@
|
||||||
<texture id="t_dralthi">
|
<texture id="t_dralthi">
|
||||||
<file>tex/dralthi.png</file>
|
<file>tex/dralthi.png</file>
|
||||||
</texture>
|
</texture>
|
||||||
|
|
||||||
|
|
||||||
|
<texture id="t_ui_button_corner">
|
||||||
|
<file>ui/button_corner.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_button_edge">
|
||||||
|
<file>ui/button_edge.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_button_bg_corner">
|
||||||
|
<file>ui/button_bg_corner.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_button_bg_edge">
|
||||||
|
<file>ui/button_bg_edge.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_frame_corner">
|
||||||
|
<file>ui/frame_corner.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_frame_edge">
|
||||||
|
<file>ui/frame_edge.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_frame_bg_corner">
|
||||||
|
<file>ui/frame_bg_corner.png</file>
|
||||||
|
</texture>
|
||||||
|
<texture id="t_ui_frame_bg_edge">
|
||||||
|
<file>ui/frame_bg_edge.png</file>
|
||||||
|
</texture>
|
||||||
|
<material id="mat_ui_button_corner">
|
||||||
|
<texture ref="t_ui_button_corner" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_button_edge">
|
||||||
|
<texture ref="t_ui_button_edge" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_button_bg_corner">
|
||||||
|
<texture ref="t_ui_button_bg_corner" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_button_bg_edge">
|
||||||
|
<texture ref="t_ui_button_bg_edge" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_frame_corner">
|
||||||
|
<texture ref="t_ui_frame_corner" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_frame_edge">
|
||||||
|
<texture ref="t_ui_frame_edge" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_frame_bg_corner">
|
||||||
|
<texture ref="t_ui_frame_bg_corner" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
<material id="mat_ui_frame_bg_edge">
|
||||||
|
<texture ref="t_ui_frame_bg_edge" type="noaa"/>
|
||||||
|
</material>
|
||||||
|
|
||||||
<texture id="t_test_plasma">
|
<texture id="t_test_plasma">
|
||||||
<file>tex/plasma1.png</file>
|
<file>tex/plasma1.png</file>
|
||||||
|
|
24
enums.py
|
@ -1,5 +1,9 @@
|
||||||
|
|
||||||
class enum(object):
|
class enum(object):
|
||||||
|
def __init__(self, names=[]):
|
||||||
|
for i, name in enumerate(names):
|
||||||
|
setattr(self, name, i)
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len([x for x in dir(self) if x[0] != '_'])
|
return len([x for x in dir(self) if x[0] != '_'])
|
||||||
|
|
||||||
|
@ -82,4 +86,22 @@ tt = enum()
|
||||||
tt.diffuse = 0 # the diffuse texture sets the colors and general brightness of the texture. if the same texture is used as the emissive texture, the model is effectively "fullbright"
|
tt.diffuse = 0 # the diffuse texture sets the colors and general brightness of the texture. if the same texture is used as the emissive texture, the model is effectively "fullbright"
|
||||||
tt.emissive = 1 # this texture is blended with the diffuse texture as the light level drops (this can be used to add running lights or glow to a ship, or light up the dark side of a planet, otherwise pure "black" is a good choice)
|
tt.emissive = 1 # this texture is blended with the diffuse texture as the light level drops (this can be used to add running lights or glow to a ship, or light up the dark side of a planet, otherwise pure "black" is a good choice)
|
||||||
tt.specular = 2 # adding a specular map allows you to add areas of low or high reflectivity to your texture
|
tt.specular = 2 # adding a specular map allows you to add areas of low or high reflectivity to your texture
|
||||||
tt.normal = 3 # normal maps allow bump mapping and other tweaks, with each channel representing the direction of the normal (red = -1x to 1x, green = -1y to 1y, blue = 0z to 1z)
|
tt.normal = 3 # normal maps allow bump mapping and other tweaks, with each channel representing the direction of the normal (red = -1x to 1x, green = -1y to 1y, blue = 0z to 1z)
|
||||||
|
tt.noaa = 4 # this replaces the diffuse texture, and is used for sprites that dont want to be antialiased
|
||||||
|
|
||||||
|
# UI stuff
|
||||||
|
ui_frametype = enum()
|
||||||
|
ui_frametype.grid = 0
|
||||||
|
ui_frametype.composite = 1
|
||||||
|
ui_frametype.model = 2
|
||||||
|
|
||||||
|
ui_postype = enum()
|
||||||
|
ui_postype.center = 0
|
||||||
|
ui_postype.relative = 1
|
||||||
|
ui_postype.absolute = 2
|
||||||
|
|
||||||
|
ui_filltype = enum()
|
||||||
|
ui_filltype.none = 0
|
||||||
|
ui_filltype.tile = 1
|
||||||
|
ui_filltype.stretch = 2
|
||||||
|
|
||||||
|
|
9
fonts.py
|
@ -100,7 +100,14 @@ class TexFont(object):
|
||||||
else:
|
else:
|
||||||
return self.charsizes[idx]
|
return self.charsizes[idx]
|
||||||
|
|
||||||
|
def get_size(self, text):
|
||||||
|
total = 0
|
||||||
|
for i, letter in enumerate(text):
|
||||||
|
charidx = self.mapchar(letter)
|
||||||
|
x, y = self.charsize(charidx)
|
||||||
|
total += x
|
||||||
|
|
||||||
|
return (total, y)
|
||||||
|
|
||||||
def mapchar(self, char):
|
def mapchar(self, char):
|
||||||
"""
|
"""
|
||||||
|
|
13
gameobj.py
|
@ -1,5 +1,18 @@
|
||||||
import enums
|
import enums
|
||||||
|
|
||||||
|
class datastorage(object):
|
||||||
|
def __init__(self, readonly=False):
|
||||||
|
self.__ro = readonly
|
||||||
|
|
||||||
|
def __setattr__(self, name, value):
|
||||||
|
if name in ('__ro',):
|
||||||
|
object.__setattr__(self, name, value)
|
||||||
|
if self.__ro:
|
||||||
|
raise ValueError("Unable to set read-only property")
|
||||||
|
else:
|
||||||
|
object.__setattr__(self, name, value)
|
||||||
|
|
||||||
|
|
||||||
class gameobj(object):
|
class gameobj(object):
|
||||||
def __init__(self, self.pos):
|
def __init__(self, self.pos):
|
||||||
self.pos = pos
|
self.pos = pos
|
||||||
|
|
188
gametimer.py
|
@ -1,104 +1,98 @@
|
||||||
import pygame
|
import pygame
|
||||||
import collections
|
import collections
|
||||||
|
|
||||||
def start_loop():
|
class GameTimer(object):
|
||||||
global g_timer, g_elapsed
|
def __init__(self):
|
||||||
g_elapsed = 0
|
self.update_fps_count = None
|
||||||
g_elapsed_sec = 0.0
|
|
||||||
g_timer = pygame.time.get_ticks()
|
def start_loop(self):
|
||||||
reset_fps_count()
|
self.elapsed = 0
|
||||||
|
self.elapsed_sec = 0.0
|
||||||
def next_frame(skipping=False):
|
self.timer = pygame.time.get_ticks()
|
||||||
global g_timer, g_elapsed, g_elapsed_sec
|
self.reset_fps_count()
|
||||||
|
|
||||||
newticks = pygame.time.get_ticks()
|
def next_frame(self, skipping=False):
|
||||||
#if skipping:
|
|
||||||
# # reset g_timer to it's value from the previous frame
|
newticks = pygame.time.get_ticks()
|
||||||
# g_timer -= g_elapsed
|
#if skipping:
|
||||||
g_elapsed = newticks - g_timer
|
# # reset self.timer to it's value from the previous frame
|
||||||
g_timer = newticks
|
# self.timer -= self.elapsed
|
||||||
g_elapsed_sec = float(g_elapsed) / 1000.0
|
self.elapsed = newticks - self.timer
|
||||||
|
self.timer = newticks
|
||||||
if g_elapsed != 0:
|
self.elapsed_sec = float(self.elapsed) / 1000.0
|
||||||
update_fps_count(g_elapsed)
|
|
||||||
|
if self.elapsed != 0:
|
||||||
|
self.update_fps_count(self.elapsed)
|
||||||
def reset_fps_count():
|
|
||||||
global g_framelist, update_fps_count
|
|
||||||
g_framelist = collections.deque()
|
def reset_fps_count(self):
|
||||||
update_fps_count = update_fps_count_empty
|
self.framelist = collections.deque()
|
||||||
|
self.update_fps_count = self.update_fps_count_empty
|
||||||
def update_fps_count_empty(elapsed):
|
|
||||||
global g_framelist, update_fps_count
|
def update_fps_count_empty(self, elapsed):
|
||||||
g_framelist.append(elapsed)
|
self.framelist.append(elapsed)
|
||||||
if len(g_framelist) >= 25:
|
if len(self.framelist) >= 25:
|
||||||
update_fps_count = update_fps_count_full
|
self.update_fps_count = self.update_fps_count_full
|
||||||
|
|
||||||
def update_fps_count_full(elapsed):
|
def update_fps_count_full(self, elapsed):
|
||||||
global g_framelist
|
self.framelist.popleft()
|
||||||
g_framelist.popleft()
|
self.framelist.append(elapsed)
|
||||||
g_framelist.append(elapsed)
|
|
||||||
|
|
||||||
def update_fps_count(elapsed):
|
def elapsed(self):
|
||||||
"this is replaced with either the _empty or _full variant, depending on the situation"
|
"""
|
||||||
pass
|
get the amount of time in milliseconds passed since the last frame was displayed
|
||||||
|
"""
|
||||||
def elapsed():
|
return self.elapsed
|
||||||
"""
|
|
||||||
get the amount of time in milliseconds passed since the last frame was displayed
|
def elapsed_sec(self):
|
||||||
"""
|
"""
|
||||||
return g_elapsed
|
get the amount of time in seconds passed since the last frame was displayed
|
||||||
|
"""
|
||||||
def elapsed_sec():
|
return self.elapsed_sec
|
||||||
"""
|
|
||||||
get the amount of time in seconds passed since the last frame was displayed
|
def num_frames(self, delay, offset=0):
|
||||||
"""
|
"""
|
||||||
return g_elapsed_sec
|
if you want something to occur every "delay" milliseconds,
|
||||||
|
this will return the number of times you should make it happen
|
||||||
def num_frames(delay, offset=0):
|
in this particular frame (can be 0)
|
||||||
"""
|
"""
|
||||||
if you want something to occur every "delay" milliseconds,
|
return int((self.timer - offset) / delay) - int((self.timer - self.elapsed - offset) / delay)
|
||||||
this will return the number of times you should make it happen
|
|
||||||
in this particular frame (can be 0)
|
def loop_frames(self, delay, offset=0):
|
||||||
"""
|
return range(num_frames(delay, offset))
|
||||||
global g_elapsed, g_timer
|
|
||||||
return int((g_timer - offset) / delay) - int((g_timer - g_elapsed - offset) / delay)
|
def get_timer(self):
|
||||||
|
return self.timer
|
||||||
def loop_frames(delay, offset=0):
|
|
||||||
return range(num_frames(delay, offset))
|
def average(self, d):
|
||||||
|
#spf = (float(sum(self.framelist)) / (len(self.framelist) * 1000.0))
|
||||||
def get_timer():
|
if len(d) == 0:
|
||||||
return g_timer
|
return 0.0
|
||||||
|
|
||||||
def average(d):
|
smooth = 0.85
|
||||||
#spf = (float(sum(g_framelist)) / (len(g_framelist) * 1000.0))
|
#v2 = float(d[-1])
|
||||||
if len(d) == 0:
|
#for i in xrange(len(d) - 2, 0, -1):
|
||||||
return 0.0
|
# pass
|
||||||
|
|
||||||
smooth = 0.85
|
v2 = float(d[0])
|
||||||
#v2 = float(d[-1])
|
for i in range(1, len(d)):
|
||||||
#for i in xrange(len(d) - 2, 0, -1):
|
v1 = float(d[i])
|
||||||
# pass
|
v2 = (smooth * v2) + ((1.0 - smooth) * v1)
|
||||||
|
|
||||||
|
return v2
|
||||||
|
|
||||||
|
|
||||||
|
def get_fps(self):
|
||||||
|
#return ",".join([str(x) for x in sorted(self.framelist)])
|
||||||
|
if len(self.framelist) == 0.0:
|
||||||
|
return 0.0
|
||||||
|
spf = self.average(self.framelist) / 1000.0
|
||||||
|
if spf == 0.0:
|
||||||
|
return 0.0
|
||||||
|
#print "%s < %s" % (1.0 / spf, self.framelist)
|
||||||
|
return 1.0 / spf
|
||||||
|
|
||||||
v2 = float(d[0])
|
|
||||||
for i in range(1, len(d)):
|
|
||||||
v1 = float(d[i])
|
|
||||||
v2 = (smooth * v2) + ((1.0 - smooth) * v1)
|
|
||||||
|
|
||||||
return v2
|
|
||||||
|
|
||||||
|
|
||||||
def get_fps():
|
|
||||||
global g_framelist
|
|
||||||
#return ",".join([str(x) for x in sorted(g_framelist)])
|
|
||||||
if len(g_framelist) == 0.0:
|
|
||||||
return 0.0
|
|
||||||
spf = average(g_framelist) / 1000.0
|
|
||||||
if spf == 0.0:
|
|
||||||
return 0.0
|
|
||||||
#print "%s < %s" % (1.0 / spf, g_framelist)
|
|
||||||
return 1.0 / spf
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
68
models.py
|
@ -46,7 +46,9 @@ class Model_Manager(object):
|
||||||
|
|
||||||
def load_textypes(self):
|
def load_textypes(self):
|
||||||
self.textypes = {}
|
self.textypes = {}
|
||||||
|
|
||||||
self.textypes[enums.tt.diffuse] = TextureType(GL_TEXTURE0, GL_TEXTURE_2D, GL_CLAMP, GL_CLAMP, GL_LINEAR, GL_LINEAR)
|
self.textypes[enums.tt.diffuse] = TextureType(GL_TEXTURE0, GL_TEXTURE_2D, GL_CLAMP, GL_CLAMP, GL_LINEAR, GL_LINEAR)
|
||||||
|
self.textypes[enums.tt.noaa] = TextureType(GL_TEXTURE0, GL_TEXTURE_2D, GL_REPEAT, GL_REPEAT, GL_NEAREST, GL_NEAREST)
|
||||||
self.textypes[enums.tt.emissive] = TextureType(GL_TEXTURE1, GL_TEXTURE_2D)
|
self.textypes[enums.tt.emissive] = TextureType(GL_TEXTURE1, GL_TEXTURE_2D)
|
||||||
self.textypes[enums.tt.specular] = TextureType(GL_TEXTURE2, GL_TEXTURE_2D)
|
self.textypes[enums.tt.specular] = TextureType(GL_TEXTURE2, GL_TEXTURE_2D)
|
||||||
self.textypes[enums.tt.normal] = TextureType(GL_TEXTURE3, GL_TEXTURE_2D)
|
self.textypes[enums.tt.normal] = TextureType(GL_TEXTURE3, GL_TEXTURE_2D)
|
||||||
|
@ -97,7 +99,8 @@ class Model_Manager(object):
|
||||||
self.models = {}
|
self.models = {}
|
||||||
for meshdata in mdldata.mesh:
|
for meshdata in mdldata.mesh:
|
||||||
if meshdata['sprite']:
|
if meshdata['sprite']:
|
||||||
self.sprite_mesh = SpriteMesh()
|
if self.sprite_mesh == None:
|
||||||
|
self.sprite_mesh = SpriteMesh()
|
||||||
mesh = self.sprite_mesh
|
mesh = self.sprite_mesh
|
||||||
elif meshdata['centered_sprite']:
|
elif meshdata['centered_sprite']:
|
||||||
if self.centered_sprite_mesh == None:
|
if self.centered_sprite_mesh == None:
|
||||||
|
@ -266,14 +269,22 @@ class Material(object):
|
||||||
if texobj.uniform:
|
if texobj.uniform:
|
||||||
if self.texcoords_uniform == self.texcoords_notimpl:
|
if self.texcoords_uniform == self.texcoords_notimpl:
|
||||||
self.texcoords_uniform = texobj.texcoords
|
self.texcoords_uniform = texobj.texcoords
|
||||||
|
self.texcoords = texobj.texcoords
|
||||||
else:
|
else:
|
||||||
if prevtex:
|
if prevtex:
|
||||||
assert texobj.texcoords(0.0, 0.0) == prevtex.texcoords(0.0, 0.0) and texobj.texcoords(1.0, 1.0) == prevtex.texcoords(1.0, 1.0)
|
assert texobj.texcoords(0.0, 0.0) == prevtex.texcoords(0.0, 0.0) and texobj.texcoords(1.0, 1.0) == prevtex.texcoords(1.0, 1.0)
|
||||||
if self.texcoords == self.texcoords_notimpl:
|
if self.texcoords == self.texcoords_notimpl:
|
||||||
self.texcoords = texobj.texcoords
|
self.texcoords = texobj.texcoords
|
||||||
prevtex = texobj
|
|
||||||
|
|
||||||
|
prevtex = texobj
|
||||||
|
|
||||||
|
|
||||||
|
def get_base_texture(self):
|
||||||
|
if enums.tt.noaa in self.textures:
|
||||||
|
t = self.textures[enums.tt.noaa]
|
||||||
|
else:
|
||||||
|
t = self.textures[enums.tt.diffuse]
|
||||||
|
return t
|
||||||
|
|
||||||
|
|
||||||
class Mesh(object):
|
class Mesh(object):
|
||||||
|
@ -333,6 +344,12 @@ class SpriteMeshCentered(SpriteMesh):
|
||||||
Vertex(vect(-0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), None),
|
Vertex(vect(-0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), None),
|
||||||
Vertex(vect( 0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 1.0), None),
|
Vertex(vect( 0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 1.0), None),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def factory(meshdata):
|
||||||
|
s = SpriteMeshCentered()
|
||||||
|
s.scale
|
||||||
|
return s
|
||||||
|
|
||||||
class RenderLayer(object):
|
class RenderLayer(object):
|
||||||
def __init__(self, layernum):
|
def __init__(self, layernum):
|
||||||
|
@ -343,6 +360,8 @@ class RenderLayer(object):
|
||||||
self.scale = [1.0, 1.0, 1.0]
|
self.scale = [1.0, 1.0, 1.0]
|
||||||
self.displaylist = None
|
self.displaylist = None
|
||||||
self.anim = "idle"
|
self.anim = "idle"
|
||||||
|
self.rotations = None
|
||||||
|
self.tile = False
|
||||||
|
|
||||||
def load(self, layerdata):
|
def load(self, layerdata):
|
||||||
meshdata = layerdata.mesh
|
meshdata = layerdata.mesh
|
||||||
|
@ -352,23 +371,46 @@ class RenderLayer(object):
|
||||||
self.color = [matdata.color['r'], matdata.color['g'], matdata.color['b'], matdata.color['a']]
|
self.color = [matdata.color['r'], matdata.color['g'], matdata.color['b'], matdata.color['a']]
|
||||||
self.scale = [meshdata.scale['x'], meshdata.scale['y'], meshdata.scale['z']]
|
self.scale = [meshdata.scale['x'], meshdata.scale['y'], meshdata.scale['z']]
|
||||||
self.scale = [x * meshdata['scale'] for x in self.scale]
|
self.scale = [x * meshdata['scale'] for x in self.scale]
|
||||||
|
self.rotations = [meshdata.rot['x'], meshdata.rot['y'], meshdata.rot['z']]
|
||||||
|
if meshdata['scale_to_tex']:
|
||||||
|
t = self.material.get_base_texture()
|
||||||
|
self.scale = [float(t.w), float(t.h), 1.0]
|
||||||
|
|
||||||
|
def get_base_texture(self):
|
||||||
|
if enums.tt.noaa in self.material.textures:
|
||||||
|
t = self.material.textures[enums.tt.noaa]
|
||||||
|
else:
|
||||||
|
t = self.material.textures[enums.tt.diffuse]
|
||||||
|
return t
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
self.material.bind()
|
self.material.bind()
|
||||||
glPushMatrix()
|
glPushMatrix()
|
||||||
glScalef(*self.scale)
|
glScalef(*self.scale)
|
||||||
if self.color != None:
|
if self.color != None:
|
||||||
glColor4f(*self.color)
|
glColor4f(*self.color)
|
||||||
|
glRotatef(self.rotations[0], 1.0, 0.0, 0.0)
|
||||||
|
glRotatef(self.rotations[1], 0.0, 1.0, 0.0)
|
||||||
|
glRotatef(self.rotations[2], 0.0, 0.0, 1.0)
|
||||||
if self.displaylist == None:
|
if self.displaylist == None:
|
||||||
self.displaylist = glGenLists(1)
|
self.displaylist = glGenLists(1)
|
||||||
glNewList(self.displaylist, GL_COMPILE)
|
glNewList(self.displaylist, GL_COMPILE)
|
||||||
self.mesh.draw(self.material.texcoords)
|
if self.tile:
|
||||||
|
tcfunc = self.tile_texcoords
|
||||||
|
else:
|
||||||
|
tcfunc = self.material.texcoords
|
||||||
|
self.mesh.draw(tcfunc)
|
||||||
glEndList()
|
glEndList()
|
||||||
|
|
||||||
#print "Drawing mesh %s" % ( self.displaylist, )
|
#print "Drawing mesh %s" % ( self.displaylist, )
|
||||||
glCallList(self.displaylist)
|
glCallList(self.displaylist)
|
||||||
glPopMatrix()
|
glPopMatrix()
|
||||||
|
|
||||||
|
def tile_texcoords(self, u, v):
|
||||||
|
t = self.material.get_base_texture()
|
||||||
|
u = u * self.scale[0] / t.w
|
||||||
|
v = v * self.scale[1] / t.h
|
||||||
|
return self.material.texcoords(u, v)
|
||||||
|
|
||||||
class ParticleLayer(RenderLayer):
|
class ParticleLayer(RenderLayer):
|
||||||
def __init__(self, layernum):
|
def __init__(self, layernum):
|
||||||
|
@ -383,6 +425,15 @@ class Model(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.layers = []
|
self.layers = []
|
||||||
|
|
||||||
|
|
||||||
|
def get_size(self):
|
||||||
|
if not self.layers:
|
||||||
|
return (0.0, 0.0, 0.0)
|
||||||
|
|
||||||
|
for layer in self.layers:
|
||||||
|
return [layer.scale[i] for i in range(0, len(layer.scale))]
|
||||||
|
|
||||||
|
|
||||||
def load(self, data):
|
def load(self, data):
|
||||||
tmplayers = []
|
tmplayers = []
|
||||||
for rend in data.render:
|
for rend in data.render:
|
||||||
|
@ -404,6 +455,7 @@ class Model(object):
|
||||||
|
|
||||||
class TextModel(Model):
|
class TextModel(Model):
|
||||||
def __init__(self, fontname, text, color=None, scale=None):
|
def __init__(self, fontname, text, color=None, scale=None):
|
||||||
|
Model.__init__(self)
|
||||||
self.displaylist = None
|
self.displaylist = None
|
||||||
self.fontname = fontname
|
self.fontname = fontname
|
||||||
self.text = text
|
self.text = text
|
||||||
|
@ -418,6 +470,10 @@ class TextModel(Model):
|
||||||
def instance(self):
|
def instance(self):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def get_size(self):
|
||||||
|
font = mgr.get_font(self.fontname)
|
||||||
|
return font.get_size(self.text)
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
glPushMatrix()
|
glPushMatrix()
|
||||||
glScalef(*self.scale)
|
glScalef(*self.scale)
|
||||||
|
|
|
@ -4,9 +4,9 @@ import video
|
||||||
import shader
|
import shader
|
||||||
import models
|
import models
|
||||||
import roc_main
|
import roc_main
|
||||||
import universe
|
import roc_engine
|
||||||
import config
|
import config
|
||||||
base_universe = universe.base_universe
|
base_engine = roc_engine.base_engine
|
||||||
|
|
||||||
def init2d():
|
def init2d():
|
||||||
init(videoinit=video.init2d)
|
init(videoinit=video.init2d)
|
||||||
|
@ -29,8 +29,8 @@ def init(videoinit):
|
||||||
|
|
||||||
models.init()
|
models.init()
|
||||||
|
|
||||||
def set_universe(new_universe):
|
def set_engine(new_engine):
|
||||||
roc_main.set_universe(new_universe)
|
roc_main.set_engine(new_engine)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
roc_main.mainloop()
|
roc_main.mainloop()
|
||||||
|
|
|
@ -4,7 +4,7 @@ import pygame
|
||||||
from OpenGL.GL import *
|
from OpenGL.GL import *
|
||||||
from py3dutil import vect, quat
|
from py3dutil import vect, quat
|
||||||
|
|
||||||
class base_universe(object):
|
class base_engine(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ class base_universe(object):
|
||||||
def render(self):
|
def render(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class tiled_universe(base_universe):
|
class tiled_engine(base_engine):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
16
roc_main.py
|
@ -10,20 +10,18 @@ import config
|
||||||
from OpenGL.GL import *
|
from OpenGL.GL import *
|
||||||
|
|
||||||
|
|
||||||
def set_universe(new_universe):
|
def set_engine(new_engine):
|
||||||
global g_universe
|
global g_engine
|
||||||
g_universe = new_universe
|
g_engine = new_engine
|
||||||
|
|
||||||
g_universe = None
|
g_engine = None
|
||||||
|
|
||||||
|
|
||||||
def mainloop():
|
def mainloop():
|
||||||
global g_universe
|
global g_engine
|
||||||
|
|
||||||
gametimer.start_loop()
|
|
||||||
while True:
|
while True:
|
||||||
events = pygame.event.get()
|
events = pygame.event.get()
|
||||||
gametimer.next_frame()
|
|
||||||
pygame.event.pump()
|
pygame.event.pump()
|
||||||
for ev in events:
|
for ev in events:
|
||||||
if ev.type == QUIT:
|
if ev.type == QUIT:
|
||||||
|
@ -42,9 +40,9 @@ def mainloop():
|
||||||
|
|
||||||
video.predraw()
|
video.predraw()
|
||||||
|
|
||||||
g_universe.frame(events)
|
g_engine.frame(events)
|
||||||
|
|
||||||
video.next_frame()
|
video.next_frame()
|
||||||
|
|
||||||
video.save_window_pos()
|
video.save_window_pos()
|
||||||
config.mgr.save()
|
config.mgr.save()
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#import roc
|
#import roc
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
sys.path.append(os.path.abspath('..'))
|
|
||||||
import roc
|
import roc
|
||||||
import pygame
|
import pygame
|
||||||
from OpenGL.GL import *
|
from OpenGL.GL import *
|
||||||
|
@ -60,7 +59,7 @@ class partycle(object):
|
||||||
self.yd *= 0.985
|
self.yd *= 0.985
|
||||||
self.rot += self.rotd
|
self.rot += self.rotd
|
||||||
|
|
||||||
class test_universe(roc.universe.base_universe):
|
class test_engine(roc.engine.base_engine):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.font = models.mgr.fontlib["micross20"]
|
self.font = models.mgr.fontlib["micross20"]
|
||||||
self.text1 = models.TextModel("micross20", "#$% 0123 ,,,, Hello world!\xa8\xa8\xa8F", (1.0, 1.0, 0.5, 1.0))
|
self.text1 = models.TextModel("micross20", "#$% 0123 ,,,, Hello world!\xa8\xa8\xa8F", (1.0, 1.0, 0.5, 1.0))
|
||||||
|
@ -168,7 +167,7 @@ class test_universe(roc.universe.base_universe):
|
||||||
roc.video.width = 1024
|
roc.video.width = 1024
|
||||||
roc.video.height = 768
|
roc.video.height = 768
|
||||||
roc.init2d()
|
roc.init2d()
|
||||||
roc.set_universe(test_universe())
|
roc.set_engine(test_engine())
|
||||||
roc.main()
|
roc.main()
|
||||||
|
|
||||||
|
|
||||||
|
|
15
shader.py
|
@ -122,17 +122,17 @@ class shader_manager(object):
|
||||||
try:
|
try:
|
||||||
shaderinit()
|
shaderinit()
|
||||||
except:
|
except:
|
||||||
print("Shader type %s failed to initialize" % (shadername,))
|
print(("Shader type %s failed to initialize" % (shadername,)))
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
self.select("ffp")
|
self.select("ffp")
|
||||||
except:
|
except:
|
||||||
print("Shader type %s failed to access the fixed function pipeline" % (shadername,))
|
print(("Shader type %s failed to access the fixed function pipeline" % (shadername,)))
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
self.select("standard")
|
self.select("standard")
|
||||||
except:
|
except:
|
||||||
print("Shader type %s failed to load the \"standard\" vertex and fragment shaders" % (shadername,))
|
print(("Shader type %s failed to load the \"standard\" vertex and fragment shaders" % (shadername,)))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
workable_shaders.append(shadername)
|
workable_shaders.append(shadername)
|
||||||
|
@ -171,28 +171,28 @@ class shader_manager(object):
|
||||||
except GLError:
|
except GLError:
|
||||||
p = self.shaderlib[shader]
|
p = self.shaderlib[shader]
|
||||||
v, f = self.shaderprograms[shader]
|
v, f = self.shaderprograms[shader]
|
||||||
print("Shader failed to execute: %s" % (shader,))
|
print(("Shader failed to execute: %s" % (shader,)))
|
||||||
print("Vertex shader log:")
|
print("Vertex shader log:")
|
||||||
lenarr = GLintArray.zeros(1)
|
lenarr = GLintArray.zeros(1)
|
||||||
glGetShaderiv(v, GL_INFO_LOG_LENGTH, lenarr)
|
glGetShaderiv(v, GL_INFO_LOG_LENGTH, lenarr)
|
||||||
infoarr = GLcharArray.zeros(lenarr[0])
|
infoarr = GLcharArray.zeros(lenarr[0])
|
||||||
outsize = GLsizeiArray.zeros(1)
|
outsize = GLsizeiArray.zeros(1)
|
||||||
glGetShaderInfoLog(v, lenarr[0], outsize, infoarr)
|
glGetShaderInfoLog(v, lenarr[0], outsize, infoarr)
|
||||||
print(''.join([chr(x) for x in infoarr[:outsize[0]]]))
|
print((''.join([chr(x) for x in infoarr[:outsize[0]]])))
|
||||||
print("Fragment shader log:")
|
print("Fragment shader log:")
|
||||||
lenarr = GLintArray.zeros(1)
|
lenarr = GLintArray.zeros(1)
|
||||||
glGetShaderiv(f, GL_INFO_LOG_LENGTH, lenarr)
|
glGetShaderiv(f, GL_INFO_LOG_LENGTH, lenarr)
|
||||||
infoarr = GLcharArray.zeros(lenarr[0])
|
infoarr = GLcharArray.zeros(lenarr[0])
|
||||||
outsize = GLsizeiArray.zeros(1)
|
outsize = GLsizeiArray.zeros(1)
|
||||||
glGetShaderInfoLog(f, lenarr[0], outsize, infoarr)
|
glGetShaderInfoLog(f, lenarr[0], outsize, infoarr)
|
||||||
print(''.join([chr(x) for x in infoarr[:outsize[0]]]))
|
print((''.join([chr(x) for x in infoarr[:outsize[0]]])))
|
||||||
print("Program info log:")
|
print("Program info log:")
|
||||||
lenarr = GLintArray.zeros(1)
|
lenarr = GLintArray.zeros(1)
|
||||||
glGetProgramiv(p, GL_INFO_LOG_LENGTH, lenarr)
|
glGetProgramiv(p, GL_INFO_LOG_LENGTH, lenarr)
|
||||||
infoarr = GLcharArray.zeros(lenarr[0])
|
infoarr = GLcharArray.zeros(lenarr[0])
|
||||||
outsize = GLsizeiArray.zeros(1)
|
outsize = GLsizeiArray.zeros(1)
|
||||||
glGetProgramInfoLog(p, lenarr[0], outsize, infoarr)
|
glGetProgramInfoLog(p, lenarr[0], outsize, infoarr)
|
||||||
print(''.join([chr(x) for x in infoarr[:outsize[0]]]))
|
print((''.join([chr(x) for x in infoarr[:outsize[0]]])))
|
||||||
glDeleteShader(v)
|
glDeleteShader(v)
|
||||||
glDeleteShader(f)
|
glDeleteShader(f)
|
||||||
glDeleteProgram(p)
|
glDeleteProgram(p)
|
||||||
|
@ -215,6 +215,5 @@ class shader_manager(object):
|
||||||
def init():
|
def init():
|
||||||
global mgr
|
global mgr
|
||||||
mgr = shader_manager()
|
mgr = shader_manager()
|
||||||
print("initiated shader mgr: %s" % (mgr,))
|
|
||||||
|
|
||||||
mgr = None
|
mgr = None
|
||||||
|
|
526
ui.py
Executable file
|
@ -0,0 +1,526 @@
|
||||||
|
import enums
|
||||||
|
from enums import ui_frametype, ui_postype, ui_filltype
|
||||||
|
from pygame.locals import *
|
||||||
|
import models
|
||||||
|
import video
|
||||||
|
from OpenGL.GL import *
|
||||||
|
import inputs
|
||||||
|
|
||||||
|
class UIFrame(object):
|
||||||
|
def __init__(self, content, contentdata):
|
||||||
|
self.func = None
|
||||||
|
self.content = content
|
||||||
|
self.data = contentdata
|
||||||
|
self.parent = None
|
||||||
|
self.minsize = None
|
||||||
|
self.maxsize = None
|
||||||
|
self.size = None
|
||||||
|
self.gridsize = None
|
||||||
|
self.pos = None
|
||||||
|
self.postype = ui_postype.relative
|
||||||
|
self.posset = None
|
||||||
|
self.fill = ui_filltype.stretch
|
||||||
|
self.draggable = False
|
||||||
|
self.padding = (0, 0)
|
||||||
|
self.color = None
|
||||||
|
self.stretchiness = None
|
||||||
|
|
||||||
|
|
||||||
|
def constrain_size(self, x, y):
|
||||||
|
if self.content == ui_frametype.grid:
|
||||||
|
x += self.padding[0] * len(self.data) * 2
|
||||||
|
y += self.padding[1] * len(self.data[0]) * 2
|
||||||
|
else:
|
||||||
|
x += self.padding[0] * 2
|
||||||
|
y += self.padding[1] * 2
|
||||||
|
|
||||||
|
if self.minsize:
|
||||||
|
x = max(self.minsize[0], x)
|
||||||
|
y = max(self.minsize[1], y)
|
||||||
|
if self.maxsize:
|
||||||
|
x = min(self.maxsize[0], x)
|
||||||
|
y = min(self.maxsize[1], y)
|
||||||
|
return (x, y)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_parent_size(self):
|
||||||
|
if self.parent == None:
|
||||||
|
return video.get_res()
|
||||||
|
else:
|
||||||
|
#return self.parent.get_child_size(self)
|
||||||
|
return self.parent.size
|
||||||
|
|
||||||
|
def get_child_size(self, child):
|
||||||
|
if self.content == ui_frametype.grid:
|
||||||
|
for i, row in enumerate(self.data):
|
||||||
|
for j, col in enumerate(row):
|
||||||
|
if col == child:
|
||||||
|
x = self.gridsize[0][j]
|
||||||
|
y = self.gridsize[1][i]
|
||||||
|
if False and self.stretchiness:
|
||||||
|
xlo = self.size[0] - sum(self.gridsize[0])
|
||||||
|
ylo = self.size[1] - sum(self.gridsize[1])
|
||||||
|
if xlo > 0:
|
||||||
|
xs = self.stretchiness[0][j]
|
||||||
|
xst = sum(self.stretchiness[0])
|
||||||
|
x += int(float(xlo) * float(xs) / float(xst))
|
||||||
|
if ylo > 0:
|
||||||
|
ys = self.stretchiness[1][i]
|
||||||
|
yst = sum(self.stretchiness[1])
|
||||||
|
y += int(float(ylo) * float(ys) / float(yst))
|
||||||
|
|
||||||
|
return (x, y)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return self.size
|
||||||
|
|
||||||
|
|
||||||
|
def get_parent_pos(self):
|
||||||
|
if self.parent == None:
|
||||||
|
return (0, 0)
|
||||||
|
else:
|
||||||
|
#return self.parent.get_child_pos(self)
|
||||||
|
return self.parent.pos
|
||||||
|
|
||||||
|
def get_child_pos(self, child):
|
||||||
|
if self.content == ui_frametype.grid:
|
||||||
|
for i, row in enumerate(self.data):
|
||||||
|
for j, col in enumerate(row):
|
||||||
|
if col == child:
|
||||||
|
#x = sum(self.gridsize[0][:j])+self.padding[0]
|
||||||
|
#y = sum(self.gridsize[1][:i])+self.padding[1]
|
||||||
|
x = sum(self.gridsize[0][:j])
|
||||||
|
y = sum(self.gridsize[1][:i])
|
||||||
|
return (x, y)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return (0, 0)
|
||||||
|
|
||||||
|
|
||||||
|
def autopos(self):
|
||||||
|
if self.postype == ui_postype.center:
|
||||||
|
ppos = self.get_parent_pos()
|
||||||
|
psize = self.get_parent_size()
|
||||||
|
|
||||||
|
self.pos = (ppos[0] + (psize[0]//2) - (self.size[0]//2), ppos[1] + (psize[1]//2) - (self.size[1]//2))
|
||||||
|
elif self.postype == ui_postype.relative:
|
||||||
|
if not self.posset:
|
||||||
|
self.posset = self.parent.get_child_pos(self)
|
||||||
|
ppos = self.get_parent_pos()
|
||||||
|
psize = self.get_parent_size()
|
||||||
|
if self.posset[0] >= 0:
|
||||||
|
x = self.posset[0] + ppos[0]
|
||||||
|
else:
|
||||||
|
x = self.posset[0] - ppos[0] - psize[0] + self.size[0]
|
||||||
|
if self.posset[1] >= 0:
|
||||||
|
y = self.posset[1] + ppos[1]
|
||||||
|
else:
|
||||||
|
y = self.posset[1] - ppos[1] - psize[1] + self.size[1]
|
||||||
|
self.pos = (x, y)
|
||||||
|
elif self.postype == ui_postype.absolute:
|
||||||
|
"This is bad. Don't do this. Asshole."
|
||||||
|
self.pos = self.posset
|
||||||
|
|
||||||
|
alist = [x for x in self.ancestors()]
|
||||||
|
if mgr.debugobj in alist:
|
||||||
|
print(("FUCK. OK DUDER. I AM YOUR DEBUG OBJECT: %s" % (alist.index(mgr.debugobj),)))
|
||||||
|
print((self.parent.pos))
|
||||||
|
print((self.get_parent_pos()))
|
||||||
|
print((self.parent.get_child_pos(self)))
|
||||||
|
#print self.fill == ui_filltype.none
|
||||||
|
#print self.postype == ui_postype.center
|
||||||
|
print((self.pos))
|
||||||
|
#print self.gridsize
|
||||||
|
|
||||||
|
print("END DEBUG OBJECT")
|
||||||
|
|
||||||
|
|
||||||
|
"""calculate position top-down, since child's position will depend on having an accurate parent position?"""
|
||||||
|
for child in self:
|
||||||
|
child.autopos()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def autosize(self):
|
||||||
|
if self.content == ui_frametype.model:
|
||||||
|
self.size = self.constrain_size(int(self.data.get_size()[0]), int(self.data.get_size()[1]))
|
||||||
|
elif self.content == ui_frametype.grid:
|
||||||
|
if not self.data:
|
||||||
|
self.size = self.constrain_size(0, 0)
|
||||||
|
self.gridsize = [[], []]
|
||||||
|
return
|
||||||
|
|
||||||
|
self.gridsize = [[0] * len(self.data[0]), [0] * len(self.data)]
|
||||||
|
for ir, row in enumerate(self.data):
|
||||||
|
for ic, col in enumerate(row):
|
||||||
|
col.autosize()
|
||||||
|
self.gridsize[0][ic] = max(self.gridsize[0][ic], col.size[0])
|
||||||
|
self.gridsize[1][ir] = max(self.gridsize[1][ir], col.size[1])
|
||||||
|
|
||||||
|
self.size = self.constrain_size(sum(self.gridsize[0]), sum(self.gridsize[1]))
|
||||||
|
print(("grid CONSTRAINED: %s - %s" % (self.size, self.padding)))
|
||||||
|
|
||||||
|
elif self.content == ui_frametype.composite:
|
||||||
|
x = 0
|
||||||
|
y = 0
|
||||||
|
for child in self:
|
||||||
|
child.autosize()
|
||||||
|
x = max(child.size[0], x)
|
||||||
|
y = max(child.size[1], y)
|
||||||
|
|
||||||
|
self.size = self.constrain_size(x, y)
|
||||||
|
print(("composite CONSTRAINED: %s - %s" % (self.size, self.padding)))
|
||||||
|
|
||||||
|
def autofillsize(self):
|
||||||
|
""" autosize calculates absolute minimum sizes. """
|
||||||
|
""" autofillsize then pads those as needed (particularly for grid cells) """
|
||||||
|
|
||||||
|
if self.parent != None and self.fill != ui_filltype.none and self.postype != ui_postype.center:
|
||||||
|
self.size = self.parent.get_child_size(self)
|
||||||
|
|
||||||
|
|
||||||
|
if self.fill != ui_filltype.none and self.content == ui_frametype.grid:
|
||||||
|
print(("Hello I am grid %s, and my size is %s" % (self.gridsize, self.size)))
|
||||||
|
if self.stretchiness:
|
||||||
|
for ir, row in enumerate(self.data):
|
||||||
|
for ic, col in enumerate(row):
|
||||||
|
xlo = self.size[0] - sum(self.gridsize[0])
|
||||||
|
ylo = self.size[1] - sum(self.gridsize[1])
|
||||||
|
print(("Stretching cell %s from %s to %s" % ((ic, ir), self.size, (self.size[0]+xlo, self.size[1]+ylo))))
|
||||||
|
x = 0
|
||||||
|
y = 0
|
||||||
|
if xlo > 0:
|
||||||
|
xs = self.stretchiness[0][ic]
|
||||||
|
xst = sum(self.stretchiness[0])
|
||||||
|
x = int(float(xlo) * float(xs) / float(xst))
|
||||||
|
if ylo > 0:
|
||||||
|
ys = self.stretchiness[1][ir]
|
||||||
|
yst = sum(self.stretchiness[1])
|
||||||
|
y = int(float(ylo) * float(ys) / float(yst))
|
||||||
|
|
||||||
|
self.gridsize[0][ic] += x
|
||||||
|
self.gridsize[1][ir] += y
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for child in self:
|
||||||
|
child.autofillsize()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def autoparent(self, parent=None):
|
||||||
|
if parent != None:
|
||||||
|
#print "Setting parent on %s to %s" % (self, parent)
|
||||||
|
self.parent = parent
|
||||||
|
for child in self:
|
||||||
|
child.autoparent(self)
|
||||||
|
|
||||||
|
|
||||||
|
def auto(self):
|
||||||
|
self.autoparent()
|
||||||
|
self.autosize()
|
||||||
|
self.autofillsize()
|
||||||
|
self.autopos()
|
||||||
|
|
||||||
|
def ancestors(self):
|
||||||
|
p = self.parent
|
||||||
|
while True:
|
||||||
|
if p == None:
|
||||||
|
raise StopIteration()
|
||||||
|
yield p
|
||||||
|
p = p.parent
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
if self.content == ui_frametype.model:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.content == ui_frametype.grid:
|
||||||
|
for row in self.data:
|
||||||
|
for col in row:
|
||||||
|
yield col
|
||||||
|
elif self.content == ui_frametype.composite:
|
||||||
|
for child in self.data:
|
||||||
|
yield child
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
if self.content == ui_frametype.model:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if self.content == ui_frametype.grid:
|
||||||
|
if len(self.data) == 0:
|
||||||
|
return 0
|
||||||
|
return len(self.data) * len(self.data[0])
|
||||||
|
elif self.content == ui_frametype.composite:
|
||||||
|
return len(self.data)
|
||||||
|
|
||||||
|
def handle_keypress(self, ev):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def handle_event(self, ev):
|
||||||
|
for child in self:
|
||||||
|
handled = child.handle_event(ev)
|
||||||
|
if handled:
|
||||||
|
return True
|
||||||
|
|
||||||
|
if self.relevant_event(ev):
|
||||||
|
if ev.type == MOUSEBUTTONDOWN:
|
||||||
|
self.set_focus()
|
||||||
|
if self.draggable:
|
||||||
|
self.drag_offset = (self.pos[0] - ev.pos[0], self.pos[1] - ev.pos[1])
|
||||||
|
for p in self.ancestors():
|
||||||
|
pass
|
||||||
|
p
|
||||||
|
mgr.drag_hook = p.move_drag
|
||||||
|
elif ev.type == MOUSEBUTTONUP:
|
||||||
|
if mgr.mousedown:
|
||||||
|
#print "Mouseclick detected... %s %s ------ %s %s" % (mgr.mousedown, mgr.mousedown.pos if mgr.mousedown else None, self.contains_pos(mgr.mousedown.pos), self.func)
|
||||||
|
if self.contains_pos(mgr.mousedown.pos):
|
||||||
|
""" welp, this is a valid click -- down was inside us, and so is up """
|
||||||
|
if self.func != None:
|
||||||
|
self.func(ev)
|
||||||
|
return True
|
||||||
|
|
||||||
|
elif ev.type == KEYUP:
|
||||||
|
if self.is_focus():
|
||||||
|
return self.handle_keypress(ev)
|
||||||
|
elif ev.type == VIDEORESIZE:
|
||||||
|
if self.parent == None:
|
||||||
|
self.autosize()
|
||||||
|
self.autopos()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def convert_coords(self, pos, postype, newtype):
|
||||||
|
if postype == newtype:
|
||||||
|
return pos
|
||||||
|
ppos = self.get_parent_pos()
|
||||||
|
psize = self.get_parent_size()
|
||||||
|
anchorx = False
|
||||||
|
anchory = False
|
||||||
|
if postype == ui_postype.relative:
|
||||||
|
if pos[0] >= 0:
|
||||||
|
x = pos[0] + ppos[0]
|
||||||
|
else:
|
||||||
|
x = pos[0] + ppos[0] + psize[0] - self.size[0]
|
||||||
|
if pos[1] >= 0:
|
||||||
|
y = pos[1] + ppos[1]
|
||||||
|
else:
|
||||||
|
y = pos[1] + ppos[1] + psize[1] - self.size[1]
|
||||||
|
pos = (x, y)
|
||||||
|
elif postype == ui_postype.center:
|
||||||
|
pos = (ppos[0] + (psize[0]//2) - (self.size[0]//2), ppos[1] + (psize[1]//2) - (self.size[1]//2))
|
||||||
|
|
||||||
|
if newtype == ui_postype.center:
|
||||||
|
pos = (ppos[0] + (psize[0]//2) - (self.size[0]//2), ppos[1] + (psize[1]//2) - (self.size[1]//2))
|
||||||
|
elif newtype == ui_postype.relative:
|
||||||
|
if self.posset[0] >= 0:
|
||||||
|
x = pos[0] - ppos[0]
|
||||||
|
else:
|
||||||
|
x = pos[0] - ppos[0] - psize[0] + self.size[0]
|
||||||
|
if self.posset[1] >= 0:
|
||||||
|
y = pos[1] - ppos[1]
|
||||||
|
else:
|
||||||
|
y = pos[1] - ppos[1] - psize[1] + self.size[1]
|
||||||
|
|
||||||
|
elif newtype == ui_postype.absolute:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return pos
|
||||||
|
|
||||||
|
def move_drag(self, ev):
|
||||||
|
newpos = (ev.pos[0] + self.drag_offset[0], ev.pos[1] + self.drag_offset[1])
|
||||||
|
rel_newpos = self.convert_coords(pos, ui_postype.absolute, self.postype)
|
||||||
|
self.posset = rel_newpos
|
||||||
|
self.autopos()
|
||||||
|
|
||||||
|
|
||||||
|
def contains_pos(self, pos):
|
||||||
|
if pos[0] >= self.pos[0] and pos[0] < (self.pos[0] + self.size[0]):
|
||||||
|
if pos[1] >= self.pos[1] and pos[1] < (self.pos[1] + self.size[1]):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def relevant_event(self, ev):
|
||||||
|
if ev.type == MOUSEMOTION:
|
||||||
|
return self.contains_pos(ev.pos)
|
||||||
|
elif ev.type == MOUSEBUTTONDOWN:
|
||||||
|
return self.contains_pos(ev.pos)
|
||||||
|
elif ev.type == MOUSEBUTTONUP:
|
||||||
|
return self.contains_pos(ev.pos)
|
||||||
|
elif ev.type == KEYDOWN:
|
||||||
|
return self.is_focus()
|
||||||
|
elif ev.type == KEYUP:
|
||||||
|
return self.is_focus()
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def is_focus(self):
|
||||||
|
return mgr.focus == self
|
||||||
|
|
||||||
|
def set_focus(self):
|
||||||
|
mgr.set_focus(self)
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
for child in self:
|
||||||
|
child.render()
|
||||||
|
|
||||||
|
if self.content == ui_frametype.model:
|
||||||
|
if mgr.debug < 0:
|
||||||
|
mgr.debug += 1
|
||||||
|
if isinstance(self.data, models.TextModel):
|
||||||
|
print(("%s - %s - TEXT %s" % (self.pos, self.size, self.data.text)))
|
||||||
|
else:
|
||||||
|
for l in self.data.layers:
|
||||||
|
print(("%s - %s - %s" % (self.pos, self.size, l.material.id)))
|
||||||
|
glPushMatrix()
|
||||||
|
if isinstance(self.data, models.TextModel):
|
||||||
|
glTranslate(self.pos[0], self.pos[1], 10.0)
|
||||||
|
else:
|
||||||
|
glTranslate(float(self.pos[0]) + (float(self.size[0]) / 2.0), float(self.pos[1]) + (float(self.size[1]) / 2.0), 10.0)
|
||||||
|
|
||||||
|
newscale = [float(self.size[0]), float(self.size[1]), 1.0]
|
||||||
|
for layer in self.data.layers:
|
||||||
|
#if newscale != layer.scale:
|
||||||
|
# print "Changing scale on %s %s from %s to %s" % (layer.material.id, self.size, layer.scale, newscale)
|
||||||
|
layer.scale = newscale
|
||||||
|
#if "_bg_" in layer.material.id:
|
||||||
|
#layer.color = self.color
|
||||||
|
self.data.render()
|
||||||
|
glPopMatrix()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def make_box(sprite, center, color):
|
||||||
|
l = [['tl', 'tc', 'tr'], ['cl', 'cc', 'cr'], ['bl', 'bc', 'br']]
|
||||||
|
for i, r in enumerate(l):
|
||||||
|
for j, c in enumerate(r):
|
||||||
|
mdl = models.mgr.create("%s_%s" % (sprite, c))
|
||||||
|
|
||||||
|
l[i][j] = UIFrame(ui_frametype.model, mdl)
|
||||||
|
#if len(mdl.layers) > 1:
|
||||||
|
mdl.layers[-1].color = color
|
||||||
|
if c == 'cc':
|
||||||
|
l[i][j] = UIFrame(ui_frametype.composite, [l[i][j], center])
|
||||||
|
elif 'c' in c:
|
||||||
|
"""Border edges should be repeated to fill!"""
|
||||||
|
l[i][j].fill = ui_filltype.tile
|
||||||
|
|
||||||
|
|
||||||
|
#l[i] = tuple(l[i])
|
||||||
|
#l = tuple(l)
|
||||||
|
uf = UIFrame(ui_frametype.grid, l)
|
||||||
|
uf.stretchiness = [[0, 1, 0], [0, 1, 0]]
|
||||||
|
return uf
|
||||||
|
|
||||||
|
|
||||||
|
def make_button(text, clickfunc):
|
||||||
|
text = models.TextModel("micross20", text)
|
||||||
|
textframe = UIFrame(ui_frametype.model, text)
|
||||||
|
textframe.postype = ui_postype.center
|
||||||
|
|
||||||
|
btnframe = make_box("ui_button", textframe, (0.3, 0.3, 1.0, 1.0))
|
||||||
|
btnframe.func = clickfunc
|
||||||
|
return btnframe
|
||||||
|
|
||||||
|
def startgame(ev):
|
||||||
|
mgr.remove("mainmenu")
|
||||||
|
|
||||||
|
def clicktest(ev):
|
||||||
|
print("I'm an event!")
|
||||||
|
|
||||||
|
def exitgame(ev):
|
||||||
|
inputs.add_command('exit')
|
||||||
|
|
||||||
|
def make_mainmenu():
|
||||||
|
b1 = make_button("Start", startgame)
|
||||||
|
b2 = make_button("Options", clicktest)
|
||||||
|
b3 = make_button("Exit", exitgame)
|
||||||
|
|
||||||
|
b1.padding = (20,0)
|
||||||
|
b2.padding = (20,0)
|
||||||
|
b3.padding = (20,0)
|
||||||
|
buttongrid = UIFrame(ui_frametype.grid, [[b1], [b2], [b3]])
|
||||||
|
buttongrid.postype = ui_postype.center
|
||||||
|
buttongrid.fill = ui_filltype.stretch
|
||||||
|
buttongrid.stretchiness = [[1], [1, 1, 1]]
|
||||||
|
mgr.debugobj = b1
|
||||||
|
buttongrid = UIFrame(ui_frametype.composite, [buttongrid])
|
||||||
|
buttongrid.padding = (20, 30)
|
||||||
|
mainframe = make_box("ui_frame", buttongrid, (0.0, 0.0, 1.0, 0.35))
|
||||||
|
mainframe.postype = ui_postype.center
|
||||||
|
return mainframe
|
||||||
|
|
||||||
|
class UIManager(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.frames = []
|
||||||
|
self.framenames = {}
|
||||||
|
self.focus = None
|
||||||
|
self.last_mousedown = None
|
||||||
|
self.mousemove_hook = None
|
||||||
|
self.debug = 0
|
||||||
|
|
||||||
|
def set_focus(self, frame):
|
||||||
|
self.focus = frame
|
||||||
|
|
||||||
|
def add(self, frame, name):
|
||||||
|
assert name not in self.framenames
|
||||||
|
self.framenames[name] = frame
|
||||||
|
frame.index = len(self.frames)
|
||||||
|
frame.auto()
|
||||||
|
print((frame.pos))
|
||||||
|
for child in frame:
|
||||||
|
print(("%s-%s" % (child.pos, child.size)))
|
||||||
|
"""
|
||||||
|
print "Ok"
|
||||||
|
print frame.data[1][1].data[1].gridsize
|
||||||
|
btngrid = frame.data[1][1].data[1]
|
||||||
|
btn3 = btngrid.data[2][0]
|
||||||
|
print "btn3"
|
||||||
|
print btn3.pos
|
||||||
|
print btngrid.get_child_pos(btn3)
|
||||||
|
"""
|
||||||
|
self.frames.append(frame)
|
||||||
|
|
||||||
|
def remove(self, frame):
|
||||||
|
fdel = self.framenames[frame]
|
||||||
|
for i, f in enumerate(self.frames):
|
||||||
|
if f is fdel:
|
||||||
|
del self.frames[i]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
for frame in self.frames:
|
||||||
|
frame.render()
|
||||||
|
|
||||||
|
def handle_event(self, ev):
|
||||||
|
if ev.type == MOUSEMOTION and self.mousemove_hook != None:
|
||||||
|
self.drag_hook(ev)
|
||||||
|
return True
|
||||||
|
|
||||||
|
handled = False
|
||||||
|
for fr in self.frames:
|
||||||
|
handled = fr.handle_event(ev)
|
||||||
|
if handled:
|
||||||
|
break
|
||||||
|
if not handled:
|
||||||
|
self.set_focus(None)
|
||||||
|
|
||||||
|
if ev.type == MOUSEBUTTONDOWN:
|
||||||
|
print(("MOUSECLICK: %s" % (ev.pos,)))
|
||||||
|
self.mousedown = ev
|
||||||
|
if ev.type == MOUSEBUTTONUP:
|
||||||
|
self.drag_hook = None
|
||||||
|
self.mousedown = None
|
||||||
|
|
||||||
|
mgr = UIManager()
|
||||||
|
|