Search in sources :

Example 26 with Matrix4

use of com.badlogic.gdx.math.Matrix4 in project bdx by GoranM.

the class GameObject method mesh.

public void mesh(Mesh mesh) {
    String meshName = mesh.name();
    if (// You're already set to the current mesh
    mesh == this.mesh)
        return;
    JsonValue mOrigin = null;
    JsonValue mDimNoScale = null;
    ArrayList<Scene> sceneList = new ArrayList<Scene>(Bdx.scenes);
    if (sceneList.indexOf(scene) >= 0)
        Collections.swap(sceneList, sceneList.indexOf(scene), 0);
    else
        sceneList.add(0, scene);
    for (Scene sce : sceneList) {
        if (sce.meshes.containsKey(meshName)) {
            mOrigin = sce.json.get("origins").get(meshName);
            mDimNoScale = sce.json.get("dimensions").get(meshName);
            break;
        }
    }
    origin = mOrigin == null ? new Vector3f() : new Vector3f(mOrigin.asFloatArray());
    dimensionsNoScale = mDimNoScale == null ? new Vector3f(1, 1, 1) : new Vector3f(mDimNoScale.asFloatArray());
    Matrix4 trans;
    if (modelInstance != null) {
        trans = modelInstance.transform;
        this.mesh.instances.remove(this);
    } else
        trans = new Matrix4();
    this.mesh = mesh;
    modelInstance = mesh.getInstance();
    modelInstance.transform.set(trans);
}
Also used : Vector3f(javax.vecmath.Vector3f) JsonValue(com.badlogic.gdx.utils.JsonValue) ArrayList(java.util.ArrayList) Matrix4(com.badlogic.gdx.math.Matrix4)

Example 27 with Matrix4

use of com.badlogic.gdx.math.Matrix4 in project bdx by GoranM.

the class Scene method init.

