Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- com/jme3/material/Technique.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/material/Technique.java Mon Jan 19 23:26:36 1970
- @@ -213,6 +213,9 @@
- ShaderKey key = new ShaderKey(def.getVertexShaderName(),
- def.getFragmentShaderName(),
- + def.getGeometryShaderName(),
- + def.getTessControlShaderName(),
- + def.getTessEvaluationShaderName(),
- allDefines,
- def.getShaderLanguage());
- shader = manager.loadShader(key);
- --- com/jme3/material/plugins/J3MLoader.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/material/plugins/J3MLoader.java Mon Jan 19 23:26:36 1970
- @@ -69,6 +69,9 @@
- private String shaderLang;
- private String vertName;
- private String fragName;
- + private String geomName;
- + private String tcName;
- + private String teName;
- private static final String whitespacePattern = "\\p{javaWhitespace}+";
- @@ -96,8 +99,14 @@
- shaderLang = typeAndLang[1];
- if (typeAndLang[0].equals("VertexShader")){
- vertName = split[1].trim();
- - }else if (typeAndLang[0].equals("FragmentShader")){
- + } else if (typeAndLang[0].equals("FragmentShader")){
- fragName = split[1].trim();
- + } else if (typeAndLang[0].equals("GeometryShader")){
- + geomName = split[1].trim();
- + } else if (typeAndLang[0].equals("TessControlShader")){
- + tcName = split[1].trim();
- + } else if (typeAndLang[0].equals("TessEvaluationShader")){
- + teName = split[1].trim();
- }
- }
- @@ -372,7 +381,10 @@
- private void readTechniqueStatement(Statement statement) throws IOException{
- String[] split = statement.getLine().split("[ \\{]");
- if (split[0].equals("VertexShader") ||
- - split[0].equals("FragmentShader")){
- + split[0].equals("FragmentShader") ||
- + split[0].equals("GeometryShader") ||
- + split[0].equals("TessControlShader") ||
- + split[0].equals("TessEvaluationShader")) {
- readShaderStatement(statement.getLine());
- }else if (split[0].equals("LightMode")){
- readLightMode(statement.getLine());
- @@ -412,13 +424,16 @@
- }
- if (vertName != null && fragName != null){
- - technique.setShaderFile(vertName, fragName, shaderLang);
- + technique.setShaderFile(vertName, fragName, geomName, tcName, teName, shaderLang);
- }
- materialDef.addTechniqueDef(technique);
- technique = null;
- vertName = null;
- fragName = null;
- + geomName = null;
- + tcName = null;
- + teName = null;
- shaderLang = null;
- }
- --- com/jme3/shader/Shader.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/shader/Shader.java Mon Jan 19 23:26:36 1970
- @@ -87,7 +87,17 @@
- /**
- * Control geometry assembly. (e.g compile a triangle list from input data)
- */
- - Geometry;
- + Geometry,
- +
- + /**
- + * Control hardware tesselation per vertex. (e.g allow to output multiple vertices from a single input)
- + */
- + TesselationControl,
- +
- + /**
- + * Control tesseled vertices. (e.g allow to reshape tesseled vertices)
- + */
- + TesselationEvaluation;
- }
- /**
- --- com/jme3/renderer/Caps.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/renderer/Caps.java Mon Jan 19 23:26:36 1970
- @@ -107,6 +107,11 @@
- OpenGL32,
- /**
- + * Supports OpenGL 4.0
- + */
- + OpenGL40,
- +
- + /**
- * Supports OpenGL ARB program.
- * <p>
- * OpenGL: Renderer exposes ARB_vertex_program and ARB_fragment_program
- @@ -150,6 +155,11 @@
- GLSL330,
- /**
- + * Supports GLSL 4.0
- + */
- + GLSL400,
- +
- + /**
- * Supports reading from textures inside the vertex shader.
- */
- VertexTextureFetch,
- @@ -158,6 +168,12 @@
- * Supports geometry shader.
- */
- GeometryShader,
- +
- +
- + /**
- + * Supports tesselation shader.
- + */
- + TesselationShader,
- /**
- * Supports texture arrays
- --- com/jme3/asset/Desktop.cfg Mon Jan 19 23:26:36 1970
- +++ com/jme3/asset/Desktop.cfg Mon Jan 19 23:26:36 1970
- @@ -19,4 +19,4 @@
- LOADER com.jme3.scene.plugins.ogre.MaterialLoader : material
- LOADER com.jme3.scene.plugins.ogre.SceneLoader : scene
- LOADER com.jme3.scene.plugins.blender.BlenderModelLoader : blend
- -LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, glsl, glsllib
- +LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, geom, tsctrl, tseval, glsl, glsllib
- --- com/jme3/asset/DesktopAssetManager.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/asset/DesktopAssetManager.java Mon Jan 19 23:26:36 1970
- @@ -393,13 +393,27 @@
- if (s == null){
- String vertName = key.getVertName();
- String fragName = key.getFragName();
- + String geomName = key.getGeomName();
- + String tcName = key.getTCName();
- + String teName = key.getTEName();
- String vertSource = (String) loadAsset(new AssetKey(vertName));
- String fragSource = (String) loadAsset(new AssetKey(fragName));
- + String geomSource = geomName == null ? null : (String) loadAsset(new AssetKey(geomName));
- + String tcSource = tcName == null ? null : (String) loadAsset(new AssetKey(tcName));
- + String teSource = teName == null ? null : (String) loadAsset(new AssetKey(teName));
- +
- s = new Shader(key.getLanguage());
- s.addSource(Shader.ShaderType.Vertex, vertName, vertSource, key.getDefines().getCompiled());
- s.addSource(Shader.ShaderType.Fragment, fragName, fragSource, key.getDefines().getCompiled());
- + if (geomName != null)
- + s.addSource(Shader.ShaderType.Geometry, geomName, geomSource, key.getDefines().getCompiled());
- + if (tcName != null)
- + s.addSource(Shader.ShaderType.TesselationControl, tcName, tcSource, key.getDefines().getCompiled());
- + if (teName != null)
- + s.addSource(Shader.ShaderType.TesselationEvaluation, teName, teSource, key.getDefines().getCompiled());
- +
- cache.addToCache(key, s);
- }
- --- com/jme3/scene/Mesh.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/scene/Mesh.java Mon Jan 19 23:26:36 1970
- @@ -135,7 +135,19 @@
- * {@link Mesh#setElementLengths(int[]) element lengths} must
- * be specified for this mode.
- */
- - Hybrid(false);
- + Hybrid(false),
- +
- + /**
- + * A primitive is a patch. The number of vertices of a patches can be
- + * set by the user. Used for tesselation process. This mode is only
- + * compatible with OpenGL 4.0 and above so its better to avoid it if not
- + * needed. Patches are intended to be used with tesselation shaders.
- + *
- + * To change the number of vertices of a patch, look at
- + * {@link Mesh#setPatchVertices(int)} and
- + * {@link Mesh#getPatchVertices()}.
- + */
- + Patches(true);
- private boolean listMode = false;
- @@ -170,6 +182,7 @@
- private VertexBuffer[] lodLevels;
- private float pointSize = 1;
- private float lineWidth = 1;
- + private int patchVertices = 3;
- private transient int vertexArrayID = -1;
- @@ -510,6 +523,28 @@
- public void setPointSize(float pointSize) {
- this.pointSize = pointSize;
- }
- +
- + /**
- + * Returns the number of vertices per patch. For meshes in Patch mode only.
- + *
- + * @return the number of vertices per patch.
- + *
- + * @see #setPatchVertices(int)
- + */
- + public int getPatchVertices() {
- + return patchVertices;
- + }
- +
- + /**
- + * Set the number of vertices per patch. For meshes in Patch mode only.
- + *
- + * @param patchVertices
- + * the number of vertices per patch.
- + * @see #getPatchVertices()
- + */
- + public void setPatchVertices(int patchVertices) {
- + this.patchVertices = patchVertices;
- + }
- /**
- * Returns the line width for line meshes.
- --- com/jme3/material/TechniqueDef.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/material/TechniqueDef.java Mon Jan 19 23:26:36 1970
- @@ -101,6 +101,9 @@
- private String vertName;
- private String fragName;
- + private String geomName;
- + private String tessControlName;
- + private String tessEvalName;
- private String shaderLang;
- private DefineList presetDefines;
- private boolean usesShaders;
- @@ -225,16 +228,28 @@
- *
- * @param vertexShader The name of the vertex shader
- * @param fragmentShader The name of the fragment shader
- + * @param geometryShader The name of the geometry shader
- + * @param tessControlShader The name of the tesselation control shader
- + * @param tessEvaluationShader The name of the tesselation evaluation shader
- * @param shaderLanguage The shader language
- */
- - public void setShaderFile(String vertexShader, String fragmentShader, String shaderLanguage){
- + public void setShaderFile(String vertexShader, String fragmentShader, String geometryShader,
- + String tessControlShader, String tessEvaluationShader, String shaderLanguage) {
- this.vertName = vertexShader;
- this.fragName = fragmentShader;
- + this.geomName = geometryShader;
- + this.tessControlName = tessControlShader;
- + this.tessEvalName = tessEvaluationShader;
- this.shaderLang = shaderLanguage;
- Caps langCap = Caps.valueOf(shaderLanguage);
- requiredCaps.add(langCap);
- + if(geomName != null)
- + requiredCaps.add(Caps.GeometryShader);
- + if(tessControlName != null || tessEvaluationShader != null)
- + requiredCaps.add(Caps.TesselationShader);
- +
- usesShaders = true;
- }
- @@ -315,6 +330,39 @@
- /**
- + * Returns the name of the geometry shader used by the technique, or null
- + * if no geometry shader is specified.
- + *
- + * @return the name of the geometry shader to be used.
- + */
- + public String getGeometryShaderName() {
- + return geomName;
- + }
- +
- +
- + /**
- + * Returns the name of the tessellation control shader used by the technique, or null
- + * if no tessellation control shader is specified.
- + *
- + * @return the name of the tessellation control shader to be used.
- + */
- + public String getTessControlShaderName() {
- + return tessControlName;
- + }
- +
- +
- + /**
- + * Returns the name of the tessellation evaluation shader used by the technique, or null
- + * if no tessellation evaluation shader is specified.
- + *
- + * @return the name of the tessellation evaluation shader to be used.
- + */
- + public String getTessEvaluationShaderName() {
- + return tessEvalName;
- + }
- +
- +
- + /**
- * Returns the name of the vertex shader used by the technique, or null
- * if no vertex shader is specified.
- *
- @@ -368,6 +416,9 @@
- oc.write(name, "name", null);
- oc.write(vertName, "vertName", null);
- oc.write(fragName, "fragName", null);
- + oc.write(geomName, "geomName", null);
- + oc.write(tessControlName, "tessControlName", null);
- + oc.write(tessEvalName, "tessEvalName", null);
- oc.write(shaderLang, "shaderLang", null);
- oc.write(presetDefines, "presetDefines", null);
- oc.write(lightMode, "lightMode", LightMode.Disable);
- @@ -385,6 +436,9 @@
- name = ic.readString("name", null);
- vertName = ic.readString("vertName", null);
- fragName = ic.readString("fragName", null);
- + geomName = ic.readString("geomName", null);
- + tessControlName = ic.readString("tessControlName", null);
- + tessEvalName = ic.readString("tessEvalName", null);
- shaderLang = ic.readString("shaderLang", null);
- presetDefines = (DefineList) ic.readSavable("presetDefines", null);
- lightMode = ic.readEnum("lightMode", LightMode.class, LightMode.Disable);
- --- com/jme3/shader/ShaderKey.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/shader/ShaderKey.java Mon Jan 19 23:26:36 1970
- @@ -42,22 +42,30 @@
- public class ShaderKey extends AssetKey<Shader> {
- protected String fragName;
- + protected String geomName;
- + protected String tcName;
- + protected String teName;
- protected DefineList defines;
- protected String language;
- public ShaderKey(){
- }
- - public ShaderKey(String vertName, String fragName, DefineList defines, String lang){
- + public ShaderKey(String vertName, String fragName, String geomName, String tcName, String teName, DefineList defines, String lang) {
- super(vertName);
- this.fragName = fragName;
- + this.geomName = geomName;
- + this.tcName = tcName;
- + this.teName = teName;
- this.defines = defines;
- this.language = lang;
- }
- @Override
- public String toString(){
- - return "V="+name + " F=" + fragName + (defines != null ? defines : "");
- + return "V=" + name + " F=" + fragName + (geomName != null ? " G=" + geomName : "")
- + + (tcName != null ? " TC=" + tcName : "") + (teName != null ? " TE=" + teName : "F")
- + + (defines != null ? defines : "");
- }
- @Override
- @@ -70,7 +78,10 @@
- }
- final ShaderKey other = (ShaderKey) obj;
- - if (name.equals(other.name) && fragName.equals(other.fragName)){
- + if (name.equals(other.name) && fragName.equals(other.fragName)
- + && (geomName == null ? other.geomName == null : geomName.equals(other.geomName))
- + && (tcName == null ? other.tcName == null : tcName.equals(other.tcName))
- + && (teName == null ? other.teName == null : teName.equals(other.teName))) {
- // return true;
- if (defines != null && other.defines != null)
- return defines.getCompiled().equals(other.defines.getCompiled());
- @@ -103,6 +114,18 @@
- return fragName;
- }
- + public String getGeomName() {
- + return geomName;
- + }
- +
- + public String getTCName() {
- + return tcName;
- + }
- +
- + public String getTEName() {
- + return teName;
- + }
- +
- public String getLanguage() {
- return language;
- }
- @@ -112,6 +135,9 @@
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(fragName, "fragment_name", null);
- + oc.write(geomName, "geometry_name", null);
- + oc.write(tcName, "tess_control_name", null);
- + oc.write(teName, "tess_eval_name", null);
- oc.write(language, "language", null);
- }
- @@ -120,6 +146,9 @@
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- fragName = ic.readString("fragment_name", null);
- + geomName = ic.readString("geometry_name", null);
- + tcName = ic.readString("tess_control_name", null);
- + teName = ic.readString("tess_eval_name", null);
- language = ic.readString("language", null);
- }
- --- com/jme3/renderer/lwjgl/LwjglRenderer.java Mon Jan 19 23:26:36 1970
- +++ com/jme3/renderer/lwjgl/LwjglRenderer.java Mon Jan 19 23:26:36 1970
- @@ -147,6 +147,11 @@
- caps.add(Caps.OpenGL31);
- if (ctxCaps.OpenGL32) {
- caps.add(Caps.OpenGL32);
- + caps.add(Caps.GeometryShader);
- + if (ctxCaps.OpenGL40) {
- + caps.add(Caps.OpenGL40);
- + caps.add(Caps.TesselationShader);
- + }
- }
- }
- }
- @@ -193,7 +198,9 @@
- // fall through intentional
- case 400:
- + caps.add(Caps.GLSL400);
- case 330:
- + caps.add(Caps.GLSL330);
- case 150:
- caps.add(Caps.GLSL150);
- case 140:
- @@ -921,8 +928,12 @@
- return GL_FRAGMENT_SHADER;
- case Vertex:
- return GL_VERTEX_SHADER;
- -// case Geometry:
- -// return ARBGeometryShader4.GL_GEOMETRY_SHADER_ARB;
- + case Geometry:
- + return org.lwjgl.opengl.GL32.GL_GEOMETRY_SHADER;
- + case TesselationControl:
- + return org.lwjgl.opengl.GL40.GL_TESS_CONTROL_SHADER;
- + case TesselationEvaluation:
- + return org.lwjgl.opengl.GL40.GL_TESS_EVALUATION_SHADER;
- default:
- throw new UnsupportedOperationException("Unrecognized shader type.");
- }
- @@ -956,6 +967,12 @@
- }
- stringBuf.append("\n");
- }
- +
- + if ((source.getType() == ShaderType.TesselationControl || source.getType() == ShaderType.TesselationEvaluation)
- + && version < 400)
- + throw new RendererException("GLSL version for tessellation shaders must be 4.0 or above.");
- + else if (source.getType() == ShaderType.Geometry && version < 150)
- + throw new RendererException("GLSL version for geometry shader must be 1.5 or above.");
- }
- updateNameBuffer();
- @@ -2353,6 +2370,8 @@
- return GL_TRIANGLE_FAN;
- case TriangleStrip:
- return GL_TRIANGLE_STRIP;
- + case Patches:
- + return org.lwjgl.opengl.GL40.GL_PATCHES;
- default:
- throw new UnsupportedOperationException("Unrecognized mesh mode: " + mode);
- }
- @@ -2492,6 +2511,10 @@
- glLineWidth(mesh.getLineWidth());
- context.lineWidth = mesh.getLineWidth();
- }
- + if (mesh.getMode() == Mode.Patches) {
- + checkCap(Caps.OpenGL40);
- + org.lwjgl.opengl.GL40.glPatchParameteri(org.lwjgl.opengl.GL40.GL_PATCH_VERTICES, mesh.getPatchVertices());
- + }
- statistics.onMeshDrawn(mesh, lod);
- // if (GLContext.getCapabilities().GL_ARB_vertex_array_object){
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement