GL_ARB_point_sprite: Yes SDL_GetVideoInfo says 32 bpp GLSL shaders on. GLSL source for vertex shader 1: #define ZHACK 1 void DirectionalLight(in int i, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) { float nDotVP; float nDotHV; float pf; nDotVP = max(0.0, dot(normal, normalize(vec3(gl_LightSource[i].position)))); nDotHV = max(0.0, dot(normal, vec3(gl_LightSource[i].halfVector))); if (nDotVP == 0.0) pf = 0.0; else pf = pow(nDotHV, gl_FrontMaterial.shininess); ambient += gl_LightSource[i].ambient; diffuse += gl_LightSource[i].diffuse * nDotVP; specular += gl_LightSource[i].specular * pf; } void DirectionalLight(in int i, in vec3 normal, inout vec4 ambient, inout vec4 diffuse) { float nDotVP = max(0.0, dot(normal, normalize(vec3(gl_LightSource[i].position)))); ambient += gl_LightSource[i].ambient; diffuse += gl_LightSource[i].diffuse * nDotVP; } // Calculate length*density product of a line through the atmosphere // a - start coord (normalized relative to atmosphere radius) // b - end coord " " // centerDensity - atmospheric density at centre of sphere // length - real length of line in meters // Density equation is d = D-D*r where D=centreDensity, r=point dist from centre float AtmosLengthDensityProduct(vec3 a, vec3 b, float surfaceDensity, float len) { /* 4 samples */ float ldprod = 0.0; vec3 dir = b-a; /* altitude density falloff */ const float ADF = 500.0; /* don't take samples at start or end since they are likely to be zero density */ // 0.985 = 2.0 - ATMOSPHERE_RADIUS... ldprod = surfaceDensity * ( exp(-ADF*(length(a + 0.2*dir)-0.985)) + exp(-ADF*(length(a + 0.4*dir)-0.985)) + exp(-ADF*(length(a + 0.6*dir)-0.985)) + exp(-ADF*(length(a + 0.8*dir)-0.985))); ldprod *= len / 4.0; return ldprod; } float findSphereEyeRayEntryDistance(in vec3 sphereCenter, in vec3 eyeTo, in float radius) { vec3 v = -sphereCenter; vec3 dir = normalize(eyeTo); float b = -dot(v, dir); float det = (b * b) - dot(v, v) + (radius * radius); float entryDist = 0.0; if (det > 0.0) { det = sqrt(det); float i1 = b - det; float i2 = b + det; if (i2 > 0.0) { entryDist = max(i1, 0.0); } } return entryDist; } // From http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&reply_id=3513134 vec4 logarithmicTransform() { vec4 vertexPosClip = gl_ModelViewProjectionMatrix * gl_Vertex; gl_TexCoord[6] = vertexPosClip; return vertexPosClip; } /* vec2 findSphereEyeRayEntryExitDistance(in vec3 sphereCenter, in vec3 eyeTo, in float radius) { vec3 v = -sphereCenter; vec3 dir = normalize(eyeTo); float b = -dot(v, dir); float det = (b * b) - dot(v, v) + (radius * radius); vec2 dists = vec2(0.0); if (det > 0.0) { det = sqrt(det); float i1 = b - det; float i2 = b + det; if (i2 > 0) { dists.x = max(i1, 0.0); dists.y = i2; } } return dists; } */ void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_TexCoord[0] = gl_MultiTexCoord0; } GLSL IR for shader 1: ( (declare (out ) vec4 gl_Position) (declare (out ) float gl_PointSize) (declare (in ) vec4 gl_Vertex) (declare (in ) vec3 gl_Normal) (declare (in ) vec4 gl_Color) (declare (in ) vec4 gl_SecondaryColor) (declare (in ) vec4 gl_MultiTexCoord0) (declare (in ) vec4 gl_MultiTexCoord1) (declare (in ) vec4 gl_MultiTexCoord2) (declare (in ) vec4 gl_MultiTexCoord3) (declare (in ) vec4 gl_MultiTexCoord4) (declare (in ) vec4 gl_MultiTexCoord5) (declare (in ) vec4 gl_MultiTexCoord6) (declare (in ) vec4 gl_MultiTexCoord7) (declare (in ) float gl_FogCoord) (declare (out ) vec4 gl_ClipVertex) (declare (out ) vec4 gl_FrontColor) (declare (out ) vec4 gl_BackColor) (declare (out ) vec4 gl_FrontSecondaryColor) (declare (out ) vec4 gl_BackSecondaryColor) (declare (out ) float gl_FogFragCoord) (declare (uniform ) mat4 gl_ModelViewMatrix) (declare (uniform ) mat4 gl_ProjectionMatrix) (declare (uniform ) mat4 gl_ModelViewProjectionMatrix) (declare (uniform ) mat3 gl_NormalMatrix) (declare (uniform ) mat4 gl_ModelViewMatrixInverse) (declare (uniform ) mat4 gl_ProjectionMatrixInverse) (declare (uniform ) mat4 gl_ModelViewProjectionMatrixInverse) (declare (uniform ) mat4 gl_ModelViewMatrixTranspose) (declare (uniform ) mat4 gl_ProjectionMatrixTranspose) (declare (uniform ) mat4 gl_ModelViewProjectionMatrixTranspose) (declare (uniform ) mat4 gl_ModelViewMatrixInverseTranspose) (declare (uniform ) mat4 gl_ProjectionMatrixInverseTranspose) (declare (uniform ) mat4 gl_ModelViewProjectionMatrixInverseTranspose) (declare (uniform ) float gl_NormalScale) (declare (uniform ) gl_LightModelParameters gl_LightModel) (declare (uniform ) vec2 gl_MESABumpRotMatrix0) (declare (uniform ) vec2 gl_MESABumpRotMatrix1) (declare (uniform ) vec4 gl_MESAFogParamsOptimized) (declare () int gl_MaxLights) (declare () int gl_MaxClipPlanes) (declare () int gl_MaxTextureUnits) (declare () int gl_MaxTextureCoords) (declare () int gl_MaxVertexAttribs) (declare () int gl_MaxVertexUniformComponents) (declare () int gl_MaxVaryingFloats) (declare () int gl_MaxVertexTextureImageUnits) (declare () int gl_MaxCombinedTextureImageUnits) (declare () int gl_MaxTextureImageUnits) (declare () int gl_MaxFragmentUniformComponents) (declare (uniform ) (array mat4 8) gl_TextureMatrix) (declare (uniform ) (array mat4 8) gl_TextureMatrixInverse) (declare (uniform ) (array mat4 8) gl_TextureMatrixTranspose) (declare (uniform ) (array mat4 8) gl_TextureMatrixInverseTranspose) (declare (uniform ) gl_DepthRangeParameters gl_DepthRange) (declare (uniform ) (array vec4 6) gl_ClipPlane) (declare (uniform ) gl_PointParameters gl_Point) (declare (uniform ) gl_MaterialParameters gl_FrontMaterial) (declare (uniform ) gl_MaterialParameters gl_BackMaterial) (declare (uniform ) (array gl_LightSourceParameters 8) gl_LightSource) (declare (uniform ) gl_LightModelProducts gl_FrontLightModelProduct) (declare (uniform ) gl_LightModelProducts gl_BackLightModelProduct) (declare (uniform ) (array gl_LightProducts 8) gl_FrontLightProduct) (declare (uniform ) (array gl_LightProducts 8) gl_BackLightProduct) (declare (uniform ) (array vec4 8) gl_TextureEnvColor) (declare (uniform ) (array vec4 8) gl_EyePlaneS) (declare (uniform ) (array vec4 8) gl_EyePlaneT) (declare (uniform ) (array vec4 8) gl_EyePlaneR) (declare (uniform ) (array vec4 8) gl_EyePlaneQ) (declare (uniform ) (array vec4 8) gl_ObjectPlaneS) (declare (uniform ) (array vec4 8) gl_ObjectPlaneT) (declare (uniform ) (array vec4 8) gl_ObjectPlaneR) (declare (uniform ) (array vec4 8) gl_ObjectPlaneQ) (declare (uniform ) gl_FogParameters gl_Fog) (declare (out ) (array vec4 0) gl_TexCoord) (declare () int gl_MaxDrawBuffers) (function normalize (signature vec3 (parameters (declare (in ) vec3 arg0) ) ( )) ) (function dot (signature float (parameters (declare (in ) vec3 arg0) (declare (in ) vec3 arg1) ) ( )) ) (function max (signature float (parameters (declare (in ) float arg0) (declare (in ) float arg1) ) ( )) ) (function pow (signature float (parameters (declare (in ) float arg0) (declare (in ) float arg1) ) ( )) ) (function DirectionalLight (signature void (parameters (declare (in ) int i) (declare (in ) vec3 normal) (declare (inout ) vec4 ambient) (declare (inout ) vec4 diffuse) (declare (inout ) vec4 specular) ) ( (declare () float pf) (declare () float nDotVP) (declare (temporary ) vec3 normalize_retval) (assign (xyz) (var_ref normalize_retval) (call normalize ((swiz xyz (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) position) ))) ) (declare (temporary ) float dot_retval) (assign (x) (var_ref dot_retval) (call dot ((var_ref normal) (var_ref normalize_retval) )) ) (declare (temporary ) float max_retval) (assign (x) (var_ref max_retval) (call max ((constant float (0.000000)) (var_ref dot_retval) )) ) (assign (x) (var_ref nDotVP) (var_ref max_retval) ) (declare (temporary ) float dot_retval@2) (assign (x) (var_ref dot_retval@2) (call dot ((var_ref normal) (swiz xyz (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) halfVector) ))) ) (declare (temporary ) float max_retval@3) (assign (x) (var_ref max_retval@3) (call max ((constant float (0.000000)) (var_ref dot_retval@2) )) ) (if (expression bool all_equal (var_ref nDotVP) (constant float (0.000000)) ) ( (assign (x) (var_ref pf) (constant float (0.000000)) ) ) ( (declare (temporary ) float pow_retval) (assign (x) (var_ref pow_retval) (call pow ((var_ref max_retval@3) (record_ref (var_ref gl_FrontMaterial) shininess) )) ) (assign (x) (var_ref pf) (var_ref pow_retval) ) )) (assign (xyzw) (var_ref ambient) (expression vec4 + (var_ref ambient) (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) ambient) ) ) (assign (xyzw) (var_ref diffuse) (expression vec4 + (var_ref diffuse) (expression vec4 * (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) diffuse) (var_ref nDotVP) ) ) ) (assign (xyzw) (var_ref specular) (expression vec4 + (var_ref specular) (expression vec4 * (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) specular) (var_ref pf) ) ) ) )) (signature void (parameters (declare (in ) int i) (declare (in ) vec3 normal) (declare (inout ) vec4 ambient) (declare (inout ) vec4 diffuse) ) ( (declare (temporary ) vec3 normalize_retval) (assign (xyz) (var_ref normalize_retval) (call normalize ((swiz xyz (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) position) ))) ) (declare (temporary ) float dot_retval) (assign (x) (var_ref dot_retval) (call dot ((var_ref normal) (var_ref normalize_retval) )) ) (declare (temporary ) float max_retval) (assign (x) (var_ref max_retval) (call max ((constant float (0.000000)) (var_ref dot_retval) )) ) (assign (xyzw) (var_ref ambient) (expression vec4 + (var_ref ambient) (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) ambient) ) ) (assign (xyzw) (var_ref diffuse) (expression vec4 + (var_ref diffuse) (expression vec4 * (record_ref (array_ref (var_ref gl_LightSource) (var_ref i) ) diffuse) (var_ref max_retval) ) ) ) )) ) (function length (signature float (parameters (declare (in ) vec3 arg0) ) ( )) ) (function exp (signature float (parameters (declare (in ) float arg0) ) ( )) ) (function AtmosLengthDensityProduct (signature float (parameters (declare (in ) vec3 a) (declare (in ) vec3 b) (declare (in ) float surfaceDensity) (declare (in ) float len) ) ( (declare () float ADF) (declare () vec3 dir) (declare (temporary ) vec3 assignment_tmp) (assign (xyz) (var_ref assignment_tmp) (expression vec3 + (var_ref b) (expression vec3 neg (var_ref a) ) ) ) (assign (xyz) (var_ref dir) (var_ref assignment_tmp) ) (assign (x) (var_ref ADF) (constant float (500.000000)) ) (declare (temporary ) float length_retval) (assign (x) (var_ref length_retval) (call length ((expression vec3 + (var_ref a) (expression vec3 * (constant float (0.200000)) (var_ref assignment_tmp) ) ) )) ) (declare (temporary ) float exp_retval) (assign (x) (var_ref exp_retval) (call exp ((expression float * (expression float neg (var_ref ADF) ) (expression float + (var_ref length_retval) (expression float neg (constant float (0.985000)) ) ) ) )) ) (declare (temporary ) float length_retval@4) (assign (x) (var_ref length_retval@4) (call length ((expression vec3 + (var_ref a) (expression vec3 * (constant float (0.400000)) (var_ref dir) ) ) )) ) (declare (temporary ) float exp_retval@5) (assign (x) (var_ref exp_retval@5) (call exp ((expression float * (expression float neg (var_ref ADF) ) (expression float + (var_ref length_retval@4) (expression float neg (constant float (0.985000)) ) ) ) )) ) (declare (temporary ) float length_retval@6) (assign (x) (var_ref length_retval@6) (call length ((expression vec3 + (var_ref a) (expression vec3 * (constant float (0.600000)) (var_ref dir) ) ) )) ) (declare (temporary ) float exp_retval@7) (assign (x) (var_ref exp_retval@7) (call exp ((expression float * (expression float neg (var_ref ADF) ) (expression float + (var_ref length_retval@6) (expression float neg (constant float (0.985000)) ) ) ) )) ) (declare (temporary ) float length_retval@8) (assign (x) (var_ref length_retval@8) (call length ((expression vec3 + (var_ref a) (expression vec3 * (constant float (0.800000)) (var_ref dir) ) ) )) ) (declare (temporary ) float exp_retval@9) (assign (x) (var_ref exp_retval@9) (call exp ((expression float * (expression float neg (var_ref ADF) ) (expression float + (var_ref length_retval@8) (expression float neg (constant float (0.985000)) ) ) ) )) ) (declare (temporary ) float assignment_tmp@10) (assign (x) (var_ref assignment_tmp@10) (expression float * (expression float * (var_ref surfaceDensity) (expression float + (expression float + (expression float + (var_ref exp_retval) (var_ref exp_retval@5) ) (var_ref exp_retval@7) ) (var_ref exp_retval@9) ) ) (expression float / (var_ref len) (constant float (4.000000)) ) ) ) (return (var_ref assignment_tmp@10) ) )) ) (function sqrt (signature float (parameters (declare (in ) float arg0) ) ( )) ) (function findSphereEyeRayEntryDistance (signature float (parameters (declare (in ) vec3 sphereCenter) (declare (in ) vec3 eyeTo) (declare (in ) float radius) ) ( (declare () float entryDist) (declare () float b) (declare () vec3 v) (assign (xyz) (var_ref v) (expression vec3 neg (var_ref sphereCenter) ) ) (declare (temporary ) vec3 normalize_retval) (assign (xyz) (var_ref normalize_retval) (call normalize ((var_ref eyeTo) )) ) (declare (temporary ) float dot_retval) (assign (x) (var_ref dot_retval) (call dot ((var_ref v) (var_ref normalize_retval) )) ) (assign (x) (var_ref b) (expression float neg (var_ref dot_retval) ) ) (declare (temporary ) float dot_retval@11) (assign (x) (var_ref dot_retval@11) (call dot ((var_ref v) (var_ref v) )) ) (declare (temporary ) float assignment_tmp) (assign (x) (var_ref assignment_tmp) (expression float + (expression float + (expression float * (var_ref b) (var_ref b) ) (expression float neg (var_ref dot_retval@11) ) ) (expression float * (var_ref radius) (var_ref radius) ) ) ) (assign (x) (var_ref entryDist) (constant float (0.000000)) ) (if (expression bool > (var_ref assignment_tmp) (constant float (0.000000)) ) ( (declare (temporary ) float sqrt_retval) (assign (x) (var_ref sqrt_retval) (call sqrt ((var_ref assignment_tmp) )) ) (declare (temporary ) float assignment_tmp@12) (assign (x) (var_ref assignment_tmp@12) (expression float + (var_ref b) (expression float neg (var_ref sqrt_retval) ) ) ) (declare (temporary ) float assignment_tmp@13) (assign (x) (var_ref assignment_tmp@13) (expression float + (var_ref b) (var_ref sqrt_retval) ) ) (if (expression bool > (var_ref assignment_tmp@13) (constant float (0.000000)) ) ( (declare (temporary ) float max_retval) (assign (x) (var_ref max_retval) (call max ((var_ref assignment_tmp@12) (constant float (0.000000)) )) ) (assign (x) (var_ref entryDist) (var_ref max_retval) ) ) ()) ) ()) (return (var_ref entryDist) ) )) ) (function logarithmicTransform (signature vec4 (parameters ) ( (declare (temporary ) vec4 assignment_tmp) (assign (xyzw) (var_ref assignment_tmp) (expression vec4 * (var_ref gl_ModelViewProjectionMatrix) (var_ref gl_Vertex) ) ) (assign (xyzw) (array_ref (var_ref gl_TexCoord) (constant int (6)) ) (var_ref assignment_tmp) ) (return (var_ref assignment_tmp) ) )) ) (function main (signature void (parameters ) ( (assign (xyzw) (var_ref gl_Position) (expression vec4 * (var_ref gl_ModelViewProjectionMatrix) (var_ref gl_Vertex) ) ) (assign (xyzw) (array_ref (var_ref gl_TexCoord) (constant int (0)) ) (var_ref gl_MultiTexCoord0) ) )) ) ) GLSL source for fragment shader 2: #define ZHACK 1 void DirectionalLight(in int i, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) { float nDotVP; float nDotHV; float pf; nDotVP = max(0.0, dot(normal, normalize(vec3(gl_LightSource[i].position)))); nDotHV = max(0.0, dot(normal, vec3(gl_LightSource[i].halfVector))); if (nDotVP == 0.0) pf = 0.0; else pf = pow(nDotHV, gl_FrontMaterial.shininess); ambient += gl_LightSource[i].ambient; diffuse += gl_LightSource[i].diffuse * nDotVP; specular += gl_LightSource[i].specular * pf; } void DirectionalLight(in int i, in vec3 normal, inout vec4 ambient, inout vec4 diffuse) { float nDotVP = max(0.0, dot(normal, normalize(vec3(gl_LightSource[i].position)))); ambient += gl_LightSource[i].ambient; diffuse += gl_LightSource[i].diffuse * nDotVP; } // Calculate length*density product of a line through the atmosphere // a - start coord (normalized relative to atmosphere radius) // b - end coord " " // centerDensity - atmospheric density at centre of sphere // length - real length of line in meters // Density equation is d = D-D*r where D=centreDensity, r=point dist from centre float AtmosLengthDensityProduct(vec3 a, vec3 b, float surfaceDensity, float len) { /* 4 samples */ float ldprod = 0.0; vec3 dir = b-a; /* altitude density falloff */ const float ADF = 500.0; /* don't take samples at start or end since they are likely to be zero density */ // 0.985 = 2.0 - ATMOSPHERE_RADIUS... ldprod = surfaceDensity * ( exp(-ADF*(length(a + 0.2*dir)-0.985)) + exp(-ADF*(length(a + 0.4*dir)-0.985)) + exp(-ADF*(length(a + 0.6*dir)-0.985)) + exp(-ADF*(length(a + 0.8*dir)-0.985))); ldprod *= len / 4.0; return ldprod; } float findSphereEyeRayEntryDistance(in vec3 sphereCenter, in vec3 eyeTo, in float radius) { vec3 v = -sphereCenter; vec3 dir = normalize(eyeTo); float b = -dot(v, dir); float det = (b * b) - dot(v, v) + (radius * radius); float entryDist = 0.0; if (det > 0.0) { det = sqrt(det); float i1 = b - det; float i2 = b + det; if (i2 > 0.0) { entryDist = max(i1, 0.0); } } return entryDist; } uniform float invLogZfarPlus1; void SetFragDepth(float z) { gl_FragDepth = gl_DepthRange.near + (gl_DepthRange.far * log(z + 1.0) * invLogZfarPlus1); } void PointLight(in int i, in vec3 eye, in vec3 ecPosition3, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) { float nDotVP; // normal . light direction float nDotHV; // normal . light half vector float pf; // power factor float attenuation; // computed attenuation factor float d; // distance from surface to light source vec3 VP; // direction from surface to light position vec3 halfVector; // direction of maximum highlights // Compute vector from surface to light position VP = vec3(gl_LightSource[i].position) - ecPosition3; // Compute distance between surface and light position d = length(VP); // Normalize the vector from surface to light position VP = normalize(VP); // Compute attenuation attenuation = 1.0 / (gl_LightSource[i].constantAttenuation + gl_LightSource[i].linearAttenuation * d + gl_LightSource[i].quadraticAttenuation * d * d); halfVector = normalize(VP + eye); nDotVP = max(0.0, dot(normal, VP)); nDotHV = max(0.0, dot(normal, halfVector)); if (nDotVP == 0.0) pf = 0.0; else pf = pow(nDotHV, gl_FrontMaterial.shininess); ambient += gl_LightSource[i].ambient * attenuation; diffuse += gl_LightError compiling shader: data/shaders/postprocessBloom1Downsample.frag.glsl: 0:122(1): error: syntax error, unexpected EXTENSION, expecting $end OpenGL vendor: X.Org R300 Project OpenGL renderer string: Gallium 0.4 on ATI R580 Pioneer will run with shaders disabled. Error compiling shader: data/shaders/postprocessBloom1Downsample.frag.glsl: 0:122(1): error: syntax error, unexpected EXTENSION, expecting $end OpenGL vendor: X.Org R300 Project OpenGL renderer string: Gallium 0.4 on ATI R580 Pioneer will run with shaders disabled.attempt to redefine model f3k_top_0 attempt to redefine model arco01_rot attempt to redefine model arco_01 Source[i].diffuse * nDotVP * attenuation; specular += gl_LightSource[i].specular * pf * attenuation; } #extension GL_ARB_texture_rectangle : enable uniform sampler2DRect fboTex; uniform float avgLum; uniform float middleGrey; // 1st downscale stage of making the bloom texture // only takes bits of fbo that are bright enough void main(void) { const vec3 getlum = vec3(0.299, 0.587, 0.114); vec3 col = vec3(0.0); vec2 p = 2.0*gl_FragCoord.xy; vec3 c; float lum; float minLumToBloom = max(32.0*avgLum, 1.0); c = vec3(texture2DRect(fboTex, vec2(p.x, p.y))); lum = dot(getlum, c); if (lum > minLumToBloom) col += c;//*(lum-minLumToBloom); // This bit causes gradual onset of bloom ^^^^^^^^^ c = vec3(texture2DRect(fboTex, vec2(p.x+1.0, p.y))); lum = dot(getlum, c); if (lum > minLumToBloom) col += c;//*(lum-minLumToBloom); c = vec3(texture2DRect(fboTex, vec2(p.x+1.0, p.y+1.0))); lum = dot(getlum, c); if (lum > minLumToBloom) col += c;//*(lum-minLumToBloom); c = vec3(texture2DRect(fboTex, vec2(p.x, p.y+1.0))); lum = dot(getlum, c); if (lum > minLumToBloom) col += c;//*(lum-minLumToBloom); col *= 0.25; gl_FragColor = vec4(col.r, col.g, col.b, 0.0); } GLSL shader 2 failed to compile. GLSL shader 2 info log: 0:122(1): error: syntax error, unexpected EXTENSION, expecting $end HDR lighting enabled. REMEMBER TO PORT ship6model!!! ShipType: 26 ships with tag 'ship' ShipType: 1 ships with tag 'static_ship' ShipType: 4 ships with tag 'missile' one at a time? no airport_1: 1 docking ports one at a time? no ground_station_1: 1 docking ports one at a time? no ground_station_2: 2 docking ports one at a time? no ground_station_3: 3 docking ports one at a time? no ground_station_4: 4 docking ports one at a time? no mushroom_station: 2 docking ports one at a time? yes big_crappy_spacestation: 4 docking ports one at a time? no nice_spacestation: 1 docking ports 2 orbital station types and 6 surface station types.