public void init() {
    requestedRestart = false;
    requestedEnd = false;
    paused = false;
    visible = true;
    if (shapeRenderer == null)
        shapeRenderer = new ShapeRenderer();
    drawCommands = new ArrayList<ArrayList<Object>>();
    lastFrameBuffer = new RenderBuffer(null);
    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0, 0, 0, 1));
    environment.set(new PointLightsAttribute());
    environment.set(new SpotLightsAttribute());
    environment.set(new DirectionalLightsAttribute());
    screenShaders = new ArrayList<ScreenShader>();
    defaultMaterial = new Material("__BDX_DEFAULT");
    defaultMaterial.set(new ColorAttribute(ColorAttribute.AmbientLight, 1, 1, 1, 1));
    defaultMaterial.set(new ColorAttribute(ColorAttribute.Diffuse, 1, 1, 1, 1));
    defaultMaterial.set(new BlendingAttribute());
    defaultMaterial.set(new BDXColorAttribute(BDXColorAttribute.Tint, 0, 0, 0));
    defaultMesh = new Mesh(new ModelBuilder().createBox(1.0f, 1.0f, 1.0f, defaultMaterial, Usage.Position | Usage.Normal | Usage.TextureCoordinates), this);
    meshes = new HashMap<String, Mesh>();
    textures = new HashMap<String, Texture>();
    materials = new HashMap<String, Material>();
    modelToFrame = new HashMap<>();
    materials.put(defaultMaterial.id, defaultMaterial);
    BroadphaseInterface broadphase = new DbvtBroadphase();
    DefaultCollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration();
    SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();
    CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration);
    toBeAdded = new ArrayList<GameObject>();
    toBeRemoved = new ArrayList<GameObject>();
    objects = new LinkedListNamed<GameObject>();
    lights = new LinkedListNamed<Light>();
    templates = new HashMap<String, GameObject>();
    json = new JsonReader().parse(scene);
    name = json.get("name").asString();
    world = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
    world.setDebugDrawer(new Bullet.DebugDrawer(json.get("physviz").asBoolean()));
    gravity(new Vector3f(0, 0, -json.get("gravity").asFloat()));
    float[] ac = json.get("ambientColor").asFloatArray();
    ambientLight(new Color(ac[0], ac[1], ac[2], 1));
    if (!clearColorDefaultSet) {
        float[] cc = json.get("clearColor").asFloatArray();
        Bdx.display.clearColor.set(cc[0], cc[1], cc[2], 0);
        clearColorDefaultSet = true;
    }
    if (json.get("framerateProfile").asBoolean()) {
        Bdx.profiler.init();
    }
    float[] fc = json.get("clearColor").asFloatArray();
    fogColor = new Color(fc[0], fc[1], fc[2], 1);
    fog(json.get("mistOn").asBoolean());
    fogRange(json.get("mistStart").asFloat(), json.get("mistDepth").asFloat());
    for (JsonValue mat : json.get("materials")) {
        String texName = mat.get("texture").asString();
        boolean hasAlpha = mat.get("alpha_blend").asString().equals("ALPHA");
        float opacity = hasAlpha ? mat.get("opacity").asFloat() : 1;
        Material material = new Material(mat.name);
        float[] c = mat.get("color").asFloatArray();
        material.set(ColorAttribute.createDiffuse(c[0], c[1], c[2], opacity));
        float[] s = mat.get("spec_color").asFloatArray();
        material.set(ColorAttribute.createSpecular(s[0], s[1], s[2], 1));
        material.set(FloatAttribute.createShininess(mat.get("shininess").asFloat()));
        material.set(new BDXColorAttribute(BDXColorAttribute.Tint, 0, 0, 0));
        IntAttribute shadeless = (IntAttribute) new BDXIntAttribute();
        if (mat.get("shadeless").asBoolean())
            shadeless.value = 1;
        material.set(shadeless);
        float emitStrength = mat.get("emit").asFloat();
        material.set(new BDXColorAttribute(BDXColorAttribute.Emit, emitStrength, emitStrength, emitStrength));
        if (mat.get("backface_culling").asBoolean())
            material.set(new IntAttribute(IntAttribute.CullFace, GL20.GL_BACK));
        else
            material.set(new IntAttribute(IntAttribute.CullFace, GL20.GL_NONE));
        if (texName != null) {
            Texture texture = textures.get(texName);
            if (texture == null) {
                texture = new Texture(Gdx.files.internal("bdx/textures/" + texName));
                textures.put(texName, texture);
            }
            texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
            material.texture(texture);
        }
        material.set(new DepthTestAttribute());
        if (hasAlpha) {
            BlendingAttribute ba = new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
            ba.opacity = opacity;
            material.set(ba);
            // Discard pixels that fail this alpha test (sub-1% alpha)
            material.set(FloatAttribute.createAlphaTest(0.01f));
            // Turn on back-to-front sorting for alpha-enabled objects by default
            material.backToFrontSorting(true);
        } else {
            BlendingAttribute ba = new BlendingAttribute();
            ba.blended = false;
            material.set(ba);
        }
        materials.put(mat.name, material);
    }
    for (JsonValue model : json.get("models")) {
        meshes.put(model.name, new Mesh(createModel(model), this, model.name));
    }
    HashMap<String, JsonValue> fonts = new HashMap<>();
    for (JsonValue fontj : json.get("fonts")) {
        String font = fontj.asString();
        fonts.put(font, new JsonReader().parse(Gdx.files.internal("bdx/fonts/" + font + ".fntx")));
    }
    FAnim.loadActions(json.get("actions"));
    for (JsonValue gobj : json.get("objects")) {
        GameObject g = instantiator.newObject(gobj);
        g.json = gobj;
        g.name = gobj.name;
        g.scene = this;
        g.props = new HashMap<String, JsonValue>();
        for (JsonValue prop : gobj.get("properties")) {
            g.props.put(prop.name, prop);
        }
        String meshName = gobj.get("mesh_name").asString();
        if (meshName != null) {
            g.visibleNoChildren(gobj.get("visible").asBoolean());
            g.mesh(meshName);
        } else {
            g.visibleNoChildren(false);
            g.mesh(defaultMesh);
        }
        com.badlogic.gdx.graphics.Mesh mesh = g.modelInstance.model.meshes.first();
        float[] trans = gobj.get("transform").asFloatArray();
        JsonValue origin = json.get("origins").get(meshName);
        JsonValue dimensions = json.get("dimensions").get(meshName);
        g.origin = origin == null ? new Vector3f() : new Vector3f(origin.asFloatArray());
        g.dimensionsNoScale = dimensions == null ? new Vector3f(1, 1, 1) : new Vector3f(dimensions.asFloatArray());
        JsonValue physics = gobj.get("physics");
        g.currBodyType = GameObject.BodyType.valueOf(physics.get("body_type").asString());
        g.currBoundsType = GameObject.BoundsType.valueOf(physics.get("bounds_type").asString());
        g.body = Bullet.makeBody(mesh, trans, g.origin, g.currBodyType, g.currBoundsType, physics);
        g.body.setUserPointer(g);
        g.scale(getGLMatrixScale(trans));
        String type = gobj.get("type").asString();
        if (type.equals("FONT")) {
            Text t = (Text) g;
            t.font = fonts.get(gobj.get("font").asString());
            t.text(gobj.get("text").asString());
            t.capacity = t.text().length();
            String align = gobj.get("alignment").asString();
            if (align.equals("RIGHT"))
                t.alignment(Text.Alignment.RIGHT);
            else if (align.equals("CENTER"))
                t.alignment(Text.Alignment.CENTER);
            else
                t.alignment(Text.Alignment.LEFT);
        } else if (type.equals("LAMP")) {
            JsonValue settings = gobj.get("lamp");
            Light l = (Light) g;
            if (settings.getString("type").equals("SUN"))
                l.type = Light.Type.SUN;
            else if (settings.getString("type").equals("SPOT"))
                l.type = Light.Type.SPOT;
            else
                // POINT lamps; HEMI and AREA aren't supported, so they're turned into POINTs
                l.type = Light.Type.POINT;
            l.energy(settings.getFloat("energy"));
            float[] c = settings.get("color").asFloatArray();
            l.color(new Color(c[0], c[1], c[2], c[3]));
            if (l.type.equals(Light.Type.SPOT)) {
                l.spotSize(settings.getFloat("spot_size"));
            }
        } else if (type.equals("CAMERA")) {
            Camera c = (Camera) g;
            float[] projection = gobj.get("camera").get("projection").asFloatArray();
            Vector2f resolution = new Vector2f(json.get("resolution").asFloatArray());
            if (gobj.get("camera").get("type").asString().equals("PERSP")) {
                c.initData(Camera.Type.PERSPECTIVE);
                c.size(resolution);
                c.resolution(resolution);
                c.projection(new Matrix4f(projection));
                c.fov(c.fov());
            } else {
                c.initData(Camera.Type.ORTHOGRAPHIC);
                c.size(resolution);
                c.resolution(resolution);
                c.zoom(2 / projection[0]);
            }
            Matrix4 pm = new Matrix4(projection);
            pm.inv();
            Vector3 vec = new Vector3(0, 0, -1);
            vec.prj(pm);
            c.near(-vec.z);
            vec.set(0, 0, 1);
            vec.prj(pm);
            c.far(-vec.z);
        }
        templates.put(g.name, g);
    }
    hookParentChild();
    cameras = new ArrayListNamed<Camera>();
    addInstances();
    camera = (Camera) objects.get(json.get("cameras").asStringArray()[0]);
    String frameType = json.get("frame_type").asString();
    Viewport.Type viewportType;
    if (frameType.equals("LETTERBOX")) {
        viewportType = Viewport.Type.LETTERBOX;
    } else if (frameType.equals("EXTEND")) {
        viewportType = Viewport.Type.EXTEND;
    } else {
        // "SCALE"
        viewportType = Viewport.Type.SCALE;
    }
    viewport = new Viewport(this, viewportType);
    for (GameObject g : sortByPriority(new ArrayList<GameObject>(objects))) {
        initGameObject(g);
    }
    valid = true;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) com.badlogic.gdx.graphics(com.badlogic.gdx.graphics) ModelBuilder(com.badlogic.gdx.graphics.g3d.utils.ModelBuilder) ArrayListGameObject(com.nilunder.bdx.GameObject.ArrayListGameObject) CollisionDispatcher(com.bulletphysics.collision.dispatch.CollisionDispatcher) Color(com.nilunder.bdx.utils.Color) JsonValue(com.badlogic.gdx.utils.JsonValue) Mesh(com.nilunder.bdx.gl.Mesh) ShapeRenderer(com.badlogic.gdx.graphics.glutils.ShapeRenderer) Matrix4(com.badlogic.gdx.math.Matrix4) SequentialImpulseConstraintSolver(com.bulletphysics.dynamics.constraintsolver.SequentialImpulseConstraintSolver) Environment(com.badlogic.gdx.graphics.g3d.Environment) BroadphaseInterface(com.bulletphysics.collision.broadphase.BroadphaseInterface) JsonReader(com.badlogic.gdx.utils.JsonReader) DefaultCollisionConfiguration(com.bulletphysics.collision.dispatch.DefaultCollisionConfiguration) DbvtBroadphase(com.bulletphysics.collision.broadphase.DbvtBroadphase) Vector3(com.badlogic.gdx.math.Vector3) DiscreteDynamicsWorld(com.bulletphysics.dynamics.DiscreteDynamicsWorld)

