first add of roc

This commit is contained in:
cecilkorik 2011-04-24 18:30:40 -06:00
commit e4ad38cd56
57 changed files with 2111 additions and 0 deletions

190
camera.py Normal file
View file

@ -0,0 +1,190 @@
from gameobj import game_object
import math
from quat import *
from py3dutil import vect
from OpenGL.GL import *
import files
class game_camera(game_object):
def __init__(self):
self.tracking = None
game_object.__init__(self)
self.target_pos = self.pos.copy()
self.target_rot = self.rot.copy()
self.real_pos = self.pos.copy()
self.real_rot = self.rot.copy()
self.starbox = None
self.starboxes = []
def track(self, obj):
self.tracking = obj
self.target_at(obj, immediate=True)
def target_at(self, obj, immediate=False):
self.target_pos = obj.pos.copy()
desired_v = -self.get_camera_vector(obj.rot)
self.target_rot = quat(desired_v.x, desired_v.y, desired_v.z, 0.0)
self.target_rot = obj.rot.copy()
if immediate:
self.pos = obj.pos.copy()
self.rot = obj.rot.copy()
self.real_pos = obj.pos.copy()
self.real_rot = obj.rot.copy()
else:
self.camera_slew()
# apply translation vector to current position!
#print "Realrot: %s" % (self.real_rot,) #DELME
self.rot = self.real_rot
self.pos = self.real_pos + self.get_camera_vector(self.rot)
def get_camera_vector(self, rot):
camera_pitch = 15.0
camera_dist = 16.0
camera_pitch_axis = rot.get_conjugate() * vect(0.0, 1.0, 0.0)
camera_pitch_axis.normalize()
#print "Rot: %s" % (rot,) #DELME
# find the direction we want to be pointing (looking forward)
camera_v = (rot.get_conjugate() * vect(1.0, 0.0, 0.0))
# find the angle at which the camera should be pitched
camera_q = get_angle(camera_pitch, camera_pitch_axis)
# rotate the direction to include the pitch component
camera_v = camera_q * camera_v
# apply the distance to turn our unit vector into a translation vector
camera_v = camera_v.normalize() * -camera_dist
#print camera_v
return camera_v
def draw_starbox(self):
return
starbox = 'plain'
#starbox = 'test'
if starbox != self.starbox:
import sprite
self.starbox = starbox
self.starboxes = []
for i in range(6):
fn = 'img/starbox/starbox_%s_%d.png' % (starbox, i + 1)
f = files.mgr.open(fn)
self.starboxes.append(sprite.sprite_tex())
self.starboxes[i].set_file(f)
starbox_locs = [
(90.0, 1.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 1.0),
(270.0, 0.0, 0.0, 1.0),
(180.0, 0.0, 0.0, 1.0),
(90.0, 0.0, 0.0, 1.0),
(270.0, 1.0, 0.0, 0.0)
]
clr = (1.0, 1.0, 1.0, 1.0)
glDisable(GL_LIGHTING)
glDepthMask(0)
glMaterialfv(GL_FRONT, GL_AMBIENT, clr)
glMaterialfv(GL_FRONT, GL_DIFFUSE, clr)
glMaterialfv(GL_FRONT, GL_SPECULAR, clr)
glColor4f(*clr)
glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()
fsize = 0.8
wsize = 1.1
fardist = 100.0
glFrustum(-wsize, wsize, -fsize, fsize, 2.0, fardist * 10.0)
#glOrtho(-1.0, 1.0, -1.0, 1.0, 0.1, fardist * 10.0)
glMatrixMode(GL_MODELVIEW)
for i in range(6):
glPushMatrix()
glRotatef(*starbox_locs[i])
if i == 0:
glRotatef(270.0, 0.0, 1.0, 0.0)
if i == 5:
glRotatef(90.0, 0.0, 1.0, 0.0)
glTranslatef(0.0, fardist, 0.0)
glScalef(fardist, fardist, fardist)
#glTranslatef(0.0, 100.0, 0.0)
#glScalef(100.0, 100.0, 100.0)
self.starboxes[i].render()
glPopMatrix()
glDepthMask(1)
glEnable(GL_LIGHTING)
glMatrixMode(GL_PROJECTION)
glPopMatrix()
glMatrixMode(GL_MODELVIEW)
def calc_render_pos(self):
self.render_pos = vect(0.0, 0.0, 0.0)
def clear_render_pos(self):
self.render_pos = None
def render(self):
glPushMatrix()
glRotatef(90.0, 0.0, 0.0, 1.0)
glMultMatrixf(self.rot.get_conjugate().get_matrix())
self.draw_starbox()
#glTranslatef(*[-x for x in self.pos])
def update(self):
#return
if self.tracking != None:
self.target_at(self.tracking)
def camera_slew(self):
#return
currv = self.get_camera_vector(self.real_rot)
targv = self.get_camera_vector(self.target_rot)
currpos = self.real_pos + currv
targpos = self.target_pos + targv
currv.normalize()
targv.normalize()
rotdiff = currv.dot(targv)
if rotdiff != 0.0:
rotspeed = (math.sqrt(1.0 + rotdiff) - 1.0) / 10.0
maxrot = 25.0
if rotdiff > maxrot:
rotspeed += (rotdiff - maxrot)
amt = abs(rotspeed / rotdiff)
if amt >= 1.0:
self.real_rot = self.target_rot.copy()
elif amt < 1e-7:
self.real_rot = self.rot.copy()
else:
self.real_rot = self.rot.slerp(self.target_rot, amt)
d = currpos.dist(targpos)
if d != 0.0:
maxdist = 3.0
followspeed = (math.sqrt(1.0 + d) - 1.0)
#followspeed = 0.000001
if d > maxdist:
followspeed += d - maxdist
amt = abs(followspeed / d)
#print "%s, %s, %s" % (d, amt, followspeed)
if amt > 1.0 or amt < 1e-7:
self.real_pos = self.target_pos.copy()
else:
self.real_pos = self.real_pos.slerp(self.target_pos, amt)
#self.real_rot = self.real_rot * get_angle(90.0, vect(0.0, 0.0, 1.0))
def get_forward_vector(self):
return (self.rot * vect(1.0, 0.0, 0.0)).normalize()
def done(self):
glPopMatrix()

View file

@ -0,0 +1,13 @@
uniform sampler2D TextureMap;
varying float CameraDepth;
varying vec2 TexCoord;
void main()
{
// draw the typical textured output to visual framebuffer
gl_FragData[0] = texture2D(TextureMap, TexCoord);
// write "normaliized vertex depth" to the depthmap's alpha.
gl_FragData[1] = vec4(vec3(0.0), CameraDepth);
}

View file

@ -0,0 +1,24 @@
uniform vec3 CameraPos;
uniform vec3 CameraDir;
uniform float DepthNear;
uniform float DepthFar;
varying float CameraDepth; // normalized camera depth
varying vec2 TexCoord;
void main()
{
// offset = vector to vertex from camera's position
vec3 offset = (gl_Vertex.xyz / gl_Vertex.w) - CameraPos;
// z = distance from vertex to camera plane
float z = -dot(offset, CameraDir);
// Depth from vertex to camera, mapped to [0,1]
CameraDepth = (z - DepthNear) / (DepthFar - DepthNear);
// typical interpolated coordinate for texture lookup
TexCoord = gl_MultiTexCoord0.xy;
gl_Position = ftransform();
}

View file

@ -0,0 +1,25 @@
uniform sampler2D DepthTexture;
uniform sampler2D ShadowTexture;
varying vec2 DepthTexCoord;
varying vec3 ShadowNear;
varying vec3 ShadowDir;
const vec3 shadowColor = vec3(0.0);
void main()
{
// read from DepthTexture
// (depth is stored in texture's alpha component)
float cameraDepth = texture2D(DepthTexture, DepthTexCoord).a;
vec3 shadowPos = (cameraDepth * ShadowDir) + ShadowNear;
float l = dot(shadowPos.yz, shadowPos.yz);
float d = shadowPos.x;
// k = shadow density: 0=opaque, 1=transparent
// (use texture's red component as the density)
float k = texture2D(ShadowTexture, vec2(l, d)).r;
gl_FragColor = vec4(shadowColor, k);
}

