com.mbrlabs.mundus.core.Mundus.java Source code

Java tutorial

Introduction

Here is the source code for com.mbrlabs.mundus.core.Mundus.java

Source

/*
 * Copyright (c) 2016. See AUTHORS file.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.mbrlabs.mundus.core;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.kotcrab.vis.ui.VisUI;
import com.kotcrab.vis.ui.widget.file.FileChooser;
import com.mbrlabs.mundus.Main;
import com.mbrlabs.mundus.assets.ModelImporter;
import com.mbrlabs.mundus.core.kryo.KryoManager;
import com.mbrlabs.mundus.core.project.ProjectManager;
import com.mbrlabs.mundus.core.registry.Registry;
import com.mbrlabs.mundus.events.EventBus;
import com.mbrlabs.mundus.history.CommandHistory;
import com.mbrlabs.mundus.input.FreeCamController;
import com.mbrlabs.mundus.input.InputManager;
import com.mbrlabs.mundus.input.ShortcutController;
import com.mbrlabs.mundus.shader.Shaders;
import com.mbrlabs.mundus.tools.ToolManager;
import com.mbrlabs.mundus.tools.picker.GameObjectPicker;
import com.mbrlabs.mundus.tools.picker.ToolHandlePicker;
import com.mbrlabs.mundus.utils.Fa;
import com.mbrlabs.mundus.utils.ReflectionUtils;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * Core class.
 *
 * @author Marcus Brummer
 * @version 08-12-2015
 */
public class Mundus {

    private static ToolManager toolManager;
    private static InputManager input;
    private static FreeCamController freeCamController;
    private static ShortcutController shortcutController;
    private static Shaders shaders;
    private static ShapeRenderer shapeRenderer;
    private static KryoManager kryoManager;
    private static ProjectManager projectManager;
    private static Registry registry;
    private static ModelImporter modelImporter;
    private static CommandHistory commandHistory;
    private static GameObjectPicker goPicker;
    private static ToolHandlePicker handlePicker;

    public static EventBus eventBus;

    public static BitmapFont fa;
    public static ModelBatch modelBatch;

    /**
     * Loads & initializes everything.
     *
     * This includes editor specific resources but also project specific
     * resources (see ProjectContext).
     *
     */
    public static void init() {
        File homeDir = new File(Registry.HOME_DIR);
        if (!homeDir.exists()) {
            homeDir.mkdir();
        }

        initStyle();
        initFontAwesome();

        shapeRenderer = new ShapeRenderer();
        modelBatch = new ModelBatch();
        shaders = new Shaders();
        input = new InputManager();
        goPicker = new GameObjectPicker();
        handlePicker = new ToolHandlePicker();
        eventBus = new EventBus();
        kryoManager = new KryoManager();
        registry = kryoManager.loadRegistry();
        freeCamController = new FreeCamController();
        commandHistory = new CommandHistory(CommandHistory.DEFAULT_LIMIT);

        modelImporter = new ModelImporter(registry);
        projectManager = new ProjectManager(kryoManager, registry, shaders);
        toolManager = new ToolManager(input, projectManager, goPicker, handlePicker, modelBatch, shaders,
                shapeRenderer, commandHistory);
        shortcutController = new ShortcutController(registry, projectManager, commandHistory);
    }

    private static void initStyle() {
        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(
                Gdx.files.internal("fonts/open-sans/OpenSans-Regular.ttf"));
        FreeTypeFontGenerator.FreeTypeFontParameter params = new FreeTypeFontGenerator.FreeTypeFontParameter();
        params.kerning = true;
        params.borderStraight = false;
        params.genMipMaps = true;
        params.hinting = FreeTypeFontGenerator.Hinting.Full;

        // font norm
        params.size = 13;
        BitmapFont fontNorm = generator.generateFont(params);

        // font small
        params.size = 12;
        BitmapFont fontSmall = generator.generateFont(params);
        generator.dispose();

        // skin
        Skin skin = new Skin();
        skin.add("font-norm", fontNorm, BitmapFont.class);
        skin.add("font-small", fontSmall, BitmapFont.class);

        skin.addRegions(new TextureAtlas(Gdx.files.internal("ui/skin/uiskin.atlas")));
        skin.load(Gdx.files.internal("ui/skin/uiskin.json"));
        VisUI.load(skin);

        FileChooser.setFavoritesPrefsName(Main.class.getPackage().getName());
    }

    private static void initFontAwesome() {
        Fa faBuilder = new Fa(Gdx.files.internal("fonts/fa45.ttf"));
        faBuilder.getGeneratorParameter().size = (int) (Gdx.graphics.getHeight() * 0.02f);
        faBuilder.getGeneratorParameter().kerning = true;
        faBuilder.getGeneratorParameter().borderStraight = false;
        fa = faBuilder.addIcon(Fa.SAVE).addIcon(Fa.DOWNLOAD).addIcon(Fa.GIFT).addIcon(Fa.PLAY)
                .addIcon(Fa.MOUSE_POINTER).addIcon(Fa.ARROWS).addIcon(Fa.CIRCLE_O).addIcon(Fa.CIRCLE)
                .addIcon(Fa.MINUS).addIcon(Fa.CARET_DOWN).addIcon(Fa.CARET_UP).addIcon(Fa.TIMES).addIcon(Fa.SORT)
                .addIcon(Fa.HASHTAG).addIcon(Fa.PAINT_BRUSH).addIcon(Fa.STAR).addIcon(Fa.REFRESH).addIcon(Fa.EXPAND)
                .build();
    }

    public static void postEvent(Object event) {
        eventBus.post(event);
    }

    public static void registerEventListener(Object listener) {
        eventBus.register(listener);
    }

    public static void unregisterEventListener(Object listener) {
        eventBus.unregister(listener);
    }

    public static void inject(Object o) {
        // get fields that are annotated with @Inject
        List<Field> injectableFields = new ArrayList<>();
        Class clazz = o.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field f : fields) {
            if (ReflectionUtils.hasFieldAnnotation(f, Inject.class)) {
                injectableFields.add(f);
                // Log.debug("DI: found injectable field: {}", f.getName());
            }
        }

        // inject
        try {
            for (Field f : injectableFields) {
                injectField(o, f);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    /**
     * Looks at own static fields and injects value into object if found.
     *
     * @param o
     *            object, in which field should be injected
     * @param field
     *            the injectable field
     *
     * @throws IllegalAccessException
     */
    private static void injectField(Object o, Field field) throws IllegalAccessException {
        for (Field f : Mundus.class.getDeclaredFields()) {
            if (Modifier.isStatic(f.getModifiers()) && Modifier.isPrivate(f.getModifiers())) {
                if (f.getType().equals(field.getType())) {
                    field.setAccessible(true);
                    field.set(o, f.get(null));
                }
            }
        }
    }

    /**
     * Disposes everything.
     */
    public static void dispose() {
        VisUI.dispose();
        if (shapeRenderer != null)
            shapeRenderer.dispose();
        if (goPicker != null)
            goPicker.dispose();
        if (modelBatch != null)
            modelBatch.dispose();
        if (shaders != null)
            shaders.dispose();
        if (toolManager != null)
            toolManager.dispose();
        if (commandHistory != null)
            commandHistory.clear();
        if (fa != null)
            fa.dispose();
        if (projectManager != null)
            projectManager.dispose();
    }

}