Search in sources :

Example 6 with AABB

use of org.terasology.math.AABB in project Terasology by MovingBlocks.

the class SkeletonRenderer method renderOpaque.

@Override
public void renderOpaque() {
    Vector3f cameraPosition = worldRenderer.getActiveCamera().getPosition();
    Quat4f worldRot = new Quat4f();
    Vector3f worldPos = new Vector3f();
    Quat4f inverseWorldRot = new Quat4f();
    FloatBuffer tempMatrixBuffer44 = BufferUtils.createFloatBuffer(16);
    FloatBuffer tempMatrixBuffer33 = BufferUtils.createFloatBuffer(12);
    for (EntityRef entity : entityManager.getEntitiesWith(SkeletalMeshComponent.class, LocationComponent.class)) {
        SkeletalMeshComponent skeletalMesh = entity.getComponent(SkeletalMeshComponent.class);
        if (skeletalMesh.mesh == null || skeletalMesh.material == null || skeletalMesh.boneEntities == null || !skeletalMesh.material.isRenderable()) {
            continue;
        }
        AABB aabb;
        MeshAnimation animation = skeletalMesh.animation;
        if (animation != null) {
            aabb = animation.getAabb();
        } else {
            aabb = skeletalMesh.mesh.getStaticAabb();
        }
        LocationComponent location = entity.getComponent(LocationComponent.class);
        location.getWorldRotation(worldRot);
        inverseWorldRot.inverse(worldRot);
        location.getWorldPosition(worldPos);
        float worldScale = location.getWorldScale();
        aabb = aabb.transform(worldRot, worldPos, worldScale);
        if (!worldRenderer.getActiveCamera().hasInSight(aabb)) {
            continue;
        }
        skeletalMesh.material.enable();
        skeletalMesh.material.setFloat("sunlight", 1.0f, true);
        skeletalMesh.material.setFloat("blockLight", 1.0f, true);
        skeletalMesh.material.setFloat3("colorOffset", skeletalMesh.color.rf(), skeletalMesh.color.gf(), skeletalMesh.color.bf(), true);
        skeletalMesh.material.setMatrix4("projectionMatrix", worldRenderer.getActiveCamera().getProjectionMatrix());
        skeletalMesh.material.bindTextures();
        Vector3f worldPositionCameraSpace = new Vector3f();
        worldPositionCameraSpace.sub(worldPos, cameraPosition);
        worldPos.y -= skeletalMesh.heightOffset;
        Matrix4f matrixCameraSpace = new Matrix4f(worldRot, worldPositionCameraSpace, worldScale);
        Matrix4f modelViewMatrix = MatrixUtils.calcModelViewMatrix(worldRenderer.getActiveCamera().getViewMatrix(), matrixCameraSpace);
        MatrixUtils.matrixToFloatBuffer(modelViewMatrix, tempMatrixBuffer44);
        skeletalMesh.material.setMatrix4("worldViewMatrix", tempMatrixBuffer44, true);
        MatrixUtils.matrixToFloatBuffer(MatrixUtils.calcNormalMatrix(modelViewMatrix), tempMatrixBuffer33);
        skeletalMesh.material.setMatrix3("normalMatrix", tempMatrixBuffer33, true);
        skeletalMesh.material.setFloat("sunlight", worldRenderer.getMainLightIntensityAt(worldPos), true);
        skeletalMesh.material.setFloat("blockLight", worldRenderer.getBlockLightIntensityAt(worldPos), true);
        List<Vector3f> bonePositions = Lists.newArrayListWithCapacity(skeletalMesh.mesh.getVertexCount());
        List<Quat4f> boneRotations = Lists.newArrayListWithCapacity(skeletalMesh.mesh.getVertexCount());
        for (Bone bone : skeletalMesh.mesh.getBones()) {
            EntityRef boneEntity = skeletalMesh.boneEntities.get(bone.getName());
            if (boneEntity == null) {
                boneEntity = EntityRef.NULL;
            }
            LocationComponent boneLocation = boneEntity.getComponent(LocationComponent.class);
            if (boneLocation != null) {
                Vector3f pos = boneLocation.getWorldPosition();
                pos.sub(worldPos);
                inverseWorldRot.rotate(pos, pos);
                bonePositions.add(pos);
                Quat4f rot = new Quat4f(inverseWorldRot);
                rot.mul(boneLocation.getWorldRotation());
                boneRotations.add(rot);
            } else {
                logger.warn("Unable to resolve bone \"{}\"", bone.getName());
                bonePositions.add(new Vector3f());
                boneRotations.add(new Quat4f());
            }
        }
        ((OpenGLSkeletalMesh) skeletalMesh.mesh).setScaleTranslate(skeletalMesh.scale, skeletalMesh.translate);
        ((OpenGLSkeletalMesh) skeletalMesh.mesh).render(bonePositions, boneRotations);
    }
}
Also used : FloatBuffer(java.nio.FloatBuffer) LocationComponent(org.terasology.logic.location.LocationComponent) Matrix4f(org.terasology.math.geom.Matrix4f) OpenGLSkeletalMesh(org.terasology.rendering.opengl.OpenGLSkeletalMesh) Vector3f(org.terasology.math.geom.Vector3f) BaseVector3f(org.terasology.math.geom.BaseVector3f) MeshAnimation(org.terasology.rendering.assets.animation.MeshAnimation) Bone(org.terasology.rendering.assets.skeletalmesh.Bone) EntityRef(org.terasology.entitySystem.entity.EntityRef) BaseQuat4f(org.terasology.math.geom.BaseQuat4f) Quat4f(org.terasology.math.geom.Quat4f) AABB(org.terasology.math.AABB)