View file

@ -0,0 +1,49 @@
uniform mat3 WorldToShadow;
uniform vec3 SphereOrigin;
uniform vec3 CameraPos;
uniform vec3 CameraDir;
uniform float DepthNear;
uniform float DepthFar;
varying vec2 DepthTexCoord;
varying vec3 ShadowNear;
varying vec3 ShadowDir;
void main()
{
vec4 tmp1 = ftransform();
gl_Position = tmp1;
// Predivide out w to avoid perspective-correct interpolation.
// The quantities being interpolated are screen-space texture
// coordinates and vectors to the near and far shadow plane,
// all of which have to be bilinearly interpolated.
// This could potentially be done by setting glHint,
// but it wouldn't be guaranteed to work on all hardware.
gl_Position.xyz /= gl_Position.w;
gl_Position.w = 1.0;
// Grab the transformed vertex's XY components as a texcoord
// for sampling from the depth texture from pass 1.
// Normalize them from [0,0] to [1,1]
DepthTexCoord = gl_Position.xy * 0.5 + 0.5;
// offset = vector to vertex from camera's position
vec3 offset = (gl_Vertex.xyz / gl_Vertex.w) - CameraPos;
// z = distance from vertex to camera plane
float z = -dot(offset, CameraDir);
vec3 shadowOffsetNear = offset * DepthNear / z;
vec3 shadowOffsetFar = offset * DepthFar / z;
vec3 worldPositionNear = CameraPos + shadowOffsetNear;
vec3 worldPositionFar = CameraPos + shadowOffsetFar;
vec3 shadowFar = WorldToShadow * (worldPositionFar - SphereOrigin);
ShadowNear = WorldToShadow * (worldPositionNear - SphereOrigin);
ShadowDir = shadowFar - ShadowNear;
}

17
data/shaders/sprite.frag Normal file
View file

@ -0,0 +1,17 @@
varying vec4 ambientGlobal/*,ambientA[8],diffuseA[8]*/;
varying vec4 pixelpos;
uniform sampler2D tex;
void main()
{
vec4 color = ambientGlobal;
vec4 white = vec4(1.0, 1.0, 1.5, 1.0);
//color = white;
vec4 texcolor = texture2D(tex, gl_TexCoord[0].st);
color = clamp(texcolor * color, 0.0, 1.0);
//color = color * vec4(1.0, 1.0, 1.0, 0.5);
gl_FragColor = color;
// gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

15
data/shaders/sprite.vert Normal file
View file

@ -0,0 +1,15 @@
varying vec4 ambientGlobal/*,ambientA[8],diffuseA[8]*/;
varying vec3 normal/*,lightDirA[8],halfVectorA[8]*/;
/*varying float distA[8];*/
varying vec4 pixelpos;
void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
pixelpos = gl_ModelViewMatrix * gl_Vertex;
ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_Position = ftransform();
}

141
data/shaders/standard.frag Normal file
View file

@ -0,0 +1,141 @@
varying vec4 ambientGlobal/*,ambientA[8],diffuseA[8]*/;
varying vec4 pixelpos;
uniform sampler2D tex;
varying vec3 normal/*,lightDirA[8],halfVectorA[8]*/;
/*varying float distA[8];*/
vec4 overlay_blend(vec4 base, vec4 blend)
{
vec4 lumCoeff = vec4(0.2125, 0.7154, 0.0721, 1.0);
vec4 white = vec4(1.0, 1.0, 1.0, 1.0);
vec4 result;
float luminance = dot(base, lumCoeff);
if (luminance < 0.45)
result = 2.0 * blend * base;
else if (luminance > 0.55)
result = white - 2.0 * (white - blend) * (white - base);
else
{
vec4 result1 = 2.0 * blend * base;
vec4 result2 = white - 2.0 * (white - blend) * (white - base);
result = mix(result1, result2, (luminance - 0.45) * 10.0);
}
return result;
}
vec4 process_lightsource(gl_LightSourceParameters light, vec4 incolor)
{
vec3 n,halfV,viewV,lightDir,halfVector;
float NdotL,NdotHV,dist;
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
vec4 spec = vec4(0.0, 0.0, 0.0, 1.0);
vec4 white = vec4(1.0, 1.0, 1.0, 1.0);
float att;
/* a fragment shader can't write a varying variable, hence we need
a new variable to store the normalized interpolated normal */
n = normalize(normal);
vec3 aux, ldir;
vec4 d,a;
if (light.position[3] == 1.0)
{
aux = vec3(light.position-pixelpos);
ldir = normalize(aux);
dist = length(aux);
}
else
{
ldir = normalize(vec3(light.position));
dist = 0.0;
}
halfVector = normalize(light.halfVector.xyz);
/* Compute the diffuse, ambient and globalAmbient terms */
d = gl_FrontMaterial.diffuse * light.diffuse;
/* The ambient terms have been separated since one of them */
/* suffers attenuation */
a = gl_FrontMaterial.ambient * light.ambient;
/* compute the dot product between normal and normalized lightdir */
NdotL = dot(n,ldir);
#define SHADOW_FUZZ 0.1
if (NdotL > 0.0) {
NdotL = ((1.0 - SHADOW_FUZZ) * NdotL) + SHADOW_FUZZ;
att = 1.0 / (light.constantAttenuation +
light.linearAttenuation * dist +
light.quadraticAttenuation * dist * dist);
color = att * (d * NdotL + a);
halfV = normalize(halfVector);
NdotHV = max(dot(n,halfV),0.0);
//spec = att * gl_FrontMaterial.specular * light.specular * pow(NdotHV,gl_FrontMaterial.shininess);
spec = att * white * light.specular * pow(NdotHV,10.0);
}
else if (NdotL > (-1.0 * SHADOW_FUZZ)) {
float fraction;
NdotL = (NdotL+SHADOW_FUZZ);
fraction = NdotL / SHADOW_FUZZ;
att = 1.0 / (light.constantAttenuation +
light.linearAttenuation * dist +
light.quadraticAttenuation * dist * dist);
color = att * fraction * (d * NdotL + a);
halfV = normalize(halfVector);
NdotHV = max(dot(n,halfV),0.0);
//spec = att * fraction * gl_FrontMaterial.specular * light.specular * pow(NdotHV,gl_FrontMaterial.shininess);
spec = att * white * light.specular * pow(NdotHV,10.0);
}
// blend mode SCREEN
color = white - ((white - color) * (white - incolor));
// blend mode AVG
//color = (color + incolor) * 0.5;
// blend mode LIGHTEN
//color = max(color, incolor);
// blend mode OVERLAY
//color = overlay_blend(incolor, color);
// blend mode DODGE
//color = incolor / (white - color);
// blend mode MULTIPLY
//color = color * incolor;
color += clamp(spec, 0.0, 1.0);
return clamp(color, 0.0, 1.0);
}
void main()
{
vec4 color = ambientGlobal;
vec4 white = vec4(1.0, 1.0, 1.0, 1.0);
//color = white;
color = process_lightsource(gl_LightSource[0], color);
color = process_lightsource(gl_LightSource[1], color);
color = process_lightsource(gl_LightSource[2], color);
color = process_lightsource(gl_LightSource[3], color);
color = process_lightsource(gl_LightSource[4], color);
color = process_lightsource(gl_LightSource[5], color);
color = process_lightsource(gl_LightSource[6], color);
color = process_lightsource(gl_LightSource[7], color);
vec4 texcolor = texture2D(tex, gl_TexCoord[0].st);
gl_FragColor = clamp(texcolor * color, 0.0, 1.0);
// gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

View file

@ -0,0 +1,15 @@
varying vec4 ambientGlobal/*,ambientA[8],diffuseA[8]*/;
varying vec3 normal/*,lightDirA[8],halfVectorA[8]*/;
/*varying float distA[8];*/
varying vec4 pixelpos;
void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
pixelpos = gl_ModelViewMatrix * gl_Vertex;
ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_Position = ftransform();
}

12
data/shaders/test.frag Normal file
View file