Example 28 with Matrix4

use of com.badlogic.gdx.math.Matrix4 in project bdx by GoranM.

the class Mesh method vertTransform.

public void vertTransform(int materialSlot, Matrix4f matrix) {
    Matrix4f m = matrix;
    float[] vals = { m.m00, m.m10, m.m20, m.m30, m.m01, m.m11, m.m21, m.m31, m.m02, m.m12, m.m22, m.m32, m.m03, m.m13, m.m23, m.m33 };
    model.meshes.first().transform(new Matrix4(vals), model.meshParts.get(materialSlot).offset, model.meshParts.get(materialSlot).size);
}
Also used : Matrix4f(javax.vecmath.Matrix4f) Matrix4(com.badlogic.gdx.math.Matrix4)

Example 29 with Matrix4

use of com.badlogic.gdx.math.Matrix4 in project nhglib by VoidZombie.

the class TiledForwardShader method init.

@Override
public void init() {
    super.init(shaderProgram, renderable);
    idtMatrix = new Matrix4();
    bones = new float[0];
    lightsFrustum = new Array<>();
    lightsToRender = new Array<>();
    for (int i = 0; i < 100; i++) {
        lightsFrustum.add(new IntArray());
    }
    color = new Color();
    lightTexture = new Texture(64, 128, Pixmap.Format.RGBA8888);
    lightTexture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);
    lightInfoTexture = new Texture(1, 128, Pixmap.Format.RGBA8888);
    lightInfoTexture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);
    lightPixmap = new Pixmap(64, 128, Pixmap.Format.RGBA8888);
    lightPixmap.setBlending(Pixmap.Blending.None);
    lightInfoPixmap = new Pixmap(1, 128, Pixmap.Format.RGBA8888);
    lightInfoPixmap.setBlending(Pixmap.Blending.None);
    frustums = new SmallFrustums(10, 10);
}
Also used : IntArray(com.badlogic.gdx.utils.IntArray) Matrix4(com.badlogic.gdx.math.Matrix4)

Example 30 with Matrix4

use of com.badlogic.gdx.math.Matrix4 in project nhglib by VoidZombie.

the class NhgG3dModelLoader method parseNodesRecursively.

private ModelNode parseNodesRecursively(JsonValue json) {
    ModelNode jsonNode = new ModelNode();
    String id = json.getString("id", null);
    if (id == null)
        throw new GdxRuntimeException("Node id missing.");
    jsonNode.id = id;
    JsonValue translation = json.get("translation");
    if (translation != null && translation.size != 3)
        throw new GdxRuntimeException("Node translation incomplete");
    jsonNode.translation = translation == null ? null : new Vector3(translation.getFloat(0), translation.getFloat(1), translation.getFloat(2));
    JsonValue rotation = json.get("rotation");
    if (rotation != null && rotation.size != 4)
        throw new GdxRuntimeException("Node rotation incomplete");
    jsonNode.rotation = rotation == null ? null : new Quaternion(rotation.getFloat(0), rotation.getFloat(1), rotation.getFloat(2), rotation.getFloat(3));
    JsonValue scale = json.get("scale");
    if (scale != null && scale.size != 3)
        throw new GdxRuntimeException("Node scale incomplete");
    jsonNode.scale = scale == null ? null : new Vector3(scale.getFloat(0), scale.getFloat(1), scale.getFloat(2));
    String meshId = json.getString("mesh", null);
    if (meshId != null)
        jsonNode.meshId = meshId;
    JsonValue materials = json.get("parts");
    if (materials != null) {
        jsonNode.parts = new ModelNodePart[materials.size];
        int i = 0;
        for (JsonValue material = materials.child; material != null; material = material.next, i++) {
            ModelNodePart nodePart = new ModelNodePart();
            String meshPartId = material.getString("meshpartid", null);
            String materialId = material.getString("materialid", null);
            if (meshPartId == null || materialId == null) {
                throw new GdxRuntimeException("Node " + id + " part is missing meshPartId or materialId");
            }
            nodePart.materialId = materialId;
            nodePart.meshPartId = meshPartId;
            JsonValue bones = material.get("bones");
            if (bones != null) {
                nodePart.bones = new ArrayMap<String, Matrix4>(true, bones.size, String.class, Matrix4.class);
                int j = 0;
                for (JsonValue bone = bones.child; bone != null; bone = bone.next, j++) {
                    String nodeId = bone.getString("node", null);
                    if (nodeId == null)
                        throw new GdxRuntimeException("Bone node ID missing");
                    Matrix4 transform = new Matrix4();
                    JsonValue val = bone.get("translation");
                    if (val != null && val.size >= 3)
                        transform.translate(val.getFloat(0), val.getFloat(1), val.getFloat(2));
                    val = bone.get("rotation");
                    if (val != null && val.size >= 4)
                        transform.rotate(tempQ.set(val.getFloat(0), val.getFloat(1), val.getFloat(2), val.getFloat(3)));
                    val = bone.get("scale");
                    if (val != null && val.size >= 3)
                        transform.scale(val.getFloat(0), val.getFloat(1), val.getFloat(2));
                    nodePart.bones.put(nodeId, transform);
                }
            }
            jsonNode.parts[i] = nodePart;
        }
    }
    JsonValue children = json.get("children");
    if (children != null) {
        jsonNode.children = new ModelNode[children.size];
        int i = 0;
        for (JsonValue child = children.child; child != null; child = child.next, i++) {
            jsonNode.children[i] = parseNodesRecursively(child);
        }
    }
    return jsonNode;
}
Also used : Quaternion(com.badlogic.gdx.math.Quaternion) Vector3(com.badlogic.gdx.math.Vector3) Matrix4(com.badlogic.gdx.math.Matrix4)