Example 7 with AABB

use of org.terasology.math.AABB in project Terasology by MovingBlocks.

the class MD5AnimationLoader method createAnimation.

private MeshAnimationData createAnimation(MD5 md5) {
    List<String> boneNames = Lists.newArrayListWithCapacity(md5.numJoints);
    TIntList boneParents = new TIntArrayList(md5.numJoints);
    for (int i = 0; i < md5.numJoints; ++i) {
        boneNames.add(md5.joints[i].name);
        boneParents.add(md5.joints[i].parent);
    }
    float timePerFrame = 1.0f / md5.frameRate;
    List<MeshAnimationFrame> frames = Lists.newArrayList();
    for (int frameIndex = 0; frameIndex < md5.numFrames; ++frameIndex) {
        MD5Frame frame = md5.frames[frameIndex];
        List<Vector3f> positions = Lists.newArrayListWithExpectedSize(md5.numJoints);
        List<Vector3f> rawRotations = Lists.newArrayListWithExpectedSize(md5.numJoints);
        for (int i = 0; i < md5.numJoints; ++i) {
            positions.add(new Vector3f(md5.baseFramePosition[i]));
            rawRotations.add(new Vector3f(md5.baseFrameOrientation[i]));
        }
        for (int jointIndex = 0; jointIndex < md5.numJoints; ++jointIndex) {
            int compIndex = 0;
            if ((md5.joints[jointIndex].flags & POSITION_X_FLAG) != 0) {
                positions.get(jointIndex).x = frame.components[md5.joints[jointIndex].startIndex + compIndex];
                compIndex++;
            }
            if ((md5.joints[jointIndex].flags & POSITION_Y_FLAG) != 0) {
                positions.get(jointIndex).y = frame.components[md5.joints[jointIndex].startIndex + compIndex];
                compIndex++;
            }
            if ((md5.joints[jointIndex].flags & POSITION_Z_FLAG) != 0) {
                positions.get(jointIndex).z = frame.components[md5.joints[jointIndex].startIndex + compIndex];
                compIndex++;
            }
            if ((md5.joints[jointIndex].flags & ORIENTATION_X_FLAG) != 0) {
                rawRotations.get(jointIndex).x = frame.components[md5.joints[jointIndex].startIndex + compIndex];
                compIndex++;
            }
            if ((md5.joints[jointIndex].flags & ORIENTATION_Y_FLAG) != 0) {
                rawRotations.get(jointIndex).y = frame.components[md5.joints[jointIndex].startIndex + compIndex];
                compIndex++;
            }
            if ((md5.joints[jointIndex].flags & ORIENTATION_Z_FLAG) != 0) {
                rawRotations.get(jointIndex).z = frame.components[md5.joints[jointIndex].startIndex + compIndex];
            }
        }
        List<Quat4f> rotations = rawRotations.stream().map(rot -> MD5ParserCommon.completeQuat4f(rot.x, rot.y, rot.z)).collect(Collectors.toCollection(ArrayList::new));
        // Rotate just the root bone to correct for coordinate system differences
        rotations.set(0, MD5ParserCommon.correctQuat4f(rotations.get(0)));
        positions.set(0, MD5ParserCommon.correctOffset(positions.get(0)));
        frames.add(new MeshAnimationFrame(positions, rotations));
    }
    AABB aabb = AABB.createEncompassing(Arrays.asList(md5.bounds));
    return new MeshAnimationData(boneNames, boneParents, frames, timePerFrame, aabb);
}
Also used : Charsets(com.google.common.base.Charsets) TIntList(gnu.trove.list.TIntList) MeshAnimationFrame(org.terasology.rendering.assets.animation.MeshAnimationFrame) Arrays(java.util.Arrays) TIntArrayList(gnu.trove.list.array.TIntArrayList) Vector3f(org.terasology.math.geom.Vector3f) IOException(java.io.IOException) InputStreamReader(java.io.InputStreamReader) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) MeshAnimationData(org.terasology.rendering.assets.animation.MeshAnimationData) List(java.util.List) Lists(com.google.common.collect.Lists) Matcher(java.util.regex.Matcher) Quat4f(org.terasology.math.geom.Quat4f) AbstractAssetFileFormat(org.terasology.assets.format.AbstractAssetFileFormat) AssetDataFile(org.terasology.assets.format.AssetDataFile) AABB(org.terasology.math.AABB) RegisterAssetFileFormat(org.terasology.assets.module.annotations.RegisterAssetFileFormat) BufferedReader(java.io.BufferedReader) Pattern(java.util.regex.Pattern) ResourceUrn(org.terasology.assets.ResourceUrn) InputStream(java.io.InputStream) MeshAnimationFrame(org.terasology.rendering.assets.animation.MeshAnimationFrame) TIntArrayList(gnu.trove.list.array.TIntArrayList) Vector3f(org.terasology.math.geom.Vector3f) MeshAnimationData(org.terasology.rendering.assets.animation.MeshAnimationData) TIntList(gnu.trove.list.TIntList) Quat4f(org.terasology.math.geom.Quat4f) AABB(org.terasology.math.AABB)

