So I am using Blenders BGE engine and have a Python script that allows me to parallax 1 object. I can't figure out how to get it to allow to use parallax multiple objects.

rom bge import logic

g = logic objlist = g.getCurrentScene().objects

-------------------------------------

ShaderObjects = [objlist['Room'] ] MaterialIndexList = [0]

-------------------------------------

cont = g.getCurrentController() own = cont.owner

VertexShader = """ uniform mat4 mvi; attribute vec4 Tangent;

varying vec4 vcol;

varying vec3 lvec,vvec;

vec3 TBN(in vec3 by) { vec3 tangent = (Tangent.xyz); vec3 binormal = cross(gl_Normal, Tangent.xyz)*Tangent.w; vec3 normal = gl_Normal;

vec3 tvec;
tvec.x = dot(tangent,  by);
tvec.y = dot(binormal, by);
tvec.z = dot(normal,   by);
return tvec;

}

void main() { gl_Position = ftransform();

vec4 light0 = (mvi*gl_LightSource[0].position)-gl_Vertex;

vec4 view = mvi[3]-gl_Vertex;

lvec = TBN(light0.xyz);
vvec = TBN(view.xyz);

gl_TexCoord[0] = gl_MultiTexCoord0;

vcol =gl_Color;

} """

FragmentShader = """ varying vec4 vcol; varying vec3 lvec,vvec,hvec;

uniform sampler2D color; uniform sampler2D bump; uniform sampler2D h;

void main() {

vec2 texUV, srcUV = gl_TexCoord[0].xy;

float height = texture2D(h, srcUV).r;

float v = height * 0.08 - 0.04;

vec3 vv     = normalize(vvec);

//offset thing to prevent texture swim

float depth_at_1 = texture2D(h, srcUV).r;

texUV = srcUV + (vvv)0.1;

if ( depth_at_1 < 0.52) { texUV = srcUV + (vvv)0.5; }

if ( depth_at_1 < 0.38) { texUV = srcUV + (vvv)0.7; }

if ( depth_at_1 < 0.32) { texUV = srcUV + (v*vv); }

//texUV = srcUV + (v*vv);

vec4 diffuse_color  = vcol*gl_LightSource[0].diffuse;
vec4 specular_color = gl_FrontMaterial.specular;

vec4 colormap       = texture2D(color, texUV);

vec3 lv     = normalize(lvec);

//vec3 nv   = normalize(2.0*texture2D(bump, gl_TexCoord[0].st).xyz-1.0);
vec3 nv     = normalize(2.0*texture2D(bump, texUV).xyz-1.0);

float diff  = max(dot(lv, nv), 0.0);
float spec  = pow(max(dot(reflect(-vv, nv), lv),0.0), gl_FrontMaterial.shininess);

vec4 diff_pass = colormap*(diff*diffuse_color);
vec4 spec_pass = spec*texture2D(h, texUV)*specular_color;   
gl_FragColor.rgb = (vec3(0.1,0.1,0.1)*0.0 + diff_pass.rgb + spec_pass.rgb);


// clipping UV coords for silhouette

if (0.99 < texUV.y)
{
gl_FragColor.a = texUV.y;
}
if (0.01 > texUV.y)
{
gl_FragColor.a = 1.0 - texUV.y;
}


if (0.99 < texUV.x)
{
gl_FragColor.a = texUV.x;
}
if (0.01 > texUV.x)
{
gl_FragColor.a = 1.0 - texUV.x;
}

gl_FragColor.a = 1.0 - gl_FragColor.a;

} """

def main(): # for each object for obj in ShaderObjects:

    mesh_index = 0
    mesh = obj.meshes[mesh_index]

    while mesh != None:

        for mat in mesh.materials:

            # regular TexFace materials do NOT have this function
            if not hasattr(mat, "getMaterialIndex"):
                return

            mat_index = mat.getMaterialIndex()

            # find an index             
            found = 0
            for i in range(len(MaterialIndexList)):
                if mat_index == MaterialIndexList[i]:
                    found=1
                    break
            if not found: continue

            shader = mat.getShader()
            if shader != None:
                if not shader.isValid():
                    shader.setSource(VertexShader, FragmentShader,1)

                shader.setAttrib(g.SHD_TANGENT)
                shader.setUniformDef('mvi', g.MODELVIEWMATRIX_INVERSE)
                shader.setSampler('color', 0)
                shader.setSampler('bump', 1)
                shader.setSampler('h', 2)
        mesh_index += 1
        if mesh_index < len(obj.meshes):
            mesh = obj.meshes[mesh_index]
        else:
            mesh = None
/r/Python Thread