123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package eu.tankernn.gameEngine.renderEngine.entities;
- import static eu.tankernn.gameEngine.settings.Settings.BLUE;
- import static eu.tankernn.gameEngine.settings.Settings.GREEN;
- import static eu.tankernn.gameEngine.settings.Settings.RED;
- import java.util.List;
- import java.util.Map;
- import org.lwjgl.opengl.GL11;
- import org.lwjgl.util.vector.Matrix4f;
- import org.lwjgl.util.vector.Vector3f;
- import org.lwjgl.util.vector.Vector4f;
- import eu.tankernn.gameEngine.animation.animatedModel.AnimatedModel;
- import eu.tankernn.gameEngine.animation.renderer.AnimatedModelRenderer;
- import eu.tankernn.gameEngine.entities.Entity3D;
- import eu.tankernn.gameEngine.entities.Light;
- import eu.tankernn.gameEngine.loader.models.TexturedModel;
- import eu.tankernn.gameEngine.loader.textures.ModelTexture;
- import eu.tankernn.gameEngine.loader.textures.Texture;
- import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
- import eu.tankernn.gameEngine.util.ICamera;
- import eu.tankernn.gameEngine.util.Maths;
- /**
- * Renderer for entities.
- *
- * @author Frans
- */
- public class EntityRenderer<S extends EntityShader> {
- private AnimatedModelRenderer animatedRenderer;
-
- protected S shader;
-
- /**
- * Starts shader and loads initial values.
- *
- * @param shader The shader to use when rendering entities
- * @param projectionMatrix The projection matrix to use when rendering
- * entities
- */
- @SuppressWarnings("unchecked")
- public EntityRenderer(Matrix4f projectionMatrix) {
- this((S) new EntityShader(), projectionMatrix);
- }
-
- protected EntityRenderer(S shader, Matrix4f projectionMatrix) {
- this.shader = shader;
- shader.start();
- shader.projectionMatrix.loadMatrix(projectionMatrix);
- shader.connectTextureUnits();
- shader.stop();
- animatedRenderer = new AnimatedModelRenderer();
- }
-
- /**
- * Renders entities to the current frame buffer.
- *
- * @param entities The entities to render.
- * @param toShadowSpace Transformation matrix to shadow space. Used for
- * applying shadows.
- */
- public void render(Map<TexturedModel, List<Entity3D>> entities, Matrix4f toShadowSpace, ICamera cam, Vector4f clipPlane, List<Light> lights, Texture environmentMap) {
- shader.start();
- shader.plane.loadVec4(clipPlane);
- shader.skyColor.loadVec3(RED, GREEN, BLUE);
- shader.loadLights(lights, cam.getViewMatrix());
- shader.viewMatrix.loadCamera(cam);
-
- shader.toShadowMapSpace.loadMatrix(toShadowSpace);
- shader.cameraPosition.loadVec3(cam.getPosition());
- for (TexturedModel model: entities.keySet()) {
- if (model instanceof AnimatedModel)
- animatedRenderer.render((AnimatedModel) model, cam, lights.get(0).getPosition());
- else {
- prepareTexturedModel(model, environmentMap);
- List<Entity3D> batch = entities.get(model);
- for (Entity3D entity: batch) {
- prepareInstance(entity, model);
- GL11.glDrawElements(GL11.GL_TRIANGLES, model.getModel().getIndexCount(), GL11.GL_UNSIGNED_INT, 0);
- }
- unbindTexturedModel(model);
- }
- }
- shader.stop();
- }
-
- public void cleanUp() {
- shader.cleanUp();
- }
-
- private void prepareTexturedModel(TexturedModel model, Texture environmentMap) {
- model.getModel().bind(0, 1, 2, 3);
- ModelTexture texture = model.getTexture();
- shader.numberOfRows.loadFloat(texture.getNumberOfRows());
- if (texture.hasTransparency())
- MasterRenderer.disableCulling();
- shader.useFakeLighting.loadBoolean(texture.isUseFakeLighting());
- shader.shineDamper.loadFloat(texture.getShineDamper());
- shader.reflectivity.loadFloat(texture.getReflectivity());
- shader.refractivity.loadFloat(texture.getRefractivity());
- model.getTexture().getTexture().bindToUnit(0);
- shader.usesSpecularMap.loadBoolean(texture.hasSpecularMap());
- if (texture.hasSpecularMap()) {
- texture.getSpecularMap().bindToUnit(2);
- }
- shader.usesNormalMap.loadBoolean(texture.hasNormalMap());
- if (texture.hasNormalMap())
- texture.getNormalMap().bindToUnit(1);
- bindEnvironmentMap(environmentMap);
- }
-
- private void bindEnvironmentMap(Texture environmentMap) {
- environmentMap.bindToUnit(10);
- }
-
- private void unbindTexturedModel(TexturedModel model) {
- MasterRenderer.enableCulling();
- model.getModel().unbind(0, 1, 2, 3);
- }
-
- protected void prepareInstance(Entity3D entity, TexturedModel model) {
- Vector3f rot = entity.getRotation();
- Matrix4f transformationMatrix = Maths.createTransformationMatrix(entity.getPosition(), rot.x, rot.y, rot.z, entity.getScale());
- shader.transformationMatrix.loadMatrix(transformationMatrix);
- shader.offset.loadVec2(model.getTextureXOffset(), model.getTextureYOffset());
- }
- }
|