@ -0,0 +1,12 @@
varying vec3 normal;
varying vec3 lightdir;
uniform sampler2D tex;
void main()
{
float intensity;
intensity = dot(lightdir, normalize(normal));
var;
gl_FragColor = texture2D(tex, gl_TexCoord[0].st) * vec4(intensity, intensity, intensity, 1.0);
}

13
data/shaders/test.vert Normal file
View file

@ -0,0 +1,13 @@
varying vec3 normal;
varying vec3 lightdir;
void main()
{
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
normal = gl_NormalMatrix * gl_Normal;
vec4 newpos = ftransform();
gl_Position = newpos;
lightdir = normalize(vec3(gl_LightSource[0].position) - vec3(gl_ModelViewMatrix * gl_Vertex));
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

6
data/xml/constants.xml Normal file
View file

@ -0,0 +1,6 @@
<xml_binary_packing name="constants">
<datatag name="planet_scale" data="float"/>
<datatag name="system_scale" data="float"/>
<datatag name="ship_scale" data="float"/>
<datatag name="
</xml_binary_packing>

34
data/xml/def/bases.xml Normal file
View file

@ -0,0 +1,34 @@
<xml_binary_packing name="ships">
<datatag name="hull" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="model" data="string"/>
<datatag name="pitch" data="float"/>
<datatag name="yaw" data="float"/>
<datatag name="roll" data="float"/>
<datatag name="mass" data="float"/>
<datatag name="cargo" data="float"/>
<datatag name="desc" data="string" optional="yes" default=""/>
</datatag>
<datatag name="package" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="hull">
<attribute name="id" data="int"/>
</datatag>
<datatag name="engine" multiple="yes">
<attribute name="hardpoint" data="int"/>
<attribute name="id" data="int"/>
</datatag>
<datatag name="weapon" multiple="yes">
<attribute name="hardpoint" data="int"/>
<attribute name="id" data="int"/>
</datatag>
<datatag name="component" multiple="yes">
<attribute name="id" data="int"/>
<attribute name="count" data="int"/>
</datatag>
<datatag name="price" data="int"/>
<datatag name="desc" data="string" optional="yes" default=""/>
</datatag>
</xml_binary_packing>

View file

@ -0,0 +1,10 @@
<xml_binary_packing name="commodities">
<datatag name="tradegood" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="price" data="int"/>
<datatag name="size" data="float" default="1"/>
<datatag name="mass" data="float" default="1"/>
<datatag name="desc" data="string"/>
</datatag>
</xml_binary_packing>

View file

@ -0,0 +1,27 @@
<xml_binary_packing name="components">
<datatag name="skin" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="price" data="int"/>
<datatag name="desc" data="string" optional="yes" default=""/>
<datatag name="size" data="float"/>
<datatag name="mass" data="float"/>
</datatag>
<datatag name="external" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="price" data="int"/>
<datatag name="desc" data="string" optional="yes" default=""/>
<datatag name="size" data="float"/>
<datatag name="mass" data="float"/>
</datatag>
<datatag name="component" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="price" data="int"/>
<datatag name="desc" data="string" optional="yes" default=""/>
<datatag name="size" data="float"/>
<datatag name="mass" data="float"/>
</datatag>
</xml_binary_packing>

16
data/xml/def/engines.xml Normal file
View file

@ -0,0 +1,16 @@
<xml_binary_packing name="engines">
<datatag name="engine" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="price" data="int"/>
<datatag name="desc" data="string" optional="yes" default=""/>
<datatag name="thrust" data="int"/>
<datatag name="size" data="float"/>
<datatag name="mass" data="float"/>
<datatag name="spinup_delay" data="float" optional="yes" default="0"/>
<datatag name="spinup_profile" data="string" optional="yes" default="instant"/>
<datatag name="shutdown_delay" data="float" optional="yes" default="0"/>
<datatag name="shutdown_profile" data="string" optional="yes" default="instant"/>
<datatag name="particlefx" data="string" default=""/>
</datatag>
</xml_binary_packing>

16
data/xml/def/factions.xml Normal file
View file

@ -0,0 +1,16 @@
<xml_binary_packing name="factions">
<datatag name="relationship" multiple="yes">
<attribute name="id" data="int"/>
<attribute name="other" data="int"/>
<attribute name="feelings" data="string"/>
<attribute name="strength" data="float"/>
</datatag>
<datatag name="faction" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="group" data="int"/>
<datatag name="laws">
<datatag name="fine" data="int" default="0"/>
</datatag>
</datatag>
</xml_binary_packing>

43
data/xml/def/models.xml Normal file
View file

@ -0,0 +1,43 @@
<xml_binary_packing name="models">
<datatag name="model" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="render" multiple="yes">
<attribute name="layer" data="int"/>
<datatag name="model">
<datatag name="file" data="string" default=""/>
<datatag name="xaxis_index" data="int" default="0"/>
<datatag name="yaxis_index" data="int" default="1"/>
<datatag name="zaxis_index" data="int" default="2"/>
</datatag>
<datatag name="texture" data="string" optional="yes" multiple="yes">
<attribute name="layer" data="int" default="0"/>
</datatag>
<datatag name="sprite" data="string" default=""/>
<datatag name="sprite_color" data="string" default=""/>
<datatag name="billboard" data="bool" default=""/>
<datatag name="beam_align" data="bool" default=""/>
<datatag name="particle" data="bool" default=""/>
<datatag name="scale" data="float" default="1.0"/>
</datatag>
<datatag name="light" multiple="yes">
<datatag name="color" optional="yes">
<attribute name="r" data="float" default="1.0"/>
<attribute name="g" data="float" default="1.0"/>
<attribute name="b" data="float" default="1.0"/>
</datatag>
<datatag name="directional" data="bool" default=""/>
<datatag name="vector" 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 name="attenuation" optional="yes">
<attribute name="quadratic" data="float" default="0.0"/>
<attribute name="linear" data="float" default="0.0"/>
</datatag>
<datatag name="basepower" data="float"/>
<datatag name="earthshine" data="bool" default=""/>
<datatag name="sun" data="bool" default=""/>
</datatag>
</datatag>
</xml_binary_packing>

8
data/xml/def/shaders.xml Normal file
View file

@ -0,0 +1,8 @@
<xml_binary_packing name="shaders">
<datatag name="shader" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="vertex" data="string"/>
<datatag name="fragment" data="string"/>
</datatag>
</xml_binary_packing>

37
data/xml/def/ships.xml Normal file
View file

@ -0,0 +1,37 @@
<xml_binary_packing name="ships">
<datatag name="hull" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="modelref" data="string" default=""/>
<datatag name="pitch" data="float" default="0"/>
<datatag name="yaw" data="float" default="0"/>
<datatag name="roll" data="float" default="0"/>
<datatag name="mass" data="float"/>
<datatag name="internal_space" data="float" default="0"/>
<datatag name="skin_space" data="float" default="0"/>
<datatag name="weapon_slots" data="int" default="0"/>
<datatag name="engine_slots" data="int" default="0"/>
<datatag name="desc" data="string" optional="yes" default=""/>
</datatag>
<datatag name="package" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="hull">
<attribute name="id" data="string"/>
</datatag>
<datatag name="engine" multiple="yes">
<attribute name="hardpoint" data="int"/>
<attribute name="id" data="string"/>
</datatag>
<datatag name="weapon" multiple="yes">
<attribute name="hardpoint" data="int"/>
<attribute name="id" data="string"/>
</datatag>
<datatag name="component" multiple="yes">
<attribute name="id" data="string"/>
<attribute name="count" data="int"/>
</datatag>
<datatag name="price" data="int" default="0"/>
<datatag name="desc" data="string" optional="yes" default=""/>
</datatag>
</xml_binary_packing>

35
data/xml/def/stellars.xml Normal file
View file

@ -0,0 +1,35 @@
<xml_binary_packing name="stellars">
<datatag name="static" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="model" data="string"/>
</datatag>
<datatag name="planet" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="model" data="string" default="sphere"/>
<datatag name="desc" data="string"/>
<datatag name="texture" data="string"/>
<datatag name="texture_dark" data="string" default="black"/>
<datatag name="shader" data="string" default="planet"/>
<datatag name="bumpmap" data="string" default=""/>
<datatag name="mass" data="float"/>
<datatag name="radius" data="float"/>
</datatag>
<datatag name="region" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="scalex" data="float"/>
<datatag name="scaley" data="float"/>
<datatag name="scalez" data="float"/>
<datatag name="fogdistance" data="float"/>
<datatag name="fogcolor" data="string"/>
<datatag name="object" multiple="yes">
<attribute name="id" data="int"/>
<attribute name="density" data="float"/>
</datatag>
<datatag name="static" multiple="yes">
<attribute name="id" data="int"/>
<attribute name="density" data="float"/>
</datatag>
</datatag>
</xml_binary_packing>

9
data/xml/def/systems.xml Normal file
View file

@ -0,0 +1,9 @@
<xml_binary_packing name="systems">
<datatag name="system" multiple="yes">
<attribute name="id" data="int"/>
<datatag name="name" data="string"/>
<datatag name="region" multiple="yes">
<datatag name="id" data="int"/>
</datatag>
</datatag>
</xml_binary_packing>

38
data/xml/def/weapons.xml Normal file
View file

@ -0,0 +1,38 @@
<xml_binary_packing name="weapons">
<datatag name="component" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="name" data="string"/>
<datatag name="price" data="int"/>
<datatag name="desc" data="string" optional="yes" default=""/>
<datatag name="size" data="float"/>
<datatag name="mass" data="float"/>
<datatag name="launcher" data="string"/>
</datatag>
<datatag name="launcher" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="refire" data="int"/>
<datatag name="projectile" data="string"/>
<datatag name="velocity" data="float"/>
</datatag>
<datatag name="projectile" multiple="yes">
<attribute name="id" data="string"/>
<datatag name="particlefx" data="string" default=""/>
<datatag name="model" data="string" default=""/>
<datatag name="sprite" data="string" default=""/>
<datatag name="particlefx_scale" data="float" default="1.0"/>
<datatag name="model_scale" data="float" default="1.0"/>
<datatag name="sprite_scale" data="float" default="1.0"/>
<datatag name="sprite_color" optional="yes">
<attribute name="red" data="float" default="1.0"/>
<attribute name="green" data="float" default="1.0"/>
<attribute name="blue" data="float" default="1.0"/>
<attribute name="alpha" data="float" default="1.0"/>
</datatag>
<datatag name="accel" data="float" default="0.0"/>
<datatag name="range" data="float"/>
<datatag name="damagemin" data="float"/>
<datatag name="damagemax" data="float"/>
<datatag name="damagefunc" data="string" default="normal"/>
</datatag>
</xml_binary_packing>

20
data/xml/engines.xml Normal file
View file

@ -0,0 +1,20 @@
<engines>
<engine id="0">
<name>LX-20 Light Freighter Engine</name>
<desc>The LX-20 is one of the cheapest, simplest, and least effective engine designs available. It is commonly found equipped on the cheapest freighters, where its general reliability and the ease of finding replacement parts for it serves well. No reputable dealer would ever stock an engine this decrepit, but you can probably find a servicable one littering any spaceport since most people consider them useless.</desc>
<thrust>18000</thrust>
<price>0</price>
<size>150</size>
<mass>3800</mass>
<particlefx>eng_large</particlefx>
</engine>
<engine id="1">
<name>Plasma Vector Drive</name>
<desc>This is the engine equipped as standard on the Kestrel fighter. Top-of-the-line by any account, there is no downside except the price. It's small and lightweight, and it provides tremendous speed and agility with a minimal fuel cost.</desc>
<size>0.05</size>
<mass>25</mass>
<thrust>22000</thrust>
<price>550000</price>
<particlefx>eng_advanced</particlefx>
</engine>
</engines>

54
data/xml/factions.xml Normal file
View file

@ -0,0 +1,54 @@
<factions>
<faction id="10000">
<name>Government FactionGroup</name>
<group>-1</group>
</faction>
<faction id="10001">
<name>Neutral FactionGroup</name>
<group>-1</group>
</faction>
<faction id="10002">
<name>Criminal FactionGroup</name>
<group>-1</group>
</faction>
<faction id="0">
<name>Colonial Alliance Navy</name>
<group>10000</group>
</faction>
<faction id="1">
<name>Colonial Alliance Police</name>
<group>10000</group>
</faction>
<faction id="2">
<name>Associated Worlds Navy</name>
<group>10000</group>
</faction>
<faction id="3">
<name>Associated Worlds Police</name>
<group>10000</group>
</faction>
<faction id="4">
<name>Evon Naval Forces</name>
<group>10000</group>
</faction>
<faction id="5">
<name>Evon Police Forces</name>
<group>10000</group>
</faction>
<faction id="6">
<name>Royal Victorian Navy</name>
<group>10000</group>
</faction>
<faction id="7">
<name>Victorian Police Forces</name>
<group>10000</group>
</faction>
<faction id="8">
<name>Independent Defense Fleet</name>
<group>10001</group>
</faction>
<faction id="9">
<name>Corsair Navy</name>
<group>10002</group>
</faction>
</factions>

101
data/xml/models.xml Normal file
View file

@ -0,0 +1,101 @@
<models>
<model id="m_star_yellow">
<render layer="0">
<sprite>star_sprite_washout</sprite>
<billboard/>
<sprite_color>1.0,1.0,0.5,1.0</sprite_color>
</render>
<render layer="1">
<sprite>star_sprite_main</sprite>
<billboard/>
<sprite_color>1.0,1.0,0.7,1.0</sprite_color>
</render>
<render layer="2">
<sprite>star_sprite_inner</sprite>
<billboard/>
<sprite_color>1.0,1.0,1.0,1.0</sprite_color>
</render>
<light>
<color r="1.0" g="0.95" b="0.8"/>
<sun/>
<basepower>1.0</basepower>
</light>
</model>
<model id="m_fi_kestrel">
<render layer="0">
<model><file>kestrel</file></model>
<texture>kestrel</texture>
</render>
</model>
<model id="m_bs_thor">
<render layer="0">
<model><file>thor</file></model>
</render>
<light>
<color r="1.0" g="0.0" b="0.0"/>
<basepower>0.5</basepower>
<attenuation quadratic="0.0001"/>
</light>
</model>
<model id="m_misc_navbuoy0">
<render layer="0">
<model><file>navbuoy</file></model>
</render>
<light>
<color r="0.0" g="1.0" b="0.0"/>
<basepower>1.0</basepower>
<attenuation quadratic="0.000001"/>
</light>
</model>
<model id="m_misc_navbuoy_test">
<render layer="0">
<model><file>navbuoy</file></model>
</render>
<light>
<color r="0.0" g="0.0" b="1.0"/>
<basepower>2.5</basepower>
<attenuation quadratic="0.00000001"/>
</light>
</model>
<model id="m_planet_bob">
<render layer="0">
<model><file>planet1</file></model>
<scale>100.0</scale>
</render>
</model>
<model id="p_soft">
<render layer="0">
<sprite>soft_particle</sprite>
<billboard/>
<particle/>
</render>
</model>
<model id="p_hard">
<render layer="0">
<sprite>hard_particle</sprite>
<billboard/>
<particle/>
</render>
</model>
<model id="p_medium">
<render layer="0">
<sprite>medium_particle</sprite>
<billboard/>
<particle/>
</render>
</model>
<model id="m_fr_spacetruck">
<render layer="0">
<model><file>kestrel</file></model>
<texture>kestrel</texture>
</render>
</model>
<model id="m_pl_bob">
<render layer="0">
<model><file>planet1</file></model>
<texture>planet1_earthy</texture>
<scale>1000.0</scale>
</render>
</model>
</models>

22
data/xml/shaders.xml Normal file
View file

@ -0,0 +1,22 @@
<shaders>
<shader id="standard">
<vertex>standard</vertex>
<fragment>standard</fragment>
</shader>
<shader id="test">
<vertex>test</vertex>
<fragment>test</fragment>
</shader>
<shader id="sprite">
<vertex>sprite</vertex>
<fragment>sprite</fragment>
</shader>
<shader id="shadow_pass1">
<vertex>shadow_pass1</vertex>
<fragment>shadow_pass1</fragment>
</shader>
<shader id="shadow_pass2">
<vertex>shadow_pass2</vertex>
<fragment>shadow_pass2</fragment>
</shader>
</shaders>

83
data/xml/ships.xml Normal file
View file

@ -0,0 +1,83 @@
<ships>
<hull id="hull_lightfr">
<name>Spacetruck</name>
<modelref>m_fr_spacetruck</modelref>
<yaw>55</yaw>
<pitch>64</pitch>
<roll>35</roll>
<mass>15000</mass>
<internal_space>15000</internal_space>
<skin_space>2450</skin_space>
<weapon_slots>0</weapon_slots>
<engine_slots>1</engine_slots>
<desc>The commercial backbone of the colonies, the Space Truck carries a lot of cargo and does it very cheaply. They are perfect for trading in heavily patrolled sectors, but in rougher areas their lack of defensive systems and voluminous cargo hold makes them an obvious target.</desc>
</hull>
<hull id="hull_advfi">
<name>Kestrel</name>
<modelref>m_fi_kestrel</modelref>
<desc>Graceful lines and top-end equipment make this fighter a favourite of civilian pilots.</desc>
<pitch>215</pitch>
<roll>120</roll>
<yaw>200</yaw>
<mass>480</mass>
<internal_space>5</internal_space>
<skin_space>28</skin_space>
<weapon_slots>6</weapon_slots>
<engine_slots>1</engine_slots>
</hull>
<hull id="hull_hugebs">
<name>Thor Class Battlestation</name>
<modelref>m_bs_thor</modelref>
<desc>Massive and bristling with armaments and defenses, the Thor class battlestations are the Colonial Alliance's most powerful line of defense against any aggressor. Indeed, simulations show that in a best case scenario one of thsese battlestations could potentially defeat an entire foreign Navy single-handedly.</desc>
<mass>451000000</mass>
<internal_space>6000000</internal_space>
<skin_space>140000</skin_space>
<weapon_slots>28</weapon_slots>
</hull>
<hull id="hull_nb">
<name>Nav Buoy</name>
<modelref>m_misc_navbuoy0</modelref>
<mass>1500</mass>
</hull>
<hull id="hull_nb_test">
<name>Nav Buoy Test</name>
<modelref>m_misc_navbuoy_test</modelref>
<mass>1500</mass>
</hull>
<hull id="hull_test_planet">
<name>Bob</name>
<modelref>m_pl_bob</modelref>
<mass>4.5e22</mass>
</hull>
<package id="player_start">
<name>Starter Pack - Not for Resale</name>
<hull id="hull_advfi"/>
<engine hardpoint="0" id="1"/>
<desc>New pilots get this ship with this equipment</desc>
</package>
<package id="thor">
<name>Thor Class Battlestation</name>
<hull id="hull_hugebs"/>
<desc>Massive and bristling with armaments and defenses, the Thor class battlestations are the Colonial Alliance's most powerful line of defense against any aggressor. Indeed, simulations show that in a best case scenario one of thsese battlestations could potentially defeat an entire foreign Navy single-handedly.</desc>
</package>
<package id="test_planet">
<name>Bob</name>
<hull id="hull_test_planet"/>
<desc>A planet</desc>
</package>
<package id="nb">
<name>Nav Buoy</name>
<desc>Navigation buoys are typically used to mark a route or a specific point in space.</desc>
<hull id="hull_nb"/>
</package>
<package id="nb_test">
<name>Nav Buoy</name>
<desc>Navigation buoys are typically used to mark a route or a specific point in space.</desc>
<hull id="hull_nb_test"/>
</package>
</ships>

9
data/xml/stellars.xml Normal file
View file

@ -0,0 +1,9 @@
<stellars>
<planet id="3">
<name>Bob</name>
<texture>earthy</texture>
<desc>Bob is a rich agricultural planet, with a moderate industrial sector, large population centers, and a stable ecosystem. It's a pleasant place, with a little something for everyone, but is otherwise fairly nondescript.</desc>
<mass>7.4e24</mass>
<radius>8552.3</radius>
</planet>
</stellars>

22
data/xml/weapons.xml Normal file
View file

@ -0,0 +1,22 @@
<weapons>
<component id="lightblaster">
<name>Light Blaster</name>
<desc>The staggering ubiquity of the blaster class weapons is due to their simplicity and reliability. This particular model is one of the smallest blaster models, and it is more of a mild deterrant than an actual combat weapon. Against any moderately capable fighter it would prove almost ineffective even in large numbers, and it would be absolutely laughable to suggest that it would be of any use at all against a larger ship. Still, they are often found on shuttles and small freighters hoping that any agressor will see that numerous guns are mounted without bothering to scan too closely.</desc>
<price>250</price>
<size>0.2</size>
<mass>2</mass>
<launcher>w_lightblaster</launcher>
</component>
<launcher id="w_lightblaster">
<refire>250</refire>
<projectile>wp_lightblaster</projectile>
<velocity>1000</velocity>
</launcher>
<projectile id="wp_lightblaster">
<sprite>hard_particle</sprite>
<sprite_color red="1.0" green="1.0" blue="1.0" alpha="1.0"/>
<range>400</range>
<damagemin>20</damagemin>
<damagemax>20</damagemax>
</projectile>
</weapons>

51
enums.py Normal file
View file

@ -0,0 +1,51 @@
class enum(object):
pass
def reverse(enumobj, value):
for name in dir(enumobj):
if name[0] == '_':
continue
if value == eval("enumobj.%s" % (name,)):
return name
return None
# render types (for model.renderable_layer)
rt = enum()
rt.model = 0 # a 3d model made out of triangles, go figure!
rt.sprite = 1 # a 2d texture applied to a 2d plane.
rt.beam = 2 # a 2d plane between two points, similar to a sprite
# rendering billboard modes (for model.renderable_layer)
rtbb = enum()
rtbb.none = 0 # not billboarded, has its own independent rotation
rtbb.full = 1 # the sprite always squarely faces the camera with no rotation, only its position is relevant
rtbb.yaxis = 2 # pitch and yaw axes are available for rotation, but rotation around the roll axis is always fixed to face the camera.
# coordinate mode
cm = enum()
cm.universe = 0
cm.camera = 1
cm.relative = 2
cm.aa_relative = 3
# log level
logl = enum()
logl.debug = 9
logl.info = 8
logl.warn = 4
logl.err = 2
logl.crit = 0
# pipelines
pl = enum()
pl.camera = 0
pl.player = 1
pl.model = 2
pl.shadow = 3
pl.particle = 4
pl.sprite = 5
pl.composite1 = 6
pl.composite2 = 7

28
files.py Normal file
View file

@ -0,0 +1,28 @@
import os
import sys
import pygame
def get_basedir():
execpath = sys.argv[0]
execpath = os.path.split(execpath)[0]
if not execpath:
return '.'
return execpath
class filemanager(object):
def __init__(self):
self.basepath = get_basedir()
self.datapath = "data"
def path(self, *args):
return os.path.join(self.basepath, self.datapath, *args)
def open(self, *args):
filename = self.path(*args)
return open(filename, 'rb')
def png(self, *args):
filename = self.path(*args)
return pygame.image.load(filename)
mgr = filemanager()

BIN
files.pyc Executable file

Binary file not shown.

248
gamedata.py Normal file
View file

@ -0,0 +1,248 @@
import glob
import os
try:
from xml.etree.cElementTree import parse
except ImportError:
from elementtree.ElementTree import parse
import files
import shader
class MissingNode(object):
def __init__(self):
self.text = None
def get(self, name):
return None
class GameDataTagDef(object):
def __init__(self):
self.multi = False
self.opt = False
self.type = None
self.default = None
class GameDataNode(object):
def __init__(self):
self.dict = {}
def __setitem__(self, name, val):
self.dict[name] = val
def __getitem__(self, name):
return self.dict[name]._value
def __getattr__(self, name):
if name == 'dict':
raise AttributeError, name
try:
return self.dict[name]
except KeyError:
if name == '_value':
return None
raise AttributeError, name
def __setattr__(self, name, val):
if name == 'dict':
return object.__setattr__(self, name, val)
try:
self.dict[name] = val
except KeyError:
object.__setattr__(self, name, val)
def add_multi(self, key, value):
if not self.dict.has_key(key):
self.dict[key] = []
self.dict[key].append(value)
def add_single(self, key, value):
self.dict[key] = value
def __repr__(self):
return """<GameDataNode "%s">""" % (self.dict['_name'],)
def has_key(self, key):
return self.dict.has_key(key)
class XMLGameDataReader(object):
def __init__(self, bin, xml):
self._bin = bin
self._xml = xml
self._tree = self.construct()
self._name = xml.tag
def value_as_type(self, value, type):
if type == 'string':
return value
elif type == 'bool':
if value and value[0].lower() in ('y', 't', '1'):
return True
else:
return False
elif type == 'int':
return int(value)
elif type == 'float':
return float(value)
elif type == 'csvarray':
# csvarrays are always ints...
return [int(x.strip()) for x in value.split(',')]
else:
raise TypeError, type
def create_datatag_def(self, tag):
d = GameDataTagDef()
if tag.get('multiple') != None and tag.get('multiple')[0].lower() == 'y':
d.multi = True
if tag.get('optional') != None and tag.get('optional')[0].lower() == 'y':
d.opt = True
if tag.get('data') != None:
d.type = tag.get('data')
if tag.get('default') != None:
d.default = self.value_as_type(tag.get('default'), d.type)
d.opt = True
return d
def create_attribute_def(self, tag):
return self.create_datatag_def(tag)
def construct_node(self, bin, xml):
node = GameDataNode()
value = None
if bin.tag == 'datatag':
df = self.create_datatag_def(bin)
if df.type:
value = xml.text
if type(xml) == MissingNode and df.opt:
value = df.default
elif type(xml) == MissingNode:
raise ValueError, "Missing value for mandatory tag %s" % (bin.get('name'),)
elif df.type == 'bool':
# tag exists, and since it is a bool, that means it's True
value = True
else:
value = self.value_as_type(value, df.type)
node['_value'] = value
elif bin.tag == 'attribute':
df = self.create_attribute_def(bin)
if df.type:
value = xml.get(bin.get('name'))
if value == None and df.opt:
value = df.default
elif not value:
raise ValueError, "Missing value for mandatory tag %s" % (bin.get('name'),)
else:
value = self.value_as_type(value, df.type)
node['_value'] = value
node['_def'] = df
node['_name'] = bin.get('name')
return node
def construct_recurse(self, bin, xml):
xmldict = {}
tagdict = {}
attrdict = {}
if bin.tag == 'xml_binary_packing':
node = GameDataNode()
else:
node = self.construct_node(bin, xml)
for child in bin.getchildren():
if child.tag == 'datatag':
tagdict[child.get('name')] = child
elif child.tag == 'attribute':
attrdict[child.get('name')] = child
else:
raise ValueError
xmlattrdict = {}
for k, v in xml.items():
if not k in attrdict:
raise ValueError, "Key %s not a valid attribute: %s" % (k, attrdict.keys())
continue
binchild = attrdict[k]
xmlchild = xml
xmlattrdict[k] = 0
subnode = self.construct_node(binchild, xml)
if subnode._def.multi:
node.add_multi(k, subnode)
else:
node.add_single(k, subnode)
xmltagdict = {}
for child in xml.getchildren():
if not child.tag in tagdict:
raise ValueError
continue
binchild = tagdict[child.tag]
xmlchild = child
xmltagdict[child.tag] = 0
subnode = self.construct_recurse(binchild, xmlchild)
if subnode._def.multi:
node.add_multi(child.tag, subnode)
else:
node.add_single(child.tag, subnode)
missing = MissingNode()
for k in tagdict.keys():
if not k in xmltagdict:
# Missing datatag
subnode = self.construct_node(tagdict[k], missing)
if not subnode._def.multi:
node.add_single(k, subnode)
else:
node.add_single(k, [])
for k in attrdict.keys():
if not k in xmlattrdict:
# Missing attribute
subnode = self.construct_node(attrdict[k], missing)
if not subnode._def.multi:
node.add_single(k, subnode)
else:
node.add_single(k, [])
return node
def construct(self):
rootname = self._bin.get('name')
assert rootname == self._xml.tag
return self.construct_recurse(self._bin, self._xml)
def __getattr__(self, name):
if name == 'tree':
raise AttributeError, name
return self._tree.__getattr__(name)
def __getitem__(self, name):
return self._tree.__getitem__(name)
def load_xml_files(binfile, xmlfile):
bintree = parse(binfile).getroot()
xmltree = parse(xmlfile).getroot()
return XMLGameDataReader(bintree, xmltree)
def load_gamedata():
bins = glob.glob(files.mgr.path("xml/def", "*.xml"))
xmls = glob.glob(files.mgr.path("xml", "*.xml"))
binfns = [os.path.split(x)[1] for x in bins]
xmlfns = [os.path.split(x)[1] for x in xmls]
ffns = []
for bfn in binfns:
if bfn in xmlfns:
ffns.append(bfn)
dataobjs = {}
for fn in ffns:
print fn #DELME
binfile = files.mgr.path("xml/def", fn)
xmlfile = files.mgr.path("xml", fn)
dataobj = load_xml_files(binfile, xmlfile)
dataobjs[dataobj._name] = dataobj
shader.mgr.load_shaders(dataobjs['shaders'])
return dataobjs

BIN
gamedata.pyc Executable file

Binary file not shown.

41
gametimer.py Normal file
View file

@ -0,0 +1,41 @@
import pygame
def start_loop():
global g_timer, g_elapsed
g_elapsed = 0
g_elapsed_sec = 0.0
g_timer = pygame.time.get_ticks()
def next_frame(skipping=False):
global g_timer, g_elapsed, g_elapsed_sec
newticks = pygame.time.get_ticks()
#if skipping:
# # reset g_timer to it's value from the previous frame
# g_timer -= g_elapsed
g_elapsed = newticks - g_timer
g_timer = newticks
g_elapsed_sec = float(g_elapsed) / 1000.0
def elapsed():
"""
get the amount of time in milliseconds passed since the last frame was displayed
"""
return g_elapsed
def elapsed_sec():
"""
get the amount of time in seconds passed since the last frame was displayed
"""
return g_elapsed_sec
def num_frames(delay, offset=0):
"""
if you want something to occur every "delay" milliseconds,
this will return the number of times you should make it happen
"""
global g_elapsed, g_timer
return int((g_timer - offset) / delay) - int((g_timer - g_elapsed - offset) / delay)
def get_timer():
return g_timer

BIN
gametimer.pyc Executable file

Binary file not shown.

77
inputs.py Normal file
View file

@ -0,0 +1,77 @@
from pygame.locals import *
import video
state = {}
commands = {}
bindings = {
K_LEFT: '+left',
K_RIGHT: '+right',
K_UP: '+up',
K_DOWN: '+down',
K_RETURN: 'select',
K_COMMA: '+leanleft',
K_PERIOD: '+leanright',
K_q: 'exit',
K_d: 'debug',
K_TAB: '+accel',
K_BACKSPACE: '+brake',
}
aliases = {}
keys = {}
def keyup(key):
global commands, keys, bindings, aliases
if not key in keys:
return
del keys[key]
if key in bindings:
bind = bindings[key]
if bind in commands:
del commands[bind]
if bind and bind[1:] in state:
del state[bind[1:]]
def keydown(key):
global commands, keys, bindings, aliases
keys[key] = 0
if key in bindings:
bind = bindings[key]
if bind in aliases:
"execute alias TODO"
elif bind and bind[0] == '+':
state[bind[1:]] = 0
add_command(bind[1:])
elif bind:
add_command(bind)
def add_command(cmd):
global commands
if not cmd in commands:
commands[cmd] = 1
return
else:
commands[cmd] += 1
def received_command(cmd):
if cmd in commands:
if commands[cmd] > 0:
commands[cmd] -= 1
return True
return False
def received_command_multi(cmd):
if cmd in commands:
if commands[cmd] > 0:
commands[cmd] = 0
return True
return False
def next_frame():
global commands
if video.skipping_next_frame():
return
commands = {}

5
looprun.bat Normal file
View file

@ -0,0 +1,5 @@
@echo off
:restart
roc_test.py
pause
goto restart

167
pipeline.py Normal file
View file

@ -0,0 +1,167 @@
from OpenGL.GL import *
import shader
import physics
from py3dutil import *
from enums import *
class pipeline_manager(object):
def __init__(self):
self.phase = 'move'
self.updates = []
self.renders = []
self.phases = [
('handle_input', {}),
('ai', {}),
('animate', {}),
('move', {}),
('collide', {'func': physics.mgr.postcollide}),
('prerender', {})
]
self.pipelines = [
('camera', {}),
('player', {'lighting': False, 'shader': 'standard'}),
('model', {'lighting': False, 'shader': 'standard'}),
# ('shadow', {}),
# ('particle', {'lighting': False, 'depthsort': obarr(), 'nodepthbuffer': True, 'shader': 'sprite'}),
# ('sprite', {'lighting': False, 'depthsort': obarr(), 'nodepthbuffer': True, 'shader': 'sprite'}),
('composite1', {}),
('composite2', {}),
]
self.phase_index = {}
for i, phase in enumerate(self.phases):
self.phase_index[phase[0]] = i
self.updates.append(obarr())
self.pipeline_index = {}
for i, pipe in enumerate(self.pipelines):
self.pipeline_index[pipe[0]] = i
self.renders.append(obarr())
def update(self):
for i, updarr in enumerate(self.updates):
phase = self.phases[i]
self.phase = phase[0]
retval = False
repeat_count = 1
if 'repeat' in phase and phase[1]['repeat']:
repeat_count = phase[1]['repeat']
while repeat_count > 0:
if 'func' in phase:
retval = phase['func']()
else:
for o in updarr:
c = eval("o.%s" % (phase[0],))
if callable(c):
rv = c()
if rv:
retval = rv
if not ('repeat' in phase and phase[1]['repeat']) or retval:
repeat_count -= 1
else:
if 'fail_func' in phase[1]:
phase[1]['fail_func']()
break
physics.mgr.postcollide()
def render(self):
for i, renarr in enumerate(self.renders):
for ren in renarr:
ren.owner.calc_render_pos()
for i, renarr in enumerate(self.renders):
type, typedata = self.pipelines[i]
if 'depthsort' in typedata:
depthsort = typedata['depthsort']
depthsort.resize(len(renarr))
for i in range(len(renarr)):
depthsort[i] = renarr[i].owner.render_pos.mag()
renarr.sort(depthsort)
lighting_on = 'lighting' in typedata and typedata['lighting']
shader_on = 'shader' in typedata
depth_off = 'nodepthbuffer' in typedata and typedata['nodepthbuffer']
if lighting_on:
glEnable(GL_LIGHTING)
if shader_on:
shader.mgr.select(typedata['shader'])
if depth_off:
glDepthMask(GL_FALSE)
for o in renarr:
if lighting_on:
o.owner.illuminate()
o.owner.render(o.layer)
if depth_off:
glDepthMask(GL_TRUE)
if lighting_on:
glDisable(GL_LIGHTING)
if shader_on:
shader.mgr.select("ffp")
for i, renarr in enumerate(self.renders):
for ren in renarr:
ren.owner.clear_render_pos()
mgr = pipeline_manager()
def register_ship(obj):
render_pipes = ('model',)
update_pipes = ('ai', 'move', 'collide')
register(obj, update_pipes)
def register_player(obj):
render_pipes = ('model',)
update_pipes = ('handle_input', 'move', 'collide')
register(obj, update_pipes)
def register_particles(obj):
render_pipes = ('particle',)
update_pipes = ('move',)
register(obj, update_pipes)
def register_direct(obj, update_pipes, render_pipes):
assert False
obj._pipeline_update = tuple(update_pipes)
obj._pipeline_render = tuple(render_pipes)
for phase in update_pipes:
i = mgr.phase_index[phase]
mgr.updates[i].append(obj)
for pipe in render_pipes:
i = mgr.pipeline_index[pipe]
mgr.renders[i].append(obj)
def register(obj, update_pipes):
obj._pipeline_update = tuple(update_pipes)
for phase in update_pipes:
i = mgr.phase_index[phase]
mgr.updates[i].append(obj)
for lc in obj.layers:
i = lc.layer.pipeline
mgr.renders[i].append(lc)
def unregister(obj):
update = obj._pipeline_update
del obj._pipeline_update
for lc in obj.layers:
ir = lc.layer.pipeline
mgr.renders[ir].remove(lc)
for u in update:
iu = mgr.phase_index[u]
mgr.updates[iu].remove(obj)

97
refuge.py Executable file
View file

@ -0,0 +1,97 @@
#!/usr/local/bin/python2.4
import pygame
from pygame.locals import *
import os
import sys
import math
import random
import inputs
import gamedata
import gametimer
import video
import glwrapper
import init_universe
import universe
import time
import components
try:
from PIL import PngImagePlugin
except:
import PngImagePlugin
from gameobj import *
from player import *
from particles import *
from ai import *
pygame.init()
gamedata.load_gamedata()
size = width, height = (1600,1200)
size = width, height = (1024,768)
video.set_res(size)
video.init()
video.enable_vsync()
gametimer.start_loop()
init_universe.init()
view = None
skipping = False
while True:
events = pygame.event.get()
#if skipping:
# print "SKIPPING! Forced? %s" % (video.get_forced_redraw(),)
gametimer.next_frame(skipping)
"""
if guiscreen != None or guidlg != None:
video.force_redraw() # irrelevant right now, but when we exit the gui, we'll need a full redraw!
for ev in events:
if ev.type == QUIT:
inputs.add_command('exit')
break
if 'exit' in inputs.commands:
break
if guiscreen:
guiscreen.distribute_events(*events)
continue
"""
pygame.event.pump()
for ev in events:
if ev.type == QUIT:
inputs.add_command('exit')
break
elif ev.type == KEYUP:
inputs.keyup(ev.key)
elif ev.type == KEYDOWN:
inputs.keydown(ev.key)
#elif ev.type == VIDEOEXPOSE:
# video.force_redraw()
elif ev.type in (MOUSEBUTTONDOWN, MOUSEBUTTONUP):
pass
if 'exit' in inputs.commands:
break
#map.handle_keys(keys)
#units.mgr.update()
#view.update()
#if video.get_forced_redraw():
# video.get_scr().fill((0,0,0))
#skipping = video.skipping_next_frame()
if not skipping:
universe.next_frame()
video.predraw()
universe.render()
if not skipping:
video.next_frame()
inputs.next_frame()
else:
video.reset_skipping()

19
roc_test.py Normal file
View file

@ -0,0 +1,19 @@
import pygame
from pygame.locals import *
import gamedata
import gametimer
import video
import shader
pygame.init()
gamedata.load_gamedata()
size = width, height = (1600,1200)
size = width, height = (1024,768)
video.set_res(size)
video.init()
video.enable_vsync()
gametimer.start_loop()
print shader.mgr.detect()

194
shader.py Normal file
View file

@ -0,0 +1,194 @@
import ctypes
from OpenGL.GL import *
try:
import OpenGL.raw.GL
raw = OpenGL.raw
except ImportError:
pass
from OpenGL.arrays import GLintArray, GLcharArray, GLsizeiArray, GLcharARBArray
import sys
class shader_manager(object):
def __init__(self):
# Fixed Pipeline is always zero
self.shaderlib = {'ffp': 0}
self.shaderprograms = {}
self.shadersources = []
def use_gl2_shaders(self):
self.funcs = {
'create': glCreateShader,
'source': glShaderSource,
'compile': glCompileShader,
'program': glCreateProgram,
'attach': glAttachShader,
'link': glLinkProgram,
'use': glUseProgram,
'param': glGetShaderiv,
'uniform': glUniform4f,
'arraytype': GLcharArray
}
def use_raw_shaders(self):
self.funcs = {
'create': raw.GL.glCreateShader,
'source': raw.GL.glShaderSource,
'compile': raw.GL.glCompileShader,
'program': raw.GL.glCreateProgram,
'attach': raw.GL.glAttachShader,
'link': raw.GL.glLinkProgram,
'use': raw.GL.glUseProgram,
'param': raw.GL.glGetShaderiv
}
def use_arb_shaders(self):
from OpenGL.GL.ARB import shader_objects
if not shader_objects.glInitShaderObjectsARB():
raise RuntimeError("ARB Shaders failed to initialize")
self.funcs = {
'create': shader_objects.glCreateShaderObjectARB,
'source': shader_objects.glShaderSourceARB,
'compile': shader_objects.glCompileShaderARB,
'program': shader_objects.glCreateProgramObjectARB,
'attach': shader_objects.glAttachObjectARB,
'link': shader_objects.glLinkProgramARB,
'use': shader_objects.glUseProgramObjectARB,
'uniform': shader_objects.glUniform4fARB,
'param': shader_objects.glGetObjectParameterivARB
}
def use_arb_new_shaders(self):
from OpenGL.GL.ARB import shader_objects_new
shader_objects = shader_objects_new
if not shader_objects.glInitShaderObjectsARB():
raise RuntimeError("ARB New Shaders failed to initialize")
self.funcs = {
'create': shader_objects.glCreateShaderObjectARB,
'source': shader_objects.base_glShaderSourceARB,
'compile': shader_objects.glCompileShaderARB,
'program': shader_objects.glCreateProgramObjectARB,
'attach': shader_objects.glAttachObjectARB,
'link': shader_objects.glLinkProgramARB,
'use': shader_objects.glUseProgramObjectARB,
'param': shader_objects.glGetObjectParameterivARB,
'arraytype': GLcharARBArray
}
def init_gl(self):
import files
#print glGetString(GL_EXTENSIONS)
if True:
self.use_gl2_shaders()
else:
self.use_arb_shaders()
#self.use_gl2_shaders()
for name, vertex, fragment in self.shadersources:
vf = files.mgr.open('shaders/%s.vert' % (vertex,))
ff = files.mgr.open('shaders/%s.frag' % (fragment,))
vs = self.funcs['create'](GL_VERTEX_SHADER)
fs = self.funcs['create'](GL_FRAGMENT_SHADER)
self.funcs['source'](vs, vf.read())
self.funcs['source'](fs, ff.read())
rv = self.funcs['compile'](vs)
rv = self.funcs['compile'](fs)
sp = self.funcs['program']()
self.funcs['attach'](sp, vs)
self.funcs['attach'](sp, fs)
rv = self.funcs['link'](sp)
self.shaderlib[name] = sp
self.shaderprograms[name] = (vs, fs)
def detect(self):
shaderlist = [
('GL2', self.use_gl2_shaders),
('ARB', self.use_arb_shaders),
('ARBNEW', self.use_arb_new_shaders),
('RAW', self.use_raw_shaders)
]
workable_shaders = []
for shadername, shaderinit in shaderlist:
try:
shaderinit()
except:
print "Shader type %s failed to initialize" % (shadername,)
continue
try:
self.select("ffp")
except:
print "Shader type %s failed to access the fixed function pipeline" % (shadername,)
continue
try:
self.select("standard")
except:
print "Shader type %s failed to load the \"standard\" vertex and fragment shaders" % (shadername,)
continue
workable_shaders.append(shadername)
return workable_shaders
def init_shadertype(self, shadertype):
if shadertype == "GL2":
self.use_gl2_shaders()
elif shadertype == "ARB":
self.use_arb_shaders()
elif shadertype == "ARBNEW":
self.use_arb_new_shaders()
elif shadertype == "RAW":
self.use_raw_shaders()
def select(self, shader):
if self.shadersources:
self.init_gl()
self.shadersources = []
if not shader in self.shaderlib:
self.funcs['use'](0)
return True
try:
self.funcs['use'](self.shaderlib[shader])
except GLError:
p = self.shaderlib[shader]
v, f = self.shaderprograms[shader]
print "Shader failed to execute: %s" % (shader,)
print "Vertex shader log:"
lenarr = GLintArray.zeros(1)
glGetShaderiv(v, GL_INFO_LOG_LENGTH, lenarr)
infoarr = GLcharArray.zeros(lenarr[0])
outsize = GLsizeiArray.zeros(1)
glGetShaderInfoLog(v, lenarr[0], outsize, infoarr)
print ''.join([chr(x) for x in infoarr[:outsize[0]]])
print "Fragment shader log:"
lenarr = GLintArray.zeros(1)
glGetShaderiv(f, GL_INFO_LOG_LENGTH, lenarr)
infoarr = GLcharArray.zeros(lenarr[0])
outsize = GLsizeiArray.zeros(1)
glGetShaderInfoLog(f, lenarr[0], outsize, infoarr)
print ''.join([chr(x) for x in infoarr[:outsize[0]]])
print "Program info log:"
lenarr = GLintArray.zeros(1)
glGetProgramiv(p, GL_INFO_LOG_LENGTH, lenarr)
infoarr = GLcharArray.zeros(lenarr[0])
outsize = GLsizeiArray.zeros(1)
glGetProgramInfoLog(p, lenarr[0], outsize, infoarr)
print ''.join([chr(x) for x in infoarr[:outsize[0]]])
glDeleteShader(v)
glDeleteShader(f)
glDeleteProgram(p)
del self.shaderprograms[shader]
del self.shaderlib[shader]
glUseProgram(0)
return False
return True
def load_shaders(self, shaders):
for shader in shaders.shader:
self.shadersources.append((shader['id'], shader['vertex'], shader['fragment']))
mgr = shader_manager()

BIN
shader.pyc Executable file

Binary file not shown.

80
video.py Normal file
View file

@ -0,0 +1,80 @@
#!/usr/bin/env python2.4
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.arrays import GLcharArray
import pygame
from pygame.locals import *
import sys
def enable_vsync():
if sys.platform != 'darwin':
return
try:
import ctypes
import ctypes.util
ogl = ctypes.cdll.LoadLibrary(ctypes.util.find_library("OpenGL"))
v = ctypes.c_int(1)
ogl.CGLSetParameter(ogl.CGLGetCurrentContext(), ctypes.c_int(222), ctypes.pointer(v))
except:
print "Unable to set vsync mode, using driver defaults"
def skipping_next_frame():
return False
def set_res((width, height)):
if height==0:
height=1
pygame.display.gl_set_attribute(GL_DEPTH_SIZE, 24)
video_flags = OPENGL|DOUBLEBUF
#video_flags = OPENGL|DOUBLEBUF|FULLSCREEN
pygame.display.set_mode((width, height), video_flags)
#print pygame.display.gl_get_attribute(GL_DEPTH_SIZE)
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, 1.0*width/height, 1.0, 10e6)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def init():
import shader
glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glEnable(GL_CULL_FACE)
glEnable(GL_TEXTURE_2D)
glDepthFunc(GL_LEQUAL)
#glEnable(GL_BLEND)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0)
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1)
"""
"""
LightAmbient = ( (0.2, 0.2, 0.2, 1.0) )
LightDiffuse = ( (0.5, 0.5, 0.5, 1.0) )
LightPosition = ( (0.0, 0.2, 2.0, 1.0) )
glEnable(GL_LIGHTING)
glLightfv( GL_LIGHT1, GL_AMBIENT, LightAmbient )
glLightfv( GL_LIGHT1, GL_DIFFUSE, LightDiffuse )
glLightfv( GL_LIGHT1, GL_POSITION, LightPosition )
glEnable( GL_LIGHT1 )
"""
"""
shader.mgr.select("standard")
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (0.3, 0.3, 0.3, 1.0))
#glEnable(GL_AUTO_NORMAL)
def predraw():
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
#glTranslatef(-1.0, 0.0, -9.0)
glRotatef(270.0, 1.0, 0.0, 0.0)
def next_frame():
pygame.display.flip()
if __name__ == '__main__': main()

BIN
video.pyc Executable file

Binary file not shown.