Aggregations

Matrix4 (com.badlogic.gdx.math.Matrix4)31 Vector3 (com.badlogic.gdx.math.Vector3)10 SpriteBatch (com.badlogic.gdx.graphics.g2d.SpriteBatch)5 Texture (com.badlogic.gdx.graphics.Texture)4 BitmapFont (com.badlogic.gdx.graphics.g2d.BitmapFont)4 Sprite (com.badlogic.gdx.graphics.g2d.Sprite)3 Material (com.badlogic.gdx.graphics.g3d.Material)3 Model (com.badlogic.gdx.graphics.g3d.Model)3 Quaternion (com.badlogic.gdx.math.Quaternion)3 JsonValue (com.badlogic.gdx.utils.JsonValue)3 InputAdapter (com.badlogic.gdx.InputAdapter)2 TextureAtlas (com.badlogic.gdx.graphics.g2d.TextureAtlas)2 Environment (com.badlogic.gdx.graphics.g3d.Environment)2 ModelInstance (com.badlogic.gdx.graphics.g3d.ModelInstance)2 ModelBuilder (com.badlogic.gdx.graphics.g3d.utils.ModelBuilder)2 com.badlogic.gdx.physics.bullet.collision.btBvhTriangleMeshShape (com.badlogic.gdx.physics.bullet.collision.btBvhTriangleMeshShape)2 com.badlogic.gdx.physics.bullet.collision.btSphereShape (com.badlogic.gdx.physics.bullet.collision.btSphereShape)2 GdxRuntimeException (com.badlogic.gdx.utils.GdxRuntimeException)2 NodeComponent (io.github.voidzombie.nhglib.runtime.ecs.components.scenes.NodeComponent)2 ArrayList (java.util.ArrayList)2