Package com.ardor3d.scene.state.lwjgl

Source Code of com.ardor3d.scene.state.lwjgl.LwjglCullStateUtil

/**
* Copyright (c) 2008-2012 Ardor Labs, Inc.
*
* This file is part of Ardor3D.
*
* Ardor3D is free software: you can redistribute it and/or modify it
* under the terms of its license which may be found in the accompanying
* LICENSE file or at <http://www.ardor3d.com/LICENSE>.
*/

package com.ardor3d.scene.state.lwjgl;

import org.lwjgl.opengl.GL11;

import com.ardor3d.renderer.ContextManager;
import com.ardor3d.renderer.RenderContext;
import com.ardor3d.renderer.state.CullState;
import com.ardor3d.renderer.state.CullState.Face;
import com.ardor3d.renderer.state.CullState.PolygonWind;
import com.ardor3d.renderer.state.RenderState.StateType;
import com.ardor3d.renderer.state.record.CullStateRecord;

public abstract class LwjglCullStateUtil {

    public static void apply(final CullState state) {
        // ask for the current state record
        final RenderContext context = ContextManager.getCurrentContext();
        final CullStateRecord record = (CullStateRecord) context.getStateRecord(StateType.Cull);
        context.setCurrentState(StateType.Cull, state);

        if (state.isEnabled()) {
            final Face useCullMode = state.getCullFace();

            switch (useCullMode) {
                case Front:
                    setCull(GL11.GL_FRONT, record);
                    setCullEnabled(true, record);
                    break;
                case Back:
                    setCull(GL11.GL_BACK, record);
                    setCullEnabled(true, record);
                    break;
                case FrontAndBack:
                    setCull(GL11.GL_FRONT_AND_BACK, record);
                    setCullEnabled(true, record);
                    break;
                case None:
                    setCullEnabled(false, record);
                    break;
            }
            setGLPolygonWind(state.getPolygonWind(), record);
        } else {
            setCullEnabled(false, record);
            setGLPolygonWind(PolygonWind.CounterClockWise, record);
        }

        if (!record.isValid()) {
            record.validate();
        }
    }

    private static void setCullEnabled(final boolean enable, final CullStateRecord record) {
        if (!record.isValid() || record.enabled != enable) {
            if (enable) {
                GL11.glEnable(GL11.GL_CULL_FACE);
            } else {
                GL11.glDisable(GL11.GL_CULL_FACE);
            }
            record.enabled = enable;
        }
    }

    private static void setCull(final int face, final CullStateRecord record) {
        if (!record.isValid() || record.face != face) {
            GL11.glCullFace(face);
            record.face = face;
        }
    }

    private static void setGLPolygonWind(final PolygonWind windOrder, final CullStateRecord record) {
        if (!record.isValid() || record.windOrder != windOrder) {
            switch (windOrder) {
                case CounterClockWise:
                    GL11.glFrontFace(GL11.GL_CCW);
                    break;
                case ClockWise:
                    GL11.glFrontFace(GL11.GL_CW);
                    break;
            }
            record.windOrder = windOrder;
        }
    }
}
TOP

Related Classes of com.ardor3d.scene.state.lwjgl.LwjglCullStateUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.