Example 8 with AABB

use of org.terasology.math.AABB in project Terasology by MovingBlocks.

the class LwjglCanvasRenderer method drawMesh.

@Override
public void drawMesh(Mesh mesh, Material material, Rect2i drawRegion, Rect2i cropRegion, Quat4f rotation, Vector3f offset, float scale, float alpha) {
    if (!material.isRenderable()) {
        return;
    }
    AABB meshAABB = mesh.getAABB();
    Vector3f meshExtents = meshAABB.getExtents();
    float fitScale = 0.35f * Math.min(drawRegion.width(), drawRegion.height()) / Math.max(meshExtents.x, Math.max(meshExtents.y, meshExtents.z));
    Vector3f centerOffset = meshAABB.getCenter();
    centerOffset.scale(-1.0f);
    Matrix4f centerTransform = new Matrix4f(BaseQuat4f.IDENTITY, centerOffset, 1.0f);
    Matrix4f userTransform = new Matrix4f(rotation, offset, -fitScale * scale);
    Matrix4f translateTransform = new Matrix4f(BaseQuat4f.IDENTITY, new Vector3f(drawRegion.minX() + drawRegion.width() / 2, drawRegion.minY() + drawRegion.height() / 2, 0), 1);
    userTransform.mul(centerTransform);
    translateTransform.mul(userTransform);
    Matrix4f finalMat = new Matrix4f(modelView);
    finalMat.mul(translateTransform);
    MatrixUtils.matrixToFloatBuffer(finalMat, matrixBuffer);
    material.setFloat4(CROPPING_BOUNDARIES_PARAM, cropRegion.minX(), cropRegion.maxX(), cropRegion.minY(), cropRegion.maxY());
    material.setMatrix4("posMatrix", translateTransform);
    glEnable(GL11.GL_DEPTH_TEST);
    glClear(GL11.GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL11.GL_MODELVIEW);
    glPushMatrix();
    glLoadMatrix(matrixBuffer);
    matrixBuffer.rewind();
    boolean matrixStackSupported = material.supportsFeature(ShaderProgramFeature.FEATURE_USE_MATRIX_STACK);
    if (matrixStackSupported) {
        material.activateFeature(ShaderProgramFeature.FEATURE_USE_MATRIX_STACK);
    }
    material.setFloat("alpha", alpha);
    material.bindTextures();
    mesh.render();
    if (matrixStackSupported) {
        material.deactivateFeature(ShaderProgramFeature.FEATURE_USE_MATRIX_STACK);
    }
    glPopMatrix();
    glDisable(GL11.GL_DEPTH_TEST);
}
Also used : Matrix4f(org.terasology.math.geom.Matrix4f) Vector3f(org.terasology.math.geom.Vector3f) AABB(org.terasology.math.AABB)

Aggregations

AABB (org.terasology.math.AABB)8 Vector3f (org.terasology.math.geom.Vector3f)5 EntityRef (org.terasology.entitySystem.entity.EntityRef)3 LocationComponent (org.terasology.logic.location.LocationComponent)3 Matrix4f (org.terasology.math.geom.Matrix4f)3 Quat4f (org.terasology.math.geom.Quat4f)3 FloatBuffer (java.nio.FloatBuffer)2 Charsets (com.google.common.base.Charsets)1 Lists (com.google.common.collect.Lists)1 TIntList (gnu.trove.list.TIntList)1 TIntArrayList (gnu.trove.list.array.TIntArrayList)1 BufferedReader (java.io.BufferedReader)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 InputStreamReader (java.io.InputStreamReader)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 List (java.util.List)1 Matcher (java.util.regex.Matcher)1 Pattern (java.util.regex.Pattern)1