- add GLSL editor to SDK by default
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8421 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
10
sdk/jme3-glsl-support/build.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
|
||||
<!-- for some information on what you could do (e.g. targets to override). -->
|
||||
<!-- If you delete this file and reopen the project it will be recreated. -->
|
||||
<project name="net.java.nboglpack.glsleditor" default="netbeans" basedir=".">
|
||||
<description>Builds, tests, and runs the project net.java.nboglpack.glsleditor.</description>
|
||||
<!--property file="./../nbproject/global.properties"/>
|
||||
<property file="./../nbproject/private/global_private.properties"/-->
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
</project>
|
27
sdk/jme3-glsl-support/license.txt
Normal file
@ -0,0 +1,27 @@
|
||||
Copyright (c) 2007, Michael Bien, Mathias Henze
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the organization nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
15
sdk/jme3-glsl-support/manifest.mf
Normal file
@ -0,0 +1,15 @@
|
||||
Manifest-Version: 1.0
|
||||
OpenIDE-Module: net.java.nboglpack.glsleditor
|
||||
OpenIDE-Module-Implementation-Version: 0
|
||||
OpenIDE-Module-Layer: net/java/nboglpack/glsleditor/layer.xml
|
||||
OpenIDE-Module-Localizing-Bundle: net/java/nboglpack/glsleditor/Bundle.properties
|
||||
|
||||
Name: net/java/nboglpack/glsleditor/dataobject/GlslGeometryShaderDataLoader.class
|
||||
OpenIDE-Module-Class: Loader
|
||||
|
||||
Name: net/java/nboglpack/glsleditor/dataobject/GlslFragmentShaderDataLoader.class
|
||||
OpenIDE-Module-Class: Loader
|
||||
|
||||
Name: net/java/nboglpack/glsleditor/dataobject/GlslVertexShaderDataLoader.class
|
||||
OpenIDE-Module-Class: Loader
|
||||
|
45
sdk/jme3-glsl-support/nbproject/build-impl.xml
Normal file
@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||
*** EDIT ../build.xml INSTEAD ***
|
||||
-->
|
||||
<project name="net.java.nboglpack.glsleditor-impl" basedir="..">
|
||||
<fail message="Please build using Ant 1.7.1 or higher.">
|
||||
<condition>
|
||||
<not>
|
||||
<antversion atleast="1.7.1"/>
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
<property file="nbproject/private/suite-private.properties"/>
|
||||
<property file="nbproject/suite.properties"/>
|
||||
<fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
|
||||
<property file="${suite.dir}/nbproject/private/platform-private.properties"/>
|
||||
<property file="${suite.dir}/nbproject/platform.properties"/>
|
||||
<macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
|
||||
<attribute name="name"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{name}" value="${@{value}}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
|
||||
<attribute name="property"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{property}" value="@{value}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<property file="${user.properties.file}"/>
|
||||
<nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||
<nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||
<nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||
<fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
|
||||
<condition>
|
||||
<not>
|
||||
<contains string="${cluster.path.evaluated}" substring="platform"/>
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
<import file="${harness.dir}/build.xml"/>
|
||||
</project>
|
8
sdk/jme3-glsl-support/nbproject/genfiles.properties
Normal file
@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=a85cd232
|
||||
build.xml.script.CRC32=bcb3cbef
|
||||
build.xml.stylesheet.CRC32=79c3b980
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=7f5f482a
|
||||
nbproject/build-impl.xml.script.CRC32=d103b190
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.46.2
|
6
sdk/jme3-glsl-support/nbproject/project.properties
Normal file
@ -0,0 +1,6 @@
|
||||
javac.compilerargs=-Xlint -Xlint:-serial
|
||||
javac.source=1.5
|
||||
license.file=license.txt
|
||||
nbm.homepage=http://kenai.com/projects/netbeans-opengl-pack
|
||||
nbm.module.author=Mathias Henze, Michael Bien
|
||||
spec.version.base=3.0.0
|
103
sdk/jme3-glsl-support/nbproject/project.xml
Normal file
@ -0,0 +1,103 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.apisupport.project</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
|
||||
<code-name-base>net.java.nboglpack.glsleditor</code-name-base>
|
||||
<suite-component/>
|
||||
<module-dependencies>
|
||||
<dependency>
|
||||
<code-name-base>org.netbeans.modules.editor.completion</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>1</release-version>
|
||||
<specification-version>1.13.2</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.netbeans.modules.editor.lib</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>2.0</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.netbeans.modules.languages</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>0-1</release-version>
|
||||
<specification-version>1.84.0.1</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.netbeans.modules.lexer</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>2</release-version>
|
||||
<specification-version>1.20.0.1</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.openide.filesystems</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<specification-version>6.4.1</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.openide.loaders</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<specification-version>5.9.1</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.openide.nodes</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<specification-version>6.7.1</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.openide.text</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<specification-version>6.21.2</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.openide.util</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<specification-version>6.8.1</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<code-name-base>org.openide.windows</code-name-base>
|
||||
<build-prerequisite/>
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<specification-version>6.16</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
<public-packages>
|
||||
<package>net.java.nboglpack.glsleditor</package>
|
||||
<package>net.java.nboglpack.glsleditor.dataobject</package>
|
||||
<package>net.java.nboglpack.glsleditor.glsl</package>
|
||||
<package>net.java.nboglpack.glsleditor.lexer</package>
|
||||
<package>net.java.nboglpack.glsleditor.vocabulary</package>
|
||||
</public-packages>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
1
sdk/jme3-glsl-support/nbproject/suite.properties
Normal file
@ -0,0 +1 @@
|
||||
suite.dir=${basedir}/..
|
@ -0,0 +1,28 @@
|
||||
OpenIDE-Module-Display-Category=jMonkeyEngine
|
||||
OpenIDE-Module-Long-Description=\
|
||||
Provides syntax highlighting and code completion with documentation for jME3 GLSL shader files.
|
||||
OpenIDE-Module-Name=GLSL Editor
|
||||
OpenIDE-Module-Short-Description=Editor for jME3 shader files
|
||||
|
||||
text/x-glsl-fragment-shader=GLSL Fragment Shader
|
||||
text/x-glsl-vertex-shader=GLSL Vertex Shader
|
||||
text/x-glsl-geometry-shader=GLSL Geometry Shader
|
||||
|
||||
#Layer.xml entries for fonts & colors in Options window:
|
||||
NetBeans=NetBeans
|
||||
glsl-keyword=Keyword
|
||||
glsl-name=Name
|
||||
glsl-brace=Brace
|
||||
glsl-value=Value
|
||||
glsl-curly-brace=Curly brace
|
||||
glsl-string-value=String value
|
||||
glsl-comment=Comment
|
||||
glsl-ml-comment=Multiline comment
|
||||
glsl-separator=Separator
|
||||
glsl-function=Function
|
||||
glsl-whitespace=Whitespace
|
||||
glsl-end-of-line=EOL
|
||||
glsl-build-in-var=Build in variable
|
||||
glsl-build-in-func=Build in function
|
||||
glsl-preprocessor=Preprocessor directive
|
||||
|
@ -0,0 +1,327 @@
|
||||
package net.java.nboglpack.glsleditor;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import org.netbeans.api.editor.completion.Completion;
|
||||
import org.openide.ErrorManager;
|
||||
import org.netbeans.editor.BaseDocument;
|
||||
import org.netbeans.spi.editor.completion.CompletionDocumentation;
|
||||
import org.netbeans.spi.editor.completion.CompletionItem;
|
||||
import org.netbeans.spi.editor.completion.CompletionProvider;
|
||||
import org.netbeans.spi.editor.completion.CompletionResultSet;
|
||||
import org.netbeans.spi.editor.completion.CompletionTask;
|
||||
import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery;
|
||||
import org.netbeans.spi.editor.completion.support.AsyncCompletionTask;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.Document;
|
||||
import javax.swing.text.Element;
|
||||
import javax.swing.text.JTextComponent;
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.net.URL;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslFragmentShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslGeometryShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslVertexShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.glsl.Glsl;
|
||||
import net.java.nboglpack.glsleditor.vocabulary.GLSLElementDescriptor;
|
||||
import org.netbeans.spi.editor.completion.support.CompletionUtilities;
|
||||
|
||||
|
||||
/**
|
||||
* Completion provider for the OpenGL Shading Language editor.
|
||||
*
|
||||
* @author Mathias Henze
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslCompletionProvider implements CompletionProvider {
|
||||
|
||||
private static final ErrorManager LOGGER = ErrorManager.getDefault().getInstance(GlslCompletionProvider.class.getName());
|
||||
|
||||
private final String mimeType;
|
||||
|
||||
private GlslCompletionProvider(String mimeType) {
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
public CompletionTask createTask(int queryType, JTextComponent component) {
|
||||
return new AsyncCompletionTask(new GlslCompletionQuery(mimeType), component);
|
||||
}
|
||||
|
||||
public int getAutoQueryTypes(JTextComponent component, String typedText) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static GlslCompletionProvider createVSCompletionProvider(){
|
||||
return new GlslCompletionProvider(GlslVertexShaderDataLoader.REQUIRED_MIME);
|
||||
}
|
||||
|
||||
public static GlslCompletionProvider createGSCompletionProvider(){
|
||||
return new GlslCompletionProvider(GlslGeometryShaderDataLoader.REQUIRED_MIME);
|
||||
}
|
||||
|
||||
public static GlslCompletionProvider createFSCompletionProvider(){
|
||||
return new GlslCompletionProvider(GlslFragmentShaderDataLoader.REQUIRED_MIME);
|
||||
}
|
||||
|
||||
|
||||
private static class GlslCompletionQuery extends AsyncCompletionQuery {
|
||||
|
||||
private GlslVocabularyManager vocabulary;
|
||||
|
||||
public GlslCompletionQuery(String mimetype) {
|
||||
vocabulary = GlslVocabularyManager.getInstance(mimetype);
|
||||
}
|
||||
|
||||
protected void query(CompletionResultSet completionResultSet, Document document, int pos) {
|
||||
|
||||
fillResultset(completionResultSet, document, pos);
|
||||
completionResultSet.finish();
|
||||
}
|
||||
|
||||
private void fillResultset(CompletionResultSet completionResultSet, Document doc, int pos) {
|
||||
|
||||
Element paragraph = ((BaseDocument) doc).getParagraphElement(pos);
|
||||
String prefix;
|
||||
try {
|
||||
prefix = doc.getText(paragraph.getStartOffset(), pos - paragraph.getStartOffset());
|
||||
// daf<EFBFBD>r sorgen, dass wir in den meisten f<EFBFBD>llen einen korrekten prefix haben
|
||||
// TODO: besser machen, ist ne hau-ruck-methode
|
||||
// problem: bei leerzeichen in strings werden auch dort funktoren als autocomplete angeboten...
|
||||
prefix = prefix.replaceAll(".*?([\\w-\"]*)$", "$1");
|
||||
} catch (BadLocationException e) {
|
||||
LOGGER.notify(e);
|
||||
prefix = "";
|
||||
}
|
||||
|
||||
// add user declared functions first
|
||||
synchronized(Glsl.declaredFunctions) {
|
||||
Set<Entry<String, GLSLElementDescriptor>> entrySet = Glsl.declaredFunctions.entrySet();
|
||||
|
||||
for (Entry<String, GLSLElementDescriptor> entry : entrySet) {
|
||||
|
||||
String name = entry.getKey();
|
||||
GLSLElementDescriptor desc = entry.getValue();
|
||||
|
||||
if (name.regionMatches(true, 0, prefix, 0, prefix.length())) {
|
||||
completionResultSet.addItem(new GlslCompletionItem(name.substring(0, name.indexOf('(')), desc, prefix, pos));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// add core GLSL completion items
|
||||
Iterator it = vocabulary.getKeys().iterator();
|
||||
|
||||
while (it.hasNext()) {
|
||||
|
||||
String name = (String) it.next();
|
||||
|
||||
if (name.regionMatches(true, 0, prefix, 0, prefix.length())) {
|
||||
|
||||
GLSLElementDescriptor[] elements = vocabulary.getDesc(name);
|
||||
|
||||
if (elements != null) {
|
||||
for (GLSLElementDescriptor element : elements)
|
||||
completionResultSet.addItem(new GlslCompletionItem(name, element, prefix, pos));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class GlslCompletionItem implements CompletionItem {
|
||||
|
||||
private String key;
|
||||
private GLSLElementDescriptor content;
|
||||
private int carretPosition = 0;
|
||||
private String prefix;
|
||||
|
||||
private String leftText;
|
||||
private String rightText;
|
||||
|
||||
private String ARGUMENTS_COLOR = "<font color=#b28b00>";
|
||||
private String BUILD_IN_VAR_COLOR = "<font color=#ce7b00>";
|
||||
private String KEYWORD_COLOR = "<font color=#000099>";
|
||||
|
||||
private int priority;
|
||||
|
||||
public GlslCompletionItem(String key, GLSLElementDescriptor content, String prefix, int carretPosition) {
|
||||
|
||||
this.key = key;
|
||||
this.content = content;
|
||||
this.prefix = prefix;
|
||||
this.carretPosition = carretPosition;
|
||||
|
||||
leftText = createLeftText();
|
||||
rightText = content.type;
|
||||
|
||||
// low prority is first in completion list
|
||||
switch (content.category) {
|
||||
case TYPE:
|
||||
priority = 10;
|
||||
break;
|
||||
case JUMP:
|
||||
priority = 9;
|
||||
break;
|
||||
case SELECTION:
|
||||
priority = 8;
|
||||
break;
|
||||
case ITERATION:
|
||||
priority = 7;
|
||||
break;
|
||||
case KEYWORD:
|
||||
priority = 6;
|
||||
break;
|
||||
case QUALIFIER:
|
||||
priority = 5;
|
||||
break;
|
||||
case BUILD_IN_FUNC:
|
||||
priority = 4;
|
||||
break;
|
||||
case BUILD_IN_VAR:
|
||||
priority = 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private String createLeftText() {
|
||||
|
||||
StringBuilder text = new StringBuilder();
|
||||
|
||||
switch (content.category) {
|
||||
case TYPE:
|
||||
case JUMP:
|
||||
case SELECTION:
|
||||
case ITERATION:
|
||||
case KEYWORD:
|
||||
case QUALIFIER:
|
||||
text.append(KEYWORD_COLOR);
|
||||
break;
|
||||
case BUILD_IN_VAR:
|
||||
text.append(BUILD_IN_VAR_COLOR);
|
||||
break;
|
||||
}
|
||||
|
||||
text.append("<b>");
|
||||
text.append(key);
|
||||
text.append("</b></font>");
|
||||
|
||||
if (content.arguments != null) {
|
||||
text.append(ARGUMENTS_COLOR);
|
||||
text.append(content.arguments);
|
||||
text.append("</font>");
|
||||
}
|
||||
return text.toString();
|
||||
}
|
||||
|
||||
public void defaultAction(JTextComponent component) {
|
||||
Completion.get().hideAll();
|
||||
// replace prefix with key
|
||||
try {
|
||||
component.getDocument().remove(carretPosition-prefix.length(), prefix.length());
|
||||
component.getDocument().insertString(carretPosition-prefix.length(), key, null);
|
||||
} catch (BadLocationException e) {
|
||||
LOGGER.notify(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void processKeyEvent(KeyEvent evt) {
|
||||
// TODO: if "." then Completion.get().showCompletion()
|
||||
}
|
||||
|
||||
public int getPreferredWidth(Graphics g, Font defaultFont) {
|
||||
return CompletionUtilities.getPreferredWidth(leftText, rightText, g, defaultFont);
|
||||
}
|
||||
|
||||
public void render(Graphics g, Font defaultFont, Color defaultColor, Color backgroundColor, int width, int height, boolean selected) {
|
||||
|
||||
CompletionUtilities.renderHtml(null, leftText, rightText, g, defaultFont, defaultColor, width, height, selected);
|
||||
|
||||
}
|
||||
|
||||
public CompletionTask createDocumentationTask() {
|
||||
|
||||
if (content.doc == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new AsyncCompletionTask(new AsyncCompletionQuery() {
|
||||
private GlslDocItem item = new GlslDocItem(key, content);
|
||||
|
||||
protected void query(CompletionResultSet completionResultSet, Document document, int i) {
|
||||
completionResultSet.setDocumentation(item);
|
||||
completionResultSet.finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public CompletionTask createToolTipTask() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean instantSubstitution(JTextComponent component) {
|
||||
defaultAction(component);
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getSortPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public CharSequence getSortText() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public CharSequence getInsertPrefix() {
|
||||
return prefix;
|
||||
}
|
||||
}
|
||||
|
||||
private static class GlslDocItem implements CompletionDocumentation {
|
||||
|
||||
private String text;
|
||||
|
||||
public GlslDocItem(String item, GLSLElementDescriptor content) {
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<code>");
|
||||
if(content.type != null) {
|
||||
sb.append(content.type);
|
||||
sb.append(" ");
|
||||
}
|
||||
sb.append("<b>");
|
||||
sb.append(item);
|
||||
sb.append("</b>");
|
||||
if(content.arguments != null) {
|
||||
sb.append(content.arguments);
|
||||
}
|
||||
sb.append("</code><p>");
|
||||
sb.append(content.doc);
|
||||
sb.append("</p>");
|
||||
|
||||
text = sb.toString();
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public URL getURL() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public CompletionDocumentation resolveLink(String link) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Action getGotoSourceAction() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
package net.java.nboglpack.glsleditor;
|
||||
|
||||
/**
|
||||
* Created on 26. March 2007, 00:49
|
||||
*
|
||||
*/
|
||||
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
//import net.java.nboglpack.glslcompiler.GLSLCompilerService;
|
||||
import org.openide.loaders.DataObject;
|
||||
import org.openide.util.Lookup;
|
||||
import org.openide.util.RequestProcessor;
|
||||
|
||||
/**
|
||||
* Observes an DataObject for document updates and starts compilation automatically.
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslShaderFileObserver implements DocumentListener {
|
||||
|
||||
private final DataObject observedDao;
|
||||
private final static RequestProcessor RP = new RequestProcessor("compiler");
|
||||
private final RequestProcessor.Task compilerTask;
|
||||
private boolean runOnDocUpdate = true;
|
||||
private int compileDelay = 500;
|
||||
|
||||
public GlslShaderFileObserver(DataObject dao) {
|
||||
observedDao = dao;
|
||||
|
||||
compilerTask = RP.create(new Runnable() {
|
||||
public void run() {
|
||||
// GLSLCompilerService compiler = Lookup.getDefault().lookup(GLSLCompilerService.class);
|
||||
// compiler.compileShader(new DataObject[] {observedDao}, false);
|
||||
}
|
||||
});
|
||||
compilerTask.setPriority(Thread.MIN_PRIORITY);
|
||||
}
|
||||
|
||||
|
||||
// DocumentListener
|
||||
public void insertUpdate(DocumentEvent arg0) {
|
||||
if(runOnDocUpdate)
|
||||
runCompileTask();
|
||||
}
|
||||
public void removeUpdate(DocumentEvent arg0) {
|
||||
if(runOnDocUpdate)
|
||||
runCompileTask();
|
||||
}
|
||||
public void changedUpdate(DocumentEvent arg0) {
|
||||
}
|
||||
|
||||
|
||||
public final void runCompileTask() {
|
||||
compilerTask.schedule(compileDelay);
|
||||
}
|
||||
|
||||
public void setCompileDelay(int compileDelay) {
|
||||
this.compileDelay = compileDelay;
|
||||
}
|
||||
|
||||
public void setRunOnDocUpdate(boolean runOnDocUpdate) {
|
||||
this.runOnDocUpdate = runOnDocUpdate;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,172 @@
|
||||
/*
|
||||
* GlslVocabularyManager.java
|
||||
*
|
||||
* Created on 12. Februar 2006, 03:37
|
||||
*
|
||||
*/
|
||||
|
||||
package net.java.nboglpack.glsleditor;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.AbstractSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslFragmentShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslGeometryShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslVertexShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.vocabulary.GLSLElementDescriptor;
|
||||
import net.java.nboglpack.glsleditor.vocabulary.GLSLVocabulary;
|
||||
import org.openide.ErrorManager;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.filesystems.FileUtil;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author mhenze
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslVocabularyManager {
|
||||
|
||||
private static final ErrorManager LOGGER = ErrorManager.getDefault().getInstance(GlslVocabularyManager.class.getName());
|
||||
private static final HashMap<String, GlslVocabularyManager> instances = new HashMap<String, GlslVocabularyManager>();
|
||||
private static GLSLVocabulary vocabulary = null;
|
||||
|
||||
private final String mimetype;
|
||||
private final Set<String> keySet;
|
||||
private final Map<String, GLSLElementDescriptor[]> vocabularyExtention;
|
||||
|
||||
/** Creates a new instance of GlslVocabularyManager */
|
||||
private GlslVocabularyManager(String mimetype) {
|
||||
|
||||
if( !mimetype.equals(GlslFragmentShaderDataLoader.REQUIRED_MIME)
|
||||
&& !mimetype.equals(GlslVertexShaderDataLoader.REQUIRED_MIME)
|
||||
&& !mimetype.equals(GlslGeometryShaderDataLoader.REQUIRED_MIME)) {
|
||||
throw new IllegalArgumentException(mimetype+" is no GLSL mime type");
|
||||
}
|
||||
|
||||
|
||||
this.mimetype = mimetype;
|
||||
|
||||
if(vocabulary == null)
|
||||
loadVocabulary();
|
||||
|
||||
if(mimetype.equals(GlslFragmentShaderDataLoader.REQUIRED_MIME)) {
|
||||
vocabularyExtention = vocabulary.fragmentShaderVocabulary;
|
||||
}else if(mimetype.equals(GlslVertexShaderDataLoader.REQUIRED_MIME)) {
|
||||
vocabularyExtention = vocabulary.vertexShaderVocabulary;
|
||||
}else {
|
||||
vocabularyExtention = vocabulary.geometryShaderVocabulary;
|
||||
}
|
||||
|
||||
// merges two views
|
||||
keySet = new AbstractSet<String>() {
|
||||
|
||||
private final Set<String> mainSet = vocabulary.mainVocabulary.keySet();
|
||||
private final Set<String> extSet = vocabularyExtention.keySet();
|
||||
|
||||
|
||||
public Iterator<String> iterator() {
|
||||
return new Iterator<String>(){
|
||||
|
||||
Iterator<String> mainIt = mainSet.iterator();
|
||||
Iterator<String> extIt = extSet.iterator();
|
||||
|
||||
public boolean hasNext() {
|
||||
return mainIt.hasNext() || extIt.hasNext();
|
||||
}
|
||||
|
||||
public String next() {
|
||||
if(mainIt.hasNext())
|
||||
return mainIt.next();
|
||||
else
|
||||
return extIt.next();
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return mainSet.size()+extSet.size();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public static GlslVocabularyManager getInstance(String mimetype) {
|
||||
|
||||
GlslVocabularyManager instance = instances.get(mimetype);
|
||||
|
||||
if(instance == null) {
|
||||
instance = new GlslVocabularyManager(mimetype);
|
||||
instances.put(mimetype,instance);
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
private void loadVocabulary() {
|
||||
|
||||
FileObject vocabularyfile = FileUtil.getConfigFile("Editors/"+mimetype+"/vocabulary.xml");
|
||||
|
||||
if (vocabularyfile != null) {
|
||||
|
||||
InputStream is = null;
|
||||
|
||||
try {
|
||||
|
||||
is = vocabularyfile.getInputStream();
|
||||
|
||||
// workaround; nb does not allow usage of jdk's jaxb implementation
|
||||
// => we have to provide JAXB as library wrapper module and load it via module classloader
|
||||
JAXBContext jc = JAXBContext.newInstance("net.java.nboglpack.glsleditor.vocabulary", this.getClass().getClassLoader());
|
||||
|
||||
Unmarshaller unmarshaller = jc.createUnmarshaller();
|
||||
vocabulary = (GLSLVocabulary)unmarshaller.unmarshal(is);
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
||||
// create empty vocab
|
||||
vocabulary = new GLSLVocabulary();
|
||||
LOGGER.notify(ex);
|
||||
|
||||
} finally {
|
||||
|
||||
if(is != null) {
|
||||
try {
|
||||
is.close();
|
||||
} catch (Exception e) {
|
||||
LOGGER.notify(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Set getKeys() {
|
||||
return keySet;
|
||||
}
|
||||
|
||||
public GLSLElementDescriptor[] getDesc(String key) {
|
||||
|
||||
GLSLElementDescriptor[] desc = vocabulary.mainVocabulary.get(key);
|
||||
|
||||
if(desc == null)
|
||||
desc = vocabularyExtention.get(key);
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
Services/MIMEResolver/GlslVertexShaderResolver.xml=GLSL Vertex Shader Files
|
||||
Services/MIMEResolver/GlslFragmentShaderResolver.xml=GLSL Fragment Shader Files
|
||||
Services/MIMEResolver/GlslGeometryShaderResolver.xml=GLSL Geometry Shader Files
|
||||
|
||||
Templates/OpenGL/VertexShader.vert=GLSL Vertex Shader File
|
||||
Templates/OpenGL/FragmentShader.frag=GLSL Fragment Shader File
|
||||
Templates/OpenGL/GeometryShader.geom=GLSL Geometry Shader File
|
||||
|
||||
LBL_glsl_vertex_shader_loader_name=GLSL Vertex Shader Files
|
||||
LBL_glsl_fragment_shader_loader_name=GLSL Fragment Shader Files
|
||||
LBL_glsl_geometry_shader_loader_name=GLSL Geometry Shader Files
|
@ -0,0 +1,40 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.loaders.DataObjectExistsException;
|
||||
import org.openide.loaders.MultiDataObject;
|
||||
import org.openide.loaders.UniFileLoader;
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
public class GlslFragmentShaderDataLoader extends UniFileLoader {
|
||||
|
||||
public static final String REQUIRED_MIME = "text/x-glsl-fragment-shader";
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public GlslFragmentShaderDataLoader() {
|
||||
super("net.java.nboglpack.glsleditor.dataobject.GlslFragmentShaderDataObject");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String defaultDisplayName() {
|
||||
return NbBundle.getMessage(GlslFragmentShaderDataLoader.class, "LBL_glsl_fragment_shader_loader_name");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initialize() {
|
||||
super.initialize();
|
||||
getExtensions().addMimeType(REQUIRED_MIME);
|
||||
}
|
||||
|
||||
protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
|
||||
return new GlslFragmentShaderDataObject(primaryFile, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String actionsContext() {
|
||||
return "Loaders/" + REQUIRED_MIME + "/Actions";
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.IntrospectionException;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.SimpleBeanInfo;
|
||||
import org.openide.loaders.UniFileLoader;
|
||||
import org.openide.util.ImageUtilities;
|
||||
|
||||
public class GlslFragmentShaderDataLoaderBeanInfo extends SimpleBeanInfo {
|
||||
|
||||
public static final String IMAGE_ICON_BASE = "net/java/nboglpack/glsleditor/resources/FragmentShaderIcon.gif";
|
||||
|
||||
@Override
|
||||
public BeanInfo[] getAdditionalBeanInfo() {
|
||||
try {
|
||||
return new BeanInfo[]{Introspector.getBeanInfo(UniFileLoader.class)};
|
||||
} catch (IntrospectionException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon(int type) {
|
||||
if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
|
||||
return ImageUtilities.loadImage(IMAGE_ICON_BASE);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import org.openide.loaders.DataNode;
|
||||
import org.openide.nodes.Children;
|
||||
|
||||
public class GlslFragmentShaderDataNode extends DataNode
|
||||
{
|
||||
public GlslFragmentShaderDataNode(GlslFragmentShaderDataObject obj)
|
||||
{
|
||||
super(obj, Children.LEAF);
|
||||
setIconBaseWithExtension(GlslFragmentShaderDataLoaderBeanInfo.IMAGE_ICON_BASE);
|
||||
}
|
||||
// /** Creates a property sheet. */
|
||||
// protected Sheet createSheet() {
|
||||
// Sheet s = super.createSheet();
|
||||
// Sheet.Set ss = s.get(Sheet.PROPERTIES);
|
||||
// if (ss == null) {
|
||||
// ss = Sheet.createPropertiesSet();
|
||||
// s.put(ss);
|
||||
// }
|
||||
// // TODO add some relevant properties: ss.put(...)
|
||||
// return s;
|
||||
// }
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import net.java.nboglpack.glsleditor.GlslShaderFileObserver;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.io.IOException;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import javax.swing.text.Document;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.loaders.DataObjectExistsException;
|
||||
import org.openide.loaders.MultiDataObject;
|
||||
import org.openide.nodes.CookieSet;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.text.CloneableEditorSupport;
|
||||
import org.openide.text.DataEditorSupport;
|
||||
|
||||
|
||||
|
||||
public class GlslFragmentShaderDataObject extends MultiDataObject {
|
||||
|
||||
private final GlslShaderFileObserver observer;
|
||||
|
||||
public GlslFragmentShaderDataObject(FileObject pf, GlslFragmentShaderDataLoader loader) throws DataObjectExistsException, IOException {
|
||||
|
||||
super(pf, loader);
|
||||
|
||||
CookieSet cookies = getCookieSet();
|
||||
observer= new GlslShaderFileObserver(this);
|
||||
|
||||
final CloneableEditorSupport support= DataEditorSupport.create(this, getPrimaryEntry(), cookies);
|
||||
support.addPropertyChangeListener(
|
||||
new PropertyChangeListener(){
|
||||
public void propertyChange(PropertyChangeEvent event) {
|
||||
if("document".equals(event.getPropertyName())){
|
||||
if(event.getNewValue()!=null)
|
||||
{
|
||||
support.getDocument().addDocumentListener(observer);
|
||||
observer.runCompileTask();
|
||||
}
|
||||
else if(event.getOldValue()!=null)
|
||||
{
|
||||
// cylab: I think this is never called.
|
||||
// But I don't know if unregistering the observer makes any difference...
|
||||
((Document)event.getOldValue()).removeDocumentListener(observer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
cookies.add((Node.Cookie) support);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Node createNodeDelegate() {
|
||||
return new GlslFragmentShaderDataNode(this);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.loaders.DataObjectExistsException;
|
||||
import org.openide.loaders.MultiDataObject;
|
||||
import org.openide.loaders.UniFileLoader;
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
|
||||
/**
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslGeometryShaderDataLoader extends UniFileLoader {
|
||||
|
||||
public static final String REQUIRED_MIME = "text/x-glsl-geometry-shader";
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public GlslGeometryShaderDataLoader() {
|
||||
super("net.java.nboglpack.glsleditor.dataobject.GlslGeometryShaderDataObject");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String defaultDisplayName() {
|
||||
return NbBundle.getMessage(GlslGeometryShaderDataLoader.class, "LBL_glsl_geometry_shader_loader_name");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initialize() {
|
||||
super.initialize();
|
||||
getExtensions().addMimeType(REQUIRED_MIME);
|
||||
}
|
||||
|
||||
protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
|
||||
return new GlslGeometryShaderDataObject(primaryFile, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String actionsContext() {
|
||||
return "Loaders/" + REQUIRED_MIME + "/Actions";
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.IntrospectionException;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.SimpleBeanInfo;
|
||||
import org.openide.loaders.UniFileLoader;
|
||||
import org.openide.util.ImageUtilities;
|
||||
|
||||
|
||||
/**
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslGeometryShaderDataLoaderBeanInfo extends SimpleBeanInfo {
|
||||
|
||||
public static final String IMAGE_ICON_BASE = "net/java/nboglpack/glsleditor/resources/GeometryShaderIcon.gif";
|
||||
|
||||
@Override
|
||||
public BeanInfo[] getAdditionalBeanInfo() {
|
||||
try {
|
||||
return new BeanInfo[] {Introspector.getBeanInfo(UniFileLoader.class)};
|
||||
} catch (IntrospectionException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon(int type) {
|
||||
if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
|
||||
return ImageUtilities.loadImage(IMAGE_ICON_BASE);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import org.openide.loaders.DataNode;
|
||||
import org.openide.nodes.Children;
|
||||
import org.openide.util.Lookup;
|
||||
|
||||
|
||||
/**
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslGeometryShaderDataNode extends DataNode {
|
||||
|
||||
public GlslGeometryShaderDataNode(GlslGeometryShaderDataObject obj) {
|
||||
super(obj, Children.LEAF);
|
||||
setIconBaseWithExtension(GlslGeometryShaderDataLoaderBeanInfo.IMAGE_ICON_BASE);
|
||||
}
|
||||
GlslGeometryShaderDataNode(GlslGeometryShaderDataObject obj, Lookup lookup) {
|
||||
super(obj, Children.LEAF, lookup);
|
||||
setIconBaseWithExtension(GlslGeometryShaderDataLoaderBeanInfo.IMAGE_ICON_BASE);
|
||||
}
|
||||
|
||||
// /** Creates a property sheet. */
|
||||
// protected Sheet createSheet() {
|
||||
// Sheet s = super.createSheet();
|
||||
// Sheet.Set ss = s.get(Sheet.PROPERTIES);
|
||||
// if (ss == null) {
|
||||
// ss = Sheet.createPropertiesSet();
|
||||
// s.put(ss);
|
||||
// }
|
||||
// // TODO add some relevant properties: ss.put(...)
|
||||
// return s;
|
||||
// }
|
||||
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.IOException;
|
||||
import javax.swing.text.Document;
|
||||
import net.java.nboglpack.glsleditor.GlslShaderFileObserver;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.loaders.DataObjectExistsException;
|
||||
import org.openide.loaders.MultiDataObject;
|
||||
import org.openide.nodes.CookieSet;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.text.CloneableEditorSupport;
|
||||
import org.openide.util.Lookup;
|
||||
import org.openide.text.DataEditorSupport;
|
||||
|
||||
|
||||
/**
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslGeometryShaderDataObject extends MultiDataObject {
|
||||
|
||||
private GlslShaderFileObserver observer;
|
||||
|
||||
public GlslGeometryShaderDataObject(FileObject pf, GlslGeometryShaderDataLoader loader) throws DataObjectExistsException, IOException {
|
||||
|
||||
super(pf, loader);
|
||||
|
||||
CookieSet cookies = getCookieSet();
|
||||
observer = new GlslShaderFileObserver(this);
|
||||
|
||||
final CloneableEditorSupport support = DataEditorSupport.create(this, getPrimaryEntry(), cookies);
|
||||
support.addPropertyChangeListener(new PropertyChangeListener() {
|
||||
|
||||
public void propertyChange(PropertyChangeEvent event) {
|
||||
if ("document".equals(event.getPropertyName())) {
|
||||
if (event.getNewValue() != null) {
|
||||
support.getDocument().addDocumentListener(observer);
|
||||
observer.runCompileTask();
|
||||
} else if (event.getOldValue() != null) {
|
||||
// cylab: I think this is never called.
|
||||
// But I don't know if unregistering the observer makes any difference...
|
||||
((Document) event.getOldValue()).removeDocumentListener(observer);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
cookies.add((Node.Cookie) support);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Node createNodeDelegate() {
|
||||
return new GlslGeometryShaderDataNode(this, getLookup());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Lookup getLookup() {
|
||||
return getCookieSet().getLookup();
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.loaders.DataObjectExistsException;
|
||||
import org.openide.loaders.MultiDataObject;
|
||||
import org.openide.loaders.UniFileLoader;
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
public class GlslVertexShaderDataLoader extends UniFileLoader {
|
||||
|
||||
public static final String REQUIRED_MIME = "text/x-glsl-vertex-shader";
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public GlslVertexShaderDataLoader() {
|
||||
super("net.java.nboglpack.glsleditor.dataobject.GlslVertexShaderDataObject");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String defaultDisplayName() {
|
||||
return NbBundle.getMessage(GlslFragmentShaderDataLoader.class, "LBL_glsl_vertex_shader_loader_name");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initialize() {
|
||||
super.initialize();
|
||||
getExtensions().addMimeType(REQUIRED_MIME);
|
||||
}
|
||||
|
||||
protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
|
||||
return new GlslVertexShaderDataObject(primaryFile, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String actionsContext() {
|
||||
return "Loaders/" + REQUIRED_MIME + "/Actions";
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.IntrospectionException;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.SimpleBeanInfo;
|
||||
import org.openide.loaders.UniFileLoader;
|
||||
import org.openide.util.ImageUtilities;
|
||||
|
||||
public class GlslVertexShaderDataLoaderBeanInfo extends SimpleBeanInfo {
|
||||
|
||||
public static final String IMAGE_ICON_BASE = "net/java/nboglpack/glsleditor/resources/VertexShaderIcon.gif";
|
||||
|
||||
@Override
|
||||
public BeanInfo[] getAdditionalBeanInfo() {
|
||||
try {
|
||||
return new BeanInfo[]{Introspector.getBeanInfo(UniFileLoader.class)};
|
||||
} catch (IntrospectionException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon(int type) {
|
||||
if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
|
||||
return ImageUtilities.loadImage(IMAGE_ICON_BASE);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import org.openide.loaders.DataNode;
|
||||
import org.openide.nodes.Children;
|
||||
|
||||
public class GlslVertexShaderDataNode extends DataNode
|
||||
{
|
||||
public GlslVertexShaderDataNode(GlslVertexShaderDataObject obj)
|
||||
{
|
||||
super(obj, Children.LEAF);
|
||||
setIconBaseWithExtension(GlslVertexShaderDataLoaderBeanInfo.IMAGE_ICON_BASE);
|
||||
}
|
||||
// /** Creates a property sheet. */
|
||||
// protected Sheet createSheet() {
|
||||
// Sheet s = super.createSheet();
|
||||
// Sheet.Set ss = s.get(Sheet.PROPERTIES);
|
||||
// if (ss == null) {
|
||||
// ss = Sheet.createPropertiesSet();
|
||||
// s.put(ss);
|
||||
// }
|
||||
// // TODO add some relevant properties: ss.put(...)
|
||||
// return s;
|
||||
// }
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package net.java.nboglpack.glsleditor.dataobject;
|
||||
|
||||
import net.java.nboglpack.glsleditor.GlslShaderFileObserver;
|
||||
import net.java.nboglpack.glsleditor.GlslShaderFileObserver;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.io.IOException;
|
||||
import javax.swing.text.Document;
|
||||
import org.openide.filesystems.FileObject;
|
||||
import org.openide.loaders.DataObjectExistsException;
|
||||
import org.openide.loaders.MultiDataObject;
|
||||
import org.openide.nodes.CookieSet;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.text.CloneableEditorSupport;
|
||||
import org.openide.text.DataEditorSupport;
|
||||
|
||||
public class GlslVertexShaderDataObject extends MultiDataObject {
|
||||
|
||||
private GlslShaderFileObserver observer;
|
||||
|
||||
public GlslVertexShaderDataObject(FileObject pf, GlslVertexShaderDataLoader loader) throws DataObjectExistsException, IOException {
|
||||
|
||||
super(pf, loader);
|
||||
CookieSet cookies = getCookieSet();
|
||||
observer= new GlslShaderFileObserver(this);
|
||||
|
||||
final CloneableEditorSupport support= DataEditorSupport.create(this, getPrimaryEntry(), cookies);
|
||||
support.addPropertyChangeListener(
|
||||
new PropertyChangeListener(){
|
||||
public void propertyChange(PropertyChangeEvent event) {
|
||||
if("document".equals(event.getPropertyName())){
|
||||
if(event.getNewValue()!=null)
|
||||
{
|
||||
support.getDocument().addDocumentListener(observer);
|
||||
observer.runCompileTask();
|
||||
}
|
||||
else if(event.getOldValue()!=null)
|
||||
{
|
||||
// cylab: I think this is never called.
|
||||
// But I don't know if unregistering the observer makes any difference...
|
||||
((Document)event.getOldValue()).removeDocumentListener(observer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
cookies.add((Node.Cookie) support);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Node createNodeDelegate() {
|
||||
return new GlslVertexShaderDataNode(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
LBL_SYNTAX_ERROR=Syntax error.
|
||||
LBL_UNEXPECTED_CHARACTER=Unexpected character.
|
||||
LBL_RESERVED_KEYWORD=Reserved keyword.
|
||||
|
@ -0,0 +1,316 @@
|
||||
################################################################################
|
||||
# OpenGL Shading Language 1.20 GLF file ########################################
|
||||
################################################################################
|
||||
# @date 10.09.2007 #
|
||||
# @author Michael Bien #
|
||||
# @email mbien@fh-landshut.de #
|
||||
################################################################################
|
||||
|
||||
BUNDLE "net.java.nboglpack.glsleditor.glsl.Bundle"
|
||||
|
||||
SKIP:WHITESPACE
|
||||
SKIP:END_OF_LINE
|
||||
SKIP:COMMENT
|
||||
SKIP:ML_COMMENT
|
||||
|
||||
## error highlighting ##########################################################
|
||||
MARK:ERROR: {
|
||||
type:"Error";
|
||||
message:"LBL_SYNTAX_ERROR";
|
||||
}
|
||||
MARK:error: {
|
||||
type:"Error";
|
||||
message:"LBL_UNEXPECTED_CHARACTER";
|
||||
}
|
||||
MARK:reserved: {
|
||||
type:"Warning";
|
||||
message:"LBL_RESERVED_KEYWORD";
|
||||
}
|
||||
|
||||
FOLD:function_body: {
|
||||
fold_display_name:"{...}";
|
||||
}
|
||||
FOLD:struct_body: {
|
||||
fold_display_name:"{...}";
|
||||
}
|
||||
FOLD:ML_COMMENT: {
|
||||
fold_display_name:"/*...*/";
|
||||
}
|
||||
|
||||
BRACE "(:)"
|
||||
BRACE "{:}"
|
||||
BRACE "[:]"
|
||||
|
||||
COMPLETE "(:)"
|
||||
COMPLETE "{:}"
|
||||
COMPLETE "[:]"
|
||||
|
||||
INDENT "(:)"
|
||||
INDENT "{:}"
|
||||
INDENT "[:]"
|
||||
INDENT "\\s*(((if|while)\\s*\\(|else\\s*|else\\s+if\\s*\\(|for\\s*\\(.*\\))[^{;]*)"
|
||||
|
||||
SELECTION ( ["a"-"z" "A"-"Z" "0"-"9" "_"] )
|
||||
|
||||
NAVIGATOR:global_preprocessor: {
|
||||
display_name: net.java.nboglpack.glsleditor.glsl.Glsl.createPreprocessorString;
|
||||
icon: "net/java/nboglpack/glsleditor/resources/preprocessor.png";
|
||||
isLeaf: "true";
|
||||
}
|
||||
NAVIGATOR:global_declared_identifier, struct_declarator: {
|
||||
display_name: net.java.nboglpack.glsleditor.glsl.Glsl.createFieldDeclarationString;
|
||||
icon: "net/java/nboglpack/glsleditor/resources/field.gif";
|
||||
isLeaf: "true";
|
||||
}
|
||||
NAVIGATOR:function: {
|
||||
display_name: net.java.nboglpack.glsleditor.glsl.Glsl.createFunctionDeclarationString;
|
||||
icon: "net/java/nboglpack/glsleditor/resources/function.gif";
|
||||
isLeaf: "true";
|
||||
}
|
||||
#AST {
|
||||
# process: net.java.nboglpack.glsleditor.glsl.Glsl.process;
|
||||
#}
|
||||
#PROPERTIES {
|
||||
# traceSteps:"true";
|
||||
# printRules:"true";
|
||||
# printFirst:"true";
|
||||
#}
|
||||
|
||||
##### GLSL 1.2 grammar #########################################################
|
||||
|
||||
S = declaration*;
|
||||
|
||||
|
||||
## constants ###################################################################
|
||||
type_specifier = "float"
|
||||
| "int"
|
||||
| "bool"
|
||||
| "vec2"
|
||||
| "vec3"
|
||||
| "vec4"
|
||||
| "bvec2"
|
||||
| "bvec3"
|
||||
| "bvec4"
|
||||
| "ivec2"
|
||||
| "ivec3"
|
||||
| "ivec4"
|
||||
| "mat2"
|
||||
| "mat3"
|
||||
| "mat4"
|
||||
| "mat2x2"
|
||||
| "mat2x3"
|
||||
| "mat2x4"
|
||||
| "mat3x2"
|
||||
| "mat3x3"
|
||||
| "mat3x4"
|
||||
| "mat4x2"
|
||||
| "mat4x3"
|
||||
| "mat4x4"
|
||||
| "sampler1D"
|
||||
| "sampler2D"
|
||||
| "sampler3D"
|
||||
| "samplerCube"
|
||||
| "sampler1DShadow"
|
||||
| "sampler2DShadow";
|
||||
|
||||
type_specifier_or_identifier = type_specifier | <IDENTIFIER>;
|
||||
|
||||
type_qualifier = "const";
|
||||
|
||||
global_type_qualifier = type_qualifier
|
||||
| "attribute" # Vertex only.
|
||||
| "varying"
|
||||
| ("centroid" "varying")
|
||||
| ("invariant" ["centroid"] "varying")
|
||||
| "uniform";
|
||||
|
||||
parameter_declaration_qualifier = "in" | "out" | "inout";
|
||||
|
||||
boolean_literal = "true" | "false"; # TODO move boolean literal to lexer?
|
||||
|
||||
|
||||
assignment_operator = <EQ>
|
||||
| <MUL_ASSIGN>
|
||||
| <DIV_ASSIGN>
|
||||
| <ADD_ASSIGN>
|
||||
| <SUB_ASSIGN>
|
||||
| <MOD_ASSIGN> # reserved
|
||||
| <LEFT_BITSHIFT_ASSIGN> # reserved
|
||||
| <RIGHT_BITSHIFT_ASSIGN> # reserved
|
||||
| <AND_ASSIGN> # reserved
|
||||
| <XOR_ASSIGN> # reserved
|
||||
| <OR_ASSIGN>; # reserved
|
||||
|
||||
comperator = <LEFT_ANGLE> | <RIGHT_ANGLE> | <LE> | <GE> | <EQEQ> | <NE>;
|
||||
|
||||
operator = <PLUS>
|
||||
| <MINUS>
|
||||
| <STAR>
|
||||
| <SLASH>
|
||||
| <AMP>
|
||||
| <AMPAMP>
|
||||
| <BAR> # reserved
|
||||
| <BARBAR>
|
||||
| <CARETCARET>
|
||||
| <CARET> # reserved
|
||||
| <PERCENT> # reserved
|
||||
| <RIGHT_BITSHIFT> # reserved
|
||||
| <LEFT_BITSHIFT>; # reserved
|
||||
|
||||
unary_operator = <PLUS>
|
||||
| <MINUS>
|
||||
| <BANG>
|
||||
| <TILDE>; # reserved
|
||||
|
||||
increment_or_decrement_operator = <PLUSPLUS> | <MINUSMINUS>;
|
||||
|
||||
reserved = "asm"
|
||||
| "class"
|
||||
| "union"
|
||||
| "enum"
|
||||
| "typedef"
|
||||
| "template"
|
||||
| "this"
|
||||
| "packed"
|
||||
| "goto"
|
||||
| "switch"
|
||||
| "default"
|
||||
| "inline"
|
||||
| "noinline"
|
||||
| "volatile"
|
||||
| "public"
|
||||
| "static"
|
||||
| "extern"
|
||||
| "external"
|
||||
| "interface"
|
||||
| "long"
|
||||
| "short"
|
||||
| "double"
|
||||
| "half"
|
||||
| "fixed"
|
||||
| "unsigned"
|
||||
| "lowp"
|
||||
| "mediump"
|
||||
| "highp"
|
||||
| "precision"
|
||||
| "input"
|
||||
| "output"
|
||||
| "hvec2"
|
||||
| "hvec3"
|
||||
| "hvec4"
|
||||
| "dvec2"
|
||||
| "dvec3"
|
||||
| "dvec4"
|
||||
| "fvec2"
|
||||
| "fvec3"
|
||||
| "fvec4"
|
||||
| "sampler2DRect"
|
||||
| "sampler3DRect"
|
||||
| "sampler2DRectShadow"
|
||||
| "sizeof"
|
||||
| "cast"
|
||||
| "namespace"
|
||||
| "using";
|
||||
|
||||
|
||||
## declarations ################################################################
|
||||
declaration = type_specifier_or_identifier [array_index] (function | (global_identifier_list <SEMICOLON>));
|
||||
declaration = "void" function;
|
||||
declaration = global_type_qualifier struct_declaration <SEMICOLON>;
|
||||
declaration = global_type_qualifier global_type_declaration <SEMICOLON>;
|
||||
declaration = struct_declaration <SEMICOLON>;
|
||||
declaration = global_preprocessor;
|
||||
|
||||
global_identifier_list = global_declared_identifier [array_index] (<COMMA> global_declared_identifier [array_index])*;
|
||||
global_declared_identifier = <IDENTIFIER>;
|
||||
global_preprocessor = <PREPROCESSOR>;
|
||||
|
||||
struct_declaration = "struct" <IDENTIFIER> struct_body [global_identifier_list];
|
||||
struct_body = "{" (local_type_declaration <SEMICOLON>)+ "}";
|
||||
|
||||
global_type_declaration = type_specifier_or_identifier [array_index] global_identifier_list [<EQ> expression];
|
||||
type_declaration = type_specifier_or_identifier [array_index] <IDENTIFIER> [array_index] (<COMMA> <IDENTIFIER> [array_index])*;
|
||||
|
||||
local_type_declaration = [type_qualifier] type_declaration;
|
||||
|
||||
## function ####################################################################
|
||||
function = <FUNCTION> "(" [parameter_declaration_list] ")" (function_body | <SEMICOLON>);
|
||||
function_body = code_block;
|
||||
|
||||
parameter_declaration = [type_qualifier] [parameter_declaration_qualifier] type_specifier_or_identifier ((array_index <IDENTIFIER>) | (<IDENTIFIER> [array_index]));
|
||||
parameter_declaration_list = "void" | (parameter_declaration (<COMMA> parameter_declaration)*);
|
||||
|
||||
statement = <PREPROCESSOR>;
|
||||
statement = expression_hack <SEMICOLON>; # statement = local_type_declaration [<EQ> expression] <SEMICOLON>;
|
||||
statement = conditional_statement;
|
||||
statement = "return" [expression] <SEMICOLON>;
|
||||
statement = "break" <SEMICOLON>; # break just in loops allowed
|
||||
statement = "continue" <SEMICOLON>;# continue just in loops allowed
|
||||
statement = "discard" <SEMICOLON>; # Fragment shader only.
|
||||
|
||||
code_block = "{" statement* "}";
|
||||
|
||||
## expresstions and operations #################################################
|
||||
# ternary operator
|
||||
expression = expression1 ["?" expression1 ":" expression1];
|
||||
|
||||
expression1 = [unary_operator] expression2 operation_or_comparison*;
|
||||
expression1 = [unary_operator] "(" expression ")" operation_or_comparison*;
|
||||
|
||||
expression2 = ( [increment_or_decrement_operator] (<IDENTIFIER> | <BUILD_IN_VAR>) (field_access)* [increment_or_decrement_operator] [assignment])
|
||||
| ((function_call | constructor_call) (field_access)*)
|
||||
| <INTEGER_LITERAL>
|
||||
| <FLOAT_LITERAL>
|
||||
| boolean_literal;
|
||||
|
||||
|
||||
|
||||
expression_hack = unary_operator expression1_hack operation_or_comparison*;
|
||||
expression_hack = unary_operator "(" expression ")" operation_or_comparison*;
|
||||
expression_hack = expression1_hack operation_or_comparison*;
|
||||
expression_hack = "(" expression ")" operation_or_comparison*;
|
||||
|
||||
expression_hack = <IDENTIFIER> (field_access)* [increment_or_decrement_operator] [assignment];
|
||||
expression_hack = <IDENTIFIER> (field_access)* <IDENTIFIER> [array_index] (<COMMA> <IDENTIFIER> [array_index])*;
|
||||
expression_hack = type_specifier (field_access)* <IDENTIFIER> [array_index] (<COMMA> <IDENTIFIER> [array_index])*;
|
||||
|
||||
expression1_hack = (increment_or_decrement_operator (<IDENTIFIER> | <BUILD_IN_VAR>) (field_access)* [increment_or_decrement_operator] [assignment])
|
||||
| (<BUILD_IN_VAR> (field_access)* [increment_or_decrement_operator] [assignment])
|
||||
| ((function_call | constructor_call) (field_access)*)
|
||||
| <INTEGER_LITERAL>
|
||||
| <FLOAT_LITERAL>
|
||||
| boolean_literal;
|
||||
|
||||
|
||||
|
||||
assignment = assignment_operator expression;
|
||||
operation_or_comparison = (comperator | operator) expression;
|
||||
|
||||
field_access = array_index;
|
||||
field_access = <DOT> <IDENTIFIER>;
|
||||
|
||||
array_index = "[" [expression] "]";
|
||||
|
||||
function_call = (<FUNCTION> | <BUILD_IN_FUNC>) "(" [expression_list] ")";
|
||||
# Note constructor call is something like that: vec2(1.0, 2.0) or float[2] (1.0, 2.0)
|
||||
constructor_call = type_specifier [array_index] "(" [expression_list] ")"; #TODO custom structs
|
||||
|
||||
expression_list = "void" | (expression (<COMMA> expression)*);
|
||||
|
||||
## code flow ###################################################################
|
||||
conditional_statement = if_statement
|
||||
| for_statement
|
||||
| while_statement
|
||||
| do_while_statement;
|
||||
|
||||
# TODO if rule not 100% correct, multiple else allowed even before else if
|
||||
if_statement = "if" condition statement_or_code_block ("else" ["if" condition] statement_or_code_block)*;
|
||||
while_statement = "while" condition statement_or_code_block;
|
||||
do_while_statement = "do" statement_or_code_block "while" condition <SEMICOLON>;
|
||||
# TODO for rule could be more restrictive
|
||||
for_statement = "for" "(" [[type_specifier] <IDENTIFIER> assignment] <SEMICOLON> [expression] <SEMICOLON> [expression] ")" statement_or_code_block;
|
||||
|
||||
condition = "(" expression ")";
|
||||
statement_or_code_block = (statement | code_block);
|
||||
|
||||
|
@ -0,0 +1,389 @@
|
||||
################################################################################
|
||||
# OpenGL Shading Language 1.30 GLF file ########################################
|
||||
################################################################################
|
||||
# @date 10.09.2007 #
|
||||
# @author Michael Bien #
|
||||
# @email mbien@fh-landshut.de #
|
||||
################################################################################
|
||||
|
||||
BUNDLE "net.java.nboglpack.glsleditor.glsl.Bundle"
|
||||
|
||||
SKIP:WHITESPACE
|
||||
SKIP:END_OF_LINE
|
||||
SKIP:COMMENT
|
||||
SKIP:ML_COMMENT
|
||||
|
||||
## error highlighting ##########################################################
|
||||
MARK:ERROR: {
|
||||
type:"Error";
|
||||
message:"LBL_SYNTAX_ERROR";
|
||||
}
|
||||
MARK:error: {
|
||||
type:"Error";
|
||||
message:"LBL_UNEXPECTED_CHARACTER";
|
||||
}
|
||||
MARK:reserved: {
|
||||
type:"Warning";
|
||||
message:"LBL_RESERVED_KEYWORD";
|
||||
}
|
||||
|
||||
FOLD:function_body: {
|
||||
fold_display_name:"{...}";
|
||||
}
|
||||
FOLD:struct_body: {
|
||||
fold_display_name:"{...}";
|
||||
}
|
||||
FOLD:ML_COMMENT: {
|
||||
fold_display_name:"/*...*/";
|
||||
}
|
||||
|
||||
BRACE "(:)"
|
||||
BRACE "{:}"
|
||||
BRACE "[:]"
|
||||
|
||||
COMPLETE "(:)"
|
||||
COMPLETE "{:}"
|
||||
COMPLETE "[:]"
|
||||
|
||||
INDENT "(:)"
|
||||
INDENT "{:}"
|
||||
INDENT "[:]"
|
||||
INDENT "\\s*(((if|while)\\s*\\(|else\\s*|else\\s+if\\s*\\(|for\\s*\\(.*\\))[^{;]*)"
|
||||
|
||||
SELECTION ( ["a"-"z" "A"-"Z" "0"-"9" "_"] )
|
||||
|
||||
AST {
|
||||
process: net.java.nboglpack.glsleditor.glsl.Glsl.process;
|
||||
}
|
||||
NAVIGATOR:global_preprocessor: {
|
||||
display_name: net.java.nboglpack.glsleditor.glsl.Glsl.createPreprocessorString;
|
||||
icon: "net/java/nboglpack/glsleditor/resources/preprocessor.png";
|
||||
isLeaf: "true";
|
||||
}
|
||||
NAVIGATOR:global_declared_identifier: {
|
||||
display_name: net.java.nboglpack.glsleditor.glsl.Glsl.createFieldDeclarationString;
|
||||
icon: "net/java/nboglpack/glsleditor/resources/field.gif";
|
||||
isLeaf: "true";
|
||||
}
|
||||
NAVIGATOR:function: {
|
||||
display_name: net.java.nboglpack.glsleditor.glsl.Glsl.createFunctionDeclarationString;
|
||||
icon: "net/java/nboglpack/glsleditor/resources/function.gif";
|
||||
isLeaf: "true";
|
||||
}
|
||||
#PROPERTIES {
|
||||
# traceSteps:"true";
|
||||
# printRules:"true";
|
||||
# printFirst:"true";
|
||||
#}
|
||||
|
||||
##### GLSL 1.3 grammar #########################################################
|
||||
|
||||
S = declaration*;
|
||||
|
||||
|
||||
## constants ###################################################################
|
||||
type_specifier = "float"
|
||||
| "int"
|
||||
| "uint"
|
||||
| "bool"
|
||||
| "vec2"
|
||||
| "vec3"
|
||||
| "vec4"
|
||||
| "bvec2"
|
||||
| "bvec3"
|
||||
| "bvec4"
|
||||
| "ivec2"
|
||||
| "ivec3"
|
||||
| "ivec4"
|
||||
| "uvec2"
|
||||
| "uvec3"
|
||||
| "uvec4"
|
||||
| "mat2"
|
||||
| "mat3"
|
||||
| "mat4"
|
||||
| "mat2x2"
|
||||
| "mat2x3"
|
||||
| "mat2x4"
|
||||
| "mat3x2"
|
||||
| "mat3x3"
|
||||
| "mat3x4"
|
||||
| "mat4x2"
|
||||
| "mat4x3"
|
||||
| "mat4x4"
|
||||
| "sampler1D"
|
||||
| "sampler2D"
|
||||
| "sampler3D"
|
||||
| "samplerCube"
|
||||
| "sampler1DShadow"
|
||||
| "sampler2DShadow"
|
||||
| "sampler1DArray"
|
||||
| "sampler2DArray"
|
||||
| "sampler1DArrayShadow"
|
||||
| "sampler2DArrayShadow"
|
||||
| "isampler1D"
|
||||
| "isampler2D"
|
||||
| "isampler3D"
|
||||
| "isamplerCube"
|
||||
| "isampler1DArray"
|
||||
| "isampler2DArray"
|
||||
| "usampler1D"
|
||||
| "usampler2D"
|
||||
| "usampler3D"
|
||||
| "usamplerCube"
|
||||
| "usampler1DArray"
|
||||
| "usampler2DArray";
|
||||
|
||||
type_specifier_or_identifier = type_specifier | <IDENTIFIER>;
|
||||
|
||||
type_qualifier = "const";
|
||||
|
||||
interpolation_type_qualifier = "smooth"
|
||||
| "flat"
|
||||
| "noperspective";
|
||||
|
||||
inout_type_qualifier = "in" | "out";
|
||||
|
||||
global_type_qualifier = type_qualifier
|
||||
| (inout_type_qualifier ["invariant"] ["centroid"])
|
||||
| (interpolation_type_qualifier ["invariant"] ["centroid"] [inout_type_qualifier])
|
||||
| ("centroid" [interpolation_type_qualifier] [inout_type_qualifier])
|
||||
| ("invariant" ["centroid"] [inout_type_qualifier])
|
||||
| "attribute" # Vertex only.
|
||||
| "varying"
|
||||
| ("centroid" "varying")
|
||||
| ("invariant" ["centroid"] "varying")
|
||||
| "uniform";
|
||||
|
||||
parameter_declaration_qualifier = "in" | "out" | "inout";
|
||||
|
||||
boolean_literal = "true" | "false"; # TODO move boolean literal to lexer?
|
||||
|
||||
precision_qualifier = "highp"
|
||||
| "mediump"
|
||||
| "lowp";
|
||||
|
||||
assignment_operator = <EQ>
|
||||
| <MUL_ASSIGN>
|
||||
| <DIV_ASSIGN>
|
||||
| <ADD_ASSIGN>
|
||||
| <SUB_ASSIGN>
|
||||
| <MOD_ASSIGN> # reserved
|
||||
| <LEFT_BITSHIFT_ASSIGN> # reserved
|
||||
| <RIGHT_BITSHIFT_ASSIGN> # reserved
|
||||
| <AND_ASSIGN> # reserved
|
||||
| <XOR_ASSIGN> # reserved
|
||||
| <OR_ASSIGN>; # reserved
|
||||
|
||||
comperator = <LEFT_ANGLE> | <RIGHT_ANGLE> | <LE> | <GE> | <EQEQ> | <NE>;
|
||||
|
||||
operator = <PLUS>
|
||||
| <MINUS>
|
||||
| <STAR>
|
||||
| <SLASH>
|
||||
| <AMP>
|
||||
| <AMPAMP>
|
||||
| <BAR> # reserved
|
||||
| <BARBAR>
|
||||
| <CARETCARET>
|
||||
| <CARET> # reserved
|
||||
| <PERCENT> # reserved
|
||||
| <RIGHT_BITSHIFT> # reserved
|
||||
| <LEFT_BITSHIFT>; # reserved
|
||||
|
||||
unary_operator = <PLUS>
|
||||
| <MINUS>
|
||||
| <BANG>
|
||||
| <TILDE>; # reserved
|
||||
|
||||
increment_or_decrement_operator = <PLUSPLUS> | <MINUSMINUS>;
|
||||
|
||||
reserved = "asm"
|
||||
| "common"
|
||||
| "partition"
|
||||
| "active"
|
||||
| "class"
|
||||
| "union"
|
||||
| "enum"
|
||||
| "typedef"
|
||||
| "template"
|
||||
| "this"
|
||||
| "packed"
|
||||
| "goto"
|
||||
| "inline"
|
||||
| "noinline"
|
||||
| "volatile"
|
||||
| "public"
|
||||
| "static"
|
||||
| "extern"
|
||||
| "external"
|
||||
| "interface"
|
||||
| "long"
|
||||
| "short"
|
||||
| "double"
|
||||
| "half"
|
||||
| "fixed"
|
||||
| "unsigned"
|
||||
| "superp"
|
||||
| "input"
|
||||
| "output"
|
||||
| "hvec2"
|
||||
| "hvec3"
|
||||
| "hvec4"
|
||||
| "dvec2"
|
||||
| "dvec3"
|
||||
| "dvec4"
|
||||
| "fvec2"
|
||||
| "fvec3"
|
||||
| "fvec4"
|
||||
| "sampler2DRect"
|
||||
| "sampler3DRect"
|
||||
| "sampler2DRectShadow"
|
||||
| "samplerBuffer"
|
||||
| "filter"
|
||||
| "image1D"
|
||||
| "image2D"
|
||||
| "image3D"
|
||||
| "imageCube"
|
||||
| "iimage1D"
|
||||
| "iimage2D"
|
||||
| "iimage3D"
|
||||
| "iimageCube"
|
||||
| "uimage1D"
|
||||
| "uimage2D"
|
||||
| "uimage3D"
|
||||
| "uimageCube"
|
||||
| "image1DArray"
|
||||
| "image2DArray"
|
||||
| "iimage1DArray"
|
||||
| "iimage2DArray"
|
||||
| "uimage1DArray"
|
||||
| "uimage2DArray"
|
||||
| "image1DShadow"
|
||||
| "image2DShadow"
|
||||
| "image1DArrayShadow"
|
||||
| "image2DArrayShadow"
|
||||
| "imageBuffer"
|
||||
| "iimageBuffer"
|
||||
| "uimageBuffer"
|
||||
| "sizeof"
|
||||
| "cast"
|
||||
| "namespace"
|
||||
| "using"
|
||||
| "row_major";
|
||||
|
||||
|
||||
## declarations ################################################################
|
||||
declaration = [precision_qualifier] type_specifier_or_identifier [array_index] (function | (global_identifier_list [assignment2] <SEMICOLON>));
|
||||
declaration = "void" function;
|
||||
declaration = field_declaration <SEMICOLON>;
|
||||
declaration = struct_declaration <SEMICOLON>;
|
||||
declaration = precision_declaration <SEMICOLON>;
|
||||
declaration = global_preprocessor;
|
||||
|
||||
global_identifier_list = global_declared_identifier [array_index] (<COMMA> global_declared_identifier [array_index])*;
|
||||
global_declared_identifier = <IDENTIFIER>;
|
||||
global_preprocessor = <PREPROCESSOR>;
|
||||
|
||||
field_declaration = global_type_qualifier struct_declaration;
|
||||
field_declaration = global_type_qualifier global_type_declaration [assignment2];
|
||||
|
||||
struct_declaration = "struct" <IDENTIFIER> struct_body [global_identifier_list];
|
||||
struct_body = "{" (local_type_declaration <SEMICOLON>)+ "}";
|
||||
|
||||
global_type_declaration = [precision_qualifier] type_specifier_or_identifier [array_index] global_identifier_list [<EQ> expression];
|
||||
type_declaration = [precision_qualifier] type_specifier_or_identifier [array_index] <IDENTIFIER> [array_index] (<COMMA> <IDENTIFIER> [array_index])*;
|
||||
|
||||
local_type_declaration = [type_qualifier] type_declaration;
|
||||
|
||||
precision_declaration = "precision" precision_qualifier type_specifier;
|
||||
|
||||
## function ####################################################################
|
||||
function = <FUNCTION> "(" [parameter_declaration_list] ")" (function_body | <SEMICOLON>);
|
||||
function_body = code_block;
|
||||
|
||||
parameter_declaration = [type_qualifier] [parameter_declaration_qualifier] [precision_qualifier] type_specifier_or_identifier ((array_index <IDENTIFIER>) | (<IDENTIFIER> [array_index]));
|
||||
parameter_declaration_list = "void" | (parameter_declaration (<COMMA> parameter_declaration)*);
|
||||
|
||||
statement = <PREPROCESSOR>;
|
||||
statement = expression_hack <SEMICOLON>; # statement = local_type_declaration [<EQ> expression] <SEMICOLON>;
|
||||
statement = conditional_statement;
|
||||
statement = "return" [expression] <SEMICOLON>;
|
||||
statement = "break" <SEMICOLON>; # break just in loops allowed
|
||||
statement = "continue" <SEMICOLON>;# continue just in loops allowed
|
||||
statement = "discard" <SEMICOLON>; # Fragment shader only.
|
||||
|
||||
code_block = "{" code_block* "}";
|
||||
code_block = "{" statement* "}";
|
||||
|
||||
## expresstions and operations #################################################
|
||||
# ternary operator
|
||||
expression = expression1 ["?" expression1 ":" expression1];
|
||||
|
||||
expression1 = [unary_operator] expression2 operation_or_comparison*;
|
||||
expression1 = [unary_operator] "(" expression ")" operation_or_comparison*;
|
||||
|
||||
expression2 = ( [increment_or_decrement_operator] (<IDENTIFIER> | <BUILD_IN_VAR>) (field_access)* [increment_or_decrement_operator] [assignment])
|
||||
| ((function_call | constructor_call) (field_access)*)
|
||||
| <INTEGER_LITERAL>
|
||||
| <FLOAT_LITERAL>
|
||||
| boolean_literal;
|
||||
|
||||
|
||||
|
||||
expression_hack = unary_operator expression1_hack operation_or_comparison*;
|
||||
expression_hack = unary_operator "(" expression ")" operation_or_comparison*;
|
||||
expression_hack = expression1_hack operation_or_comparison*;
|
||||
expression_hack = "(" expression ")" operation_or_comparison*;
|
||||
|
||||
expression_hack = <IDENTIFIER> (field_access)* [increment_or_decrement_operator] [assignment];
|
||||
expression_hack = <IDENTIFIER> (field_access)* <IDENTIFIER> [array_index] (<COMMA> <IDENTIFIER> [array_index])*;
|
||||
expression_hack = type_specifier (field_access)* <IDENTIFIER> [array_index] (<COMMA> <IDENTIFIER> [array_index])*;
|
||||
|
||||
expression1_hack = (increment_or_decrement_operator (<IDENTIFIER> | <BUILD_IN_VAR>) (field_access)* [increment_or_decrement_operator] [assignment])
|
||||
| (<BUILD_IN_VAR> (field_access)* [increment_or_decrement_operator] [assignment])
|
||||
| ((function_call | constructor_call) (field_access)*)
|
||||
| <INTEGER_LITERAL>
|
||||
| <FLOAT_LITERAL>
|
||||
| boolean_literal;
|
||||
|
||||
|
||||
|
||||
assignment = assignment_operator expression;
|
||||
assignment2 = <EQ> expression;
|
||||
operation_or_comparison = (comperator | operator) expression;
|
||||
|
||||
field_access = array_index;
|
||||
field_access = <DOT> <IDENTIFIER>;
|
||||
|
||||
array_index = "[" [expression] "]";
|
||||
|
||||
function_call = (<FUNCTION> | <BUILD_IN_FUNC>) "(" [expression_list] ")";
|
||||
# Note constructor call is something like that: vec2(1.0, 2.0) or float[2] (1.0, 2.0)
|
||||
constructor_call = type_specifier [array_index] "(" [expression_list] ")"; #TODO custom structs
|
||||
|
||||
expression_list = "void" | (expression (<COMMA> expression)*);
|
||||
|
||||
## code flow ###################################################################
|
||||
conditional_statement = if_statement
|
||||
| for_statement
|
||||
| while_statement
|
||||
| do_while_statement
|
||||
| switch_statement;
|
||||
|
||||
# TODO if rule not 100% correct, multiple else allowed even before else if
|
||||
if_statement = "if" condition statement_or_code_block ("else" ["if" condition] statement_or_code_block)*;
|
||||
|
||||
while_statement = "while" condition statement_or_code_block;
|
||||
do_while_statement = "do" statement_or_code_block "while" condition <SEMICOLON>;
|
||||
|
||||
# TODO for rule could be more restrictive
|
||||
for_statement = "for" "(" [[type_specifier] <IDENTIFIER> assignment] <SEMICOLON> [expression] <SEMICOLON> [expression] ")" statement_or_code_block;
|
||||
|
||||
switch_statement = "switch" condition "{" case* "}";
|
||||
case = ("case" expression ":" statement*)
|
||||
| ("default" ":" statement*);
|
||||
|
||||
condition = "(" expression ")";
|
||||
statement_or_code_block = (statement | code_block);
|
||||
|
||||
|
@ -0,0 +1,361 @@
|
||||
/*
|
||||
* Glsl.java
|
||||
*
|
||||
* Created on 24.09.2007, 00:46:53
|
||||
*
|
||||
*/
|
||||
|
||||
package net.java.nboglpack.glsleditor.glsl;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.swing.text.AbstractDocument;
|
||||
import net.java.nboglpack.glsleditor.lexer.GlslTokenId;
|
||||
import net.java.nboglpack.glsleditor.vocabulary.GLSLElementDescriptor;
|
||||
import org.netbeans.api.languages.ASTItem;
|
||||
import org.netbeans.api.languages.ASTNode;
|
||||
import org.netbeans.api.languages.ASTToken;
|
||||
import org.netbeans.api.languages.SyntaxContext;
|
||||
import org.netbeans.api.lexer.Token;
|
||||
import org.netbeans.api.lexer.TokenHierarchy;
|
||||
import org.netbeans.api.lexer.TokenSequence;
|
||||
import org.netbeans.api.lexer.TokenUtilities;
|
||||
|
||||
/**
|
||||
* Utility methods called from GLSL.nbs.
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public final class Glsl {
|
||||
|
||||
private final static String KEYWORD_FONT_COLOR = "<font color=808080>";
|
||||
|
||||
public final static Map<String, GLSLElementDescriptor> declaredFunctions = new HashMap<String, GLSLElementDescriptor>();
|
||||
|
||||
private Glsl() {}
|
||||
|
||||
/**
|
||||
* Assembles a human readable String containing the declaraton of a function.
|
||||
* Asumes that the current token of the SyntaxContext represents the function name.
|
||||
*/
|
||||
public static final String createFunctionDeclarationString(SyntaxContext context) {
|
||||
|
||||
AbstractDocument document = (AbstractDocument)context.getDocument();
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
try {
|
||||
|
||||
document.readLock();
|
||||
|
||||
TokenSequence sequence = TokenHierarchy.get(context.getDocument()).tokenSequence();
|
||||
sequence.move(context.getOffset());
|
||||
sequence.moveNext();
|
||||
|
||||
sb.append("<html>");
|
||||
|
||||
int moved = 0;
|
||||
while(sequence.movePrevious() && isIgnoredToken(sequence.token()))
|
||||
moved++;
|
||||
|
||||
String type = sequence.token().toString();
|
||||
while(moved-- >= 0)
|
||||
sequence.moveNext();
|
||||
|
||||
// append function name
|
||||
sb.append(sequence.token().text());
|
||||
|
||||
while(!TokenUtilities.equals(sequence.token().text(), "("))
|
||||
sequence.moveNext();
|
||||
|
||||
sb.append("(");
|
||||
|
||||
Token token;
|
||||
boolean first = true;
|
||||
while(sequence.moveNext() && !TokenUtilities.equals(sequence.token().text(), ")")) {
|
||||
|
||||
token = sequence.token();
|
||||
|
||||
if(!isIgnoredToken(token)) {
|
||||
|
||||
if(first) {
|
||||
sb.append(KEYWORD_FONT_COLOR);
|
||||
}else if(token.id() != GlslTokenId.COMMA && token.id() != GlslTokenId.BRACKET && token.id() != GlslTokenId.INTEGER_LITERAL) {
|
||||
sb.append(" ");
|
||||
}
|
||||
|
||||
if(!TokenUtilities.equals(token.text(), "void")) {
|
||||
|
||||
moved = 0;
|
||||
while(sequence.moveNext() && isIgnoredToken(sequence.token()))
|
||||
moved++;
|
||||
|
||||
if(sequence.token().id() == GlslTokenId.COMMA || TokenUtilities.equals(sequence.token().text(), ")"))
|
||||
sb.append("</font>");
|
||||
|
||||
while(moved-- >= 0)
|
||||
sequence.movePrevious();
|
||||
|
||||
sb.append(token.text());
|
||||
|
||||
if(token.id() == GlslTokenId.COMMA)
|
||||
sb.append(KEYWORD_FONT_COLOR);
|
||||
}
|
||||
|
||||
first = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sb.append("</font>)");
|
||||
|
||||
if(!"void".equals(type)) {
|
||||
sb.append(" : ");
|
||||
sb.append(KEYWORD_FONT_COLOR);
|
||||
sb.append(type);
|
||||
sb.append("</font>");
|
||||
}
|
||||
sb.append("</html>");
|
||||
|
||||
} finally {
|
||||
document.readUnlock();
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Assambles a human readable String containing the declaraton of a field and the field name itself.
|
||||
* Asumes that the current token of the SyntaxContext represents the field name.
|
||||
*/
|
||||
public static final String createFieldDeclarationString(SyntaxContext context) {
|
||||
|
||||
AbstractDocument document = (AbstractDocument)context.getDocument();
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
try {
|
||||
|
||||
document.readLock();
|
||||
|
||||
TokenSequence sequence = TokenHierarchy.get(context.getDocument()).tokenSequence();
|
||||
sequence.move(context.getOffset());
|
||||
sequence.moveNext();
|
||||
|
||||
sb.append("<html>");
|
||||
sb.append(sequence.token().text());
|
||||
sb.append(KEYWORD_FONT_COLOR);
|
||||
sb.append(" :");
|
||||
|
||||
int insertIndex = sb.length();
|
||||
|
||||
// read forward
|
||||
int moved = 0;
|
||||
Token token;
|
||||
while( sequence.moveNext()
|
||||
&& sequence.token().id() != GlslTokenId.SEMICOLON
|
||||
&& sequence.token().id() != GlslTokenId.COMMA
|
||||
&& sequence.token().id() != GlslTokenId.EQ ) {
|
||||
token = sequence.token();
|
||||
if(!isIgnoredToken(token))
|
||||
sb.append(token);
|
||||
moved++;
|
||||
}
|
||||
while(moved-- >= 0)
|
||||
sequence.movePrevious();
|
||||
|
||||
// read backwards throw the declaration
|
||||
boolean skipToken = false;
|
||||
|
||||
while( sequence.movePrevious()
|
||||
&& sequence.token().id() != GlslTokenId.SEMICOLON
|
||||
&& sequence.token().id() != GlslTokenId.END_OF_LINE ) {
|
||||
|
||||
token = sequence.token();
|
||||
|
||||
if(!isIgnoredToken(token)) {
|
||||
|
||||
// we have a struct declaration; skip everything between { }
|
||||
if(token.id() == GlslTokenId.BRACE && TokenUtilities.equals(token.text(), "}")) {
|
||||
movePreviousUntil(sequence, GlslTokenId.BRACE, "}", "{");
|
||||
continue;
|
||||
}
|
||||
|
||||
// skip token in case of an comma seperated identifier list
|
||||
if(skipToken) {
|
||||
if( token.id() == GlslTokenId.BRACKET
|
||||
&& TokenUtilities.equals(token.text(), "]") ) {
|
||||
movePreviousUntil(sequence, GlslTokenId.BRACKET, "]", "[");
|
||||
skipToken = false;
|
||||
}else {
|
||||
skipToken = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if(token.id() == GlslTokenId.COMMA) {
|
||||
skipToken = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!TokenUtilities.equals(token.text(), "struct")) {
|
||||
sb.insert(insertIndex, token.text());
|
||||
sb.insert(insertIndex, " ");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sb.append("</font></html>");
|
||||
} finally {
|
||||
document.readUnlock();
|
||||
}
|
||||
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
public static final String createPreprocessorString(SyntaxContext context) {
|
||||
|
||||
ASTNode node = (ASTNode)context.getASTPath().getLeaf();
|
||||
List<ASTItem> children = node.getChildren();
|
||||
|
||||
String str = null;
|
||||
|
||||
for (ASTItem item : children)
|
||||
if (isTokenType(item, GlslTokenId.PREPROCESSOR.name()))
|
||||
str = ((ASTToken)item).getIdentifier();
|
||||
|
||||
|
||||
for(int i = 0; i < str.length(); i++) {
|
||||
|
||||
char c = str.charAt(i);
|
||||
|
||||
if(c != '#' && !Character.isWhitespace(c))
|
||||
for(int j = str.length()-1; j > i; j--)
|
||||
if(!Character.isWhitespace(str.charAt(j)))
|
||||
return str.substring(i, j+1);
|
||||
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* called from withen GLSL_*.nbs each time the document has been modified.
|
||||
*/
|
||||
public static void process(SyntaxContext context) {
|
||||
|
||||
AbstractDocument document = (AbstractDocument)context.getDocument();
|
||||
try{
|
||||
document.readLock();
|
||||
|
||||
// remember all declared funktions for auto completion
|
||||
synchronized(declaredFunctions) {
|
||||
declaredFunctions.clear();
|
||||
}
|
||||
|
||||
List<ASTItem> declarations = context.getASTPath().getLeaf().getChildren();
|
||||
|
||||
for (ASTItem declaration : declarations) {
|
||||
|
||||
for (ASTItem declarationItem : declaration.getChildren()) {
|
||||
|
||||
if(isNode(declarationItem, "function")) {
|
||||
|
||||
|
||||
List<ASTItem> functionItems = declarationItem.getChildren();
|
||||
|
||||
if(functionItems.size() < 3)
|
||||
break;
|
||||
|
||||
ASTItem nameToken = functionItems.get(0);
|
||||
|
||||
if(isTokenType(nameToken, GlslTokenId.FUNCTION.name())) {
|
||||
|
||||
// determine return type
|
||||
StringBuilder returnType = new StringBuilder();
|
||||
for (ASTItem typeItem : declaration.getChildren()) {
|
||||
|
||||
if(isNode(typeItem, "function"))
|
||||
break;
|
||||
|
||||
if(typeItem instanceof ASTNode) {
|
||||
returnType.append(((ASTNode)typeItem).getAsText().trim());
|
||||
}else if(typeItem instanceof ASTToken) {
|
||||
final ASTToken t = (ASTToken) typeItem;
|
||||
returnType.append(t.getIdentifier().trim());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// determine name and parameter list
|
||||
StringBuilder name = new StringBuilder();
|
||||
|
||||
name.append("(");
|
||||
ASTItem parameterList = functionItems.get(2);
|
||||
if(isNode(parameterList, "parameter_declaration_list"))
|
||||
name.append(((ASTNode)parameterList).getAsText());
|
||||
name.append(")");
|
||||
|
||||
GLSLElementDescriptor elementDesc = new GLSLElementDescriptor(
|
||||
GLSLElementDescriptor.Category.USER_FUNC,
|
||||
"",
|
||||
"",
|
||||
name.toString(),
|
||||
returnType.toString());
|
||||
|
||||
name.insert(0, ((ASTToken) nameToken).getIdentifier());
|
||||
|
||||
synchronized(declaredFunctions) {
|
||||
declaredFunctions.put(name.toString(), elementDesc);
|
||||
}
|
||||
|
||||
// System.out.println("|"+returnType.toString()+"|"+name.toString()+"|");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}finally{
|
||||
document.readUnlock();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static final void movePreviousUntil(TokenSequence sequence, GlslTokenId id, String countToken, String stopToken) {
|
||||
int counter = 1;
|
||||
while(sequence.movePrevious() && counter > 0) {
|
||||
if(sequence.token().id() == id) {
|
||||
if(TokenUtilities.equals(sequence.token().text(), stopToken)) {
|
||||
counter--;
|
||||
}else if(TokenUtilities.equals(sequence.token().text(), countToken)){
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final boolean isIgnoredToken(Token token) {
|
||||
return token.id() == GlslTokenId.WHITESPACE
|
||||
|| token.id() == GlslTokenId.COMMENT
|
||||
|| token.id() == GlslTokenId.PREPROCESSOR;
|
||||
}
|
||||
|
||||
private static final boolean isNode(ASTItem item, String nodeToken) {
|
||||
return item != null && item instanceof ASTNode && ((ASTNode)item).getNT().equals(nodeToken);
|
||||
}
|
||||
|
||||
private static final boolean isToken(ASTItem item, String id) {
|
||||
return item != null && item instanceof ASTToken && ((ASTToken)item).getIdentifier().equals(id);
|
||||
}
|
||||
|
||||
private static final boolean isTokenType(ASTItem item, String type) {
|
||||
return item != null && item instanceof ASTToken && ((ASTToken) item).getTypeName().equals(type);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,289 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
|
||||
<filesystem>
|
||||
<folder name="Editors">
|
||||
<folder name="text">
|
||||
|
||||
<folder name="x-glsl-vertex-shader">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.Bundle"/>
|
||||
<file name="vocabulary.xml" url="resources/JmeVocabulary.xml"/>
|
||||
<folder name="CompletionProviders">
|
||||
<file name="GlslCompletionProvider.instance">
|
||||
<attr name="instanceCreate" methodvalue="net.java.nboglpack.glsleditor.GlslCompletionProvider.createVSCompletionProvider"/>
|
||||
<attr name="instanceClass" stringvalue="net.java.nboglpack.glsleditor.GlslCompletionProvider"/>
|
||||
</file>
|
||||
</folder>
|
||||
<folder name="FontsColors">
|
||||
<folder name="NetBeans">
|
||||
<folder name="Defaults">
|
||||
<file name="coloring.xml" url="resources/NetBeans-glsl-fontsColors.xml">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.Bundle"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
<file name="language.instance">
|
||||
<attr name="instanceCreate" methodvalue="net.java.nboglpack.glsleditor.lexer.Glsl.vertexLanguage"/>
|
||||
<attr name="instanceOf" stringvalue="org.netbeans.api.lexer.Language"/>
|
||||
</file>
|
||||
<!-- <file name="EditorKit.instance">
|
||||
<attr name="instanceCreate" methodvalue="org.netbeans.modules.lexer.editorbridge.LexerEditorKit.create"/>
|
||||
<attr name="instanceClass" stringvalue="org.netbeans.modules.lexer.editorbridge.LexerEditorKit"/>
|
||||
</file>-->
|
||||
<attr name="createDataObject" boolvalue="false"/>
|
||||
<file name="language.nbs" url="glsl/GLSL_130.nbs"/>
|
||||
</folder>
|
||||
|
||||
<folder name="x-glsl-fragment-shader">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.Bundle"/>
|
||||
<file name="vocabulary.xml" url="resources/JmeVocabulary.xml"/>
|
||||
<folder name="CompletionProviders">
|
||||
<file name="GlslCompletionProvider.instance">
|
||||
<attr name="instanceCreate" methodvalue="net.java.nboglpack.glsleditor.GlslCompletionProvider.createFSCompletionProvider"/>
|
||||
<attr name="instanceClass" stringvalue="net.java.nboglpack.glsleditor.GlslCompletionProvider"/>
|
||||
</file>
|
||||
</folder>
|
||||
<folder name="FontsColors">
|
||||
<folder name="NetBeans">
|
||||
<folder name="Defaults">
|
||||
<file name="coloring.xml" url="resources/NetBeans-glsl-fontsColors.xml">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.Bundle"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
<file name="language.instance">
|
||||
<attr name="instanceCreate" methodvalue="net.java.nboglpack.glsleditor.lexer.Glsl.fragmentLanguage"/>
|
||||
<attr name="instanceOf" stringvalue="org.netbeans.api.lexer.Language"/>
|
||||
</file>
|
||||
<!-- <file name="EditorKit.instance">
|
||||
<attr name="instanceCreate" methodvalue="org.netbeans.modules.lexer.editorbridge.LexerEditorKit.create"/>
|
||||
<attr name="instanceClass" stringvalue="org.netbeans.modules.lexer.editorbridge.LexerEditorKit"/>
|
||||
</file>-->
|
||||
<attr name="createDataObject" boolvalue="false"/>
|
||||
<file name="language.nbs" url="glsl/GLSL_130.nbs"/>
|
||||
</folder>
|
||||
|
||||
<folder name="x-glsl-geometry-shader">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.Bundle"/>
|
||||
<file name="vocabulary.xml" url="resources/JmeVocabulary.xml"/>
|
||||
<folder name="CompletionProviders">
|
||||
<file name="GlslCompletionProvider.instance">
|
||||
<attr name="instanceCreate" methodvalue="net.java.nboglpack.glsleditor.GlslCompletionProvider.createGSCompletionProvider"/>
|
||||
<attr name="instanceClass" stringvalue="net.java.nboglpack.glsleditor.GlslCompletionProvider"/>
|
||||
</file>
|
||||
</folder>
|
||||
<folder name="FontsColors">
|
||||
<folder name="NetBeans">
|
||||
<folder name="Defaults">
|
||||
<file name="coloring.xml" url="resources/NetBeans-glsl-fontsColors.xml">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.Bundle"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
<file name="language.instance">
|
||||
<attr name="instanceCreate" methodvalue="net.java.nboglpack.glsleditor.lexer.Glsl.geometryLanguage"/>
|
||||
<attr name="instanceOf" stringvalue="org.netbeans.api.lexer.Language"/>
|
||||
</file>
|
||||
<!-- <file name="EditorKit.instance">
|
||||
<attr name="instanceCreate" methodvalue="org.netbeans.modules.lexer.editorbridge.LexerEditorKit.create"/>
|
||||
<attr name="instanceClass" stringvalue="org.netbeans.modules.lexer.editorbridge.LexerEditorKit"/>
|
||||
</file>-->
|
||||
<attr name="createDataObject" boolvalue="false"/>
|
||||
<file name="language.nbs" url="glsl/GLSL_130.nbs"/>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
|
||||
<folder name="OptionsDialog">
|
||||
<folder name="PreviewExamples">
|
||||
<folder name="text">
|
||||
<file name="x-glsl-vertex-shader" url="resources/GlslVertexShaderExample.vert"/>
|
||||
<file name="x-glsl-fragment-shader" url="resources/GlslFragmentShaderExample.frag"/>
|
||||
<file name="x-glsl-geometry-shader" url="resources/GlslGeometryShaderExample.geom"/>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
|
||||
<folder name="Loaders">
|
||||
<folder name="text">
|
||||
<folder name="x-glsl-geometry-shader">
|
||||
<folder name="Actions">
|
||||
<file name="org-openide-actions-CopyAction.instance">
|
||||
<attr name="position" intvalue="500"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-CutAction.instance">
|
||||
<attr name="position" intvalue="400"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-DeleteAction.instance">
|
||||
<attr name="position" intvalue="700"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-FileSystemAction.instance">
|
||||
<attr name="position" intvalue="200"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-OpenAction.instance">
|
||||
<attr name="position" intvalue="100"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-PropertiesAction.instance">
|
||||
<attr name="position" intvalue="1300"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-RenameAction.instance">
|
||||
<attr name="position" intvalue="800"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-SaveAsTemplateAction.instance">
|
||||
<attr name="position" intvalue="1000"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-ToolsAction.instance">
|
||||
<attr name="position" intvalue="1200"/>
|
||||
</file>
|
||||
<file name="sep-1.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="300"/>
|
||||
</file>
|
||||
<file name="sep-2.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="600"/>
|
||||
</file>
|
||||
<file name="sep-3.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="900"/>
|
||||
</file>
|
||||
<file name="sep-4.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="1100"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
<folder name="x-glsl-vertex-shader">
|
||||
<folder name="Actions">
|
||||
<file name="org-openide-actions-CopyAction.instance">
|
||||
<attr name="position" intvalue="500"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-CutAction.instance">
|
||||
<attr name="position" intvalue="400"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-DeleteAction.instance">
|
||||
<attr name="position" intvalue="700"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-FileSystemAction.instance">
|
||||
<attr name="position" intvalue="200"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-OpenAction.instance">
|
||||
<attr name="position" intvalue="100"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-PropertiesAction.instance">
|
||||
<attr name="position" intvalue="1300"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-RenameAction.instance">
|
||||
<attr name="position" intvalue="800"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-SaveAsTemplateAction.instance">
|
||||
<attr name="position" intvalue="1000"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-ToolsAction.instance">
|
||||
<attr name="position" intvalue="1200"/>
|
||||
</file>
|
||||
<file name="sep-1.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="300"/>
|
||||
</file>
|
||||
<file name="sep-2.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="600"/>
|
||||
</file>
|
||||
<file name="sep-3.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="900"/>
|
||||
</file>
|
||||
<file name="sep-4.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="1100"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
<folder name="x-glsl-fragment-shader">
|
||||
<folder name="Actions">
|
||||
<file name="org-openide-actions-CopyAction.instance">
|
||||
<attr name="position" intvalue="500"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-CutAction.instance">
|
||||
<attr name="position" intvalue="400"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-DeleteAction.instance">
|
||||
<attr name="position" intvalue="700"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-FileSystemAction.instance">
|
||||
<attr name="position" intvalue="200"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-OpenAction.instance">
|
||||
<attr name="position" intvalue="100"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-PropertiesAction.instance">
|
||||
<attr name="position" intvalue="1300"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-RenameAction.instance">
|
||||
<attr name="position" intvalue="800"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-SaveAsTemplateAction.instance">
|
||||
<attr name="position" intvalue="1000"/>
|
||||
</file>
|
||||
<file name="org-openide-actions-ToolsAction.instance">
|
||||
<attr name="position" intvalue="1200"/>
|
||||
</file>
|
||||
<file name="sep-1.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="300"/>
|
||||
</file>
|
||||
<file name="sep-2.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="600"/>
|
||||
</file>
|
||||
<file name="sep-3.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="900"/>
|
||||
</file>
|
||||
<file name="sep-4.instance">
|
||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||
<attr name="position" intvalue="1100"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
</folder>
|
||||
|
||||
<folder name="Services">
|
||||
<folder name="MIMEResolver">
|
||||
<file name="GlslFragmentShaderResolver.xml" url="resources/GlslFragmentShaderResolver.xml">
|
||||
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/net/java/nboglpack/glsleditor/resources/FragmentShaderIcon.gif"/>
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.dataobject.Bundle"/>
|
||||
</file>
|
||||
<file name="GlslGeometryShaderResolver.xml" url="resources/GlslGeometryShaderResolver.xml">
|
||||
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/net/java/nboglpack/glsleditor/resources/GeometryShaderIcon.gif"/>
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.dataobject.Bundle"/>
|
||||
</file>
|
||||
<file name="GlslVertexShaderResolver.xml" url="resources/GlslVertexShaderResolver.xml">
|
||||
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/net/java/nboglpack/glsleditor/resources/VertexShaderIcon.gif"/>
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.dataobject.Bundle"/>
|
||||
</file>
|
||||
</folder>
|
||||
</folder>
|
||||
|
||||
<folder name="Templates">
|
||||
<folder name="OpenGL">
|
||||
<file name="FragmentShader.frag" url="resources/FragmentShaderTemplate.frag">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.dataobject.Bundle"/>
|
||||
<attr name="template" boolvalue="true"/>
|
||||
</file>
|
||||
<file name="GeometryShader.geom" url="resources/GeometryShaderTemplate.geom">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.dataobject.Bundle"/>
|
||||
<attr name="template" boolvalue="true"/>
|
||||
</file>
|
||||
<file name="VertexShader.vert" url="resources/VertexShaderTemplate.vert">
|
||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="net.java.nboglpack.glsleditor.dataobject.Bundle"/>
|
||||
<attr name="template" boolvalue="true"/>
|
||||
</file>
|
||||
<attr name="position" intvalue="2000"/>
|
||||
</folder>
|
||||
</folder>
|
||||
</filesystem>
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* VertexLanguage.java
|
||||
*
|
||||
* Created on 19.08.2007, 18:25:24
|
||||
*
|
||||
*/
|
||||
|
||||
package net.java.nboglpack.glsleditor.lexer;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.EnumSet;
|
||||
import net.java.nboglpack.glsleditor.GlslVocabularyManager;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslFragmentShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslGeometryShaderDataLoader;
|
||||
import net.java.nboglpack.glsleditor.dataobject.GlslVertexShaderDataLoader;
|
||||
import org.netbeans.api.lexer.Language;
|
||||
import org.netbeans.spi.lexer.LanguageHierarchy;
|
||||
import org.netbeans.spi.lexer.Lexer;
|
||||
import org.netbeans.spi.lexer.LexerRestartInfo;
|
||||
|
||||
/**
|
||||
* OpenGL Shading Language.
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class Glsl extends LanguageHierarchy<GlslTokenId> {
|
||||
|
||||
public static final Glsl VERTEX_LANGUAGE = new Glsl(GlslVertexShaderDataLoader.REQUIRED_MIME);
|
||||
public static final Glsl GEOMETRY_LANGUAGE = new Glsl(GlslGeometryShaderDataLoader.REQUIRED_MIME);
|
||||
public static final Glsl FRAGMENT_LANGUAGE = new Glsl(GlslFragmentShaderDataLoader.REQUIRED_MIME);
|
||||
|
||||
private final String mimeType;
|
||||
|
||||
private Glsl(String mimeType) {
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String mimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Collection<GlslTokenId> createTokenIds() {
|
||||
return EnumSet.allOf(GlslTokenId.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Lexer<GlslTokenId> createLexer(LexerRestartInfo<GlslTokenId> info) {
|
||||
return new GlslLexer(info, GlslVocabularyManager.getInstance(mimeType()));
|
||||
}
|
||||
|
||||
public static Language<GlslTokenId> vertexLanguage(){
|
||||
return VERTEX_LANGUAGE.language();
|
||||
}
|
||||
public static Language<GlslTokenId> fragmentLanguage(){
|
||||
return FRAGMENT_LANGUAGE.language();
|
||||
}
|
||||
public static Language<GlslTokenId> geometryLanguage(){
|
||||
return GEOMETRY_LANGUAGE.language();
|
||||
}
|
||||
}
|
@ -0,0 +1,343 @@
|
||||
/*
|
||||
* GlslLexer.java
|
||||
*
|
||||
* Created on 19.08.2007, 18:31:16
|
||||
*
|
||||
*/
|
||||
|
||||
package net.java.nboglpack.glsleditor.lexer;
|
||||
|
||||
import net.java.nboglpack.glsleditor.GlslVocabularyManager;
|
||||
import net.java.nboglpack.glsleditor.vocabulary.GLSLElementDescriptor;
|
||||
import org.netbeans.api.lexer.Token;
|
||||
import org.netbeans.spi.lexer.Lexer;
|
||||
import org.netbeans.spi.lexer.LexerInput;
|
||||
import org.netbeans.spi.lexer.LexerRestartInfo;
|
||||
import org.netbeans.spi.lexer.TokenFactory;
|
||||
|
||||
|
||||
/**
|
||||
* Lexer for the OpenGL Shading Language.
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GlslLexer implements Lexer<GlslTokenId> {
|
||||
|
||||
private final LexerInput input;
|
||||
private final TokenFactory<GlslTokenId> factory;
|
||||
private final GlslVocabularyManager manager;
|
||||
private final StringBuilder stringBuilder;
|
||||
|
||||
|
||||
public GlslLexer(LexerRestartInfo<GlslTokenId> info, GlslVocabularyManager manager) {
|
||||
this.input = info.input();
|
||||
this.factory = info.tokenFactory();
|
||||
this.manager = manager;
|
||||
this.stringBuilder = new StringBuilder();
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
public Token<GlslTokenId> nextToken() {
|
||||
|
||||
int character = input.read();
|
||||
|
||||
switch(character) {
|
||||
|
||||
case '(':
|
||||
case ')':
|
||||
return factory.createToken(GlslTokenId.PAREN);
|
||||
case '{':
|
||||
case '}':
|
||||
return factory.createToken(GlslTokenId.BRACE);
|
||||
case '[':
|
||||
case ']':
|
||||
return factory.createToken(GlslTokenId.BRACKET);
|
||||
case '.':
|
||||
return factory.createToken(GlslTokenId.DOT);
|
||||
case ',':
|
||||
return factory.createToken(GlslTokenId.COMMA);
|
||||
case ':':
|
||||
return factory.createToken(GlslTokenId.COLON);
|
||||
case ';':
|
||||
return factory.createToken(GlslTokenId.SEMICOLON);
|
||||
case '?':
|
||||
return factory.createToken(GlslTokenId.QUESTION);
|
||||
case '~':
|
||||
return factory.createToken(GlslTokenId.TILDE);
|
||||
case '*':
|
||||
if(input.read() == '=') {
|
||||
return factory.createToken(GlslTokenId.MUL_ASSIGN);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.STAR);
|
||||
}
|
||||
case '%':
|
||||
if(input.read() == '=') {
|
||||
return factory.createToken(GlslTokenId.MOD_ASSIGN);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.PERCENT);
|
||||
}
|
||||
case '!':
|
||||
if(input.read() == '=') {
|
||||
return factory.createToken(GlslTokenId.NE);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.BANG);
|
||||
}
|
||||
case '=':
|
||||
if(input.read() == '=') {
|
||||
return factory.createToken(GlslTokenId.EQEQ);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.EQ);
|
||||
}
|
||||
case '^':
|
||||
switch(input.read()) {
|
||||
case('^'):
|
||||
return factory.createToken(GlslTokenId.CARETCARET);
|
||||
case('='):
|
||||
return factory.createToken(GlslTokenId.XOR_ASSIGN);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.CARET);
|
||||
}
|
||||
case '+':
|
||||
switch(input.read()) {
|
||||
case('+'):
|
||||
return factory.createToken(GlslTokenId.PLUSPLUS);
|
||||
case('='):
|
||||
return factory.createToken(GlslTokenId.ADD_ASSIGN);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.PLUS);
|
||||
}
|
||||
case '-':
|
||||
switch(input.read()) {
|
||||
case('-'):
|
||||
return factory.createToken(GlslTokenId.MINUSMINUS);
|
||||
case('='):
|
||||
return factory.createToken(GlslTokenId.SUB_ASSIGN);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.MINUS);
|
||||
}
|
||||
case '&':
|
||||
switch(input.read()) {
|
||||
case('&'):
|
||||
return factory.createToken(GlslTokenId.AMPAMP);
|
||||
case('='):
|
||||
return factory.createToken(GlslTokenId.AND_ASSIGN);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.AMP);
|
||||
}
|
||||
case '|':
|
||||
switch(input.read()) {
|
||||
case('|'):
|
||||
return factory.createToken(GlslTokenId.BARBAR);
|
||||
case ('='):
|
||||
return factory.createToken(GlslTokenId.OR_ASSIGN);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.BAR);
|
||||
}
|
||||
case '<':
|
||||
switch(input.read()) {
|
||||
case('<'):
|
||||
if(input.read() == '=') {
|
||||
return factory.createToken(GlslTokenId.LEFT_BITSHIFT_ASSIGN);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.LEFT_BITSHIFT);
|
||||
}
|
||||
case('='):
|
||||
return factory.createToken(GlslTokenId.LE);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.LEFT_ANGLE);
|
||||
}
|
||||
case '>':
|
||||
switch(input.read()) {
|
||||
case('>'):
|
||||
if(input.read() == '=') {
|
||||
return factory.createToken(GlslTokenId.RIGHT_BITSHIFT_ASSIGN);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.RIGHT_BITSHIFT);
|
||||
}
|
||||
case('='):
|
||||
return factory.createToken(GlslTokenId.GE);
|
||||
default:
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.RIGHT_ANGLE);
|
||||
}
|
||||
case '/':
|
||||
int c = input.read();
|
||||
if(c == '/') {
|
||||
readRemainingLine();
|
||||
return factory.createToken(GlslTokenId.COMMENT);
|
||||
}else if(c == '*') {
|
||||
return tokenizeMLComment();
|
||||
}else if(c == '=') {
|
||||
return factory.createToken(GlslTokenId.DIV_ASSIGN);
|
||||
}else{
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.SLASH);
|
||||
}
|
||||
case '#':
|
||||
readRemainingLine();
|
||||
return factory.createToken(GlslTokenId.PREPROCESSOR);
|
||||
case ' ':
|
||||
case '\t':
|
||||
do{
|
||||
character = input.read();
|
||||
}while(character == ' ' || character == '\t');
|
||||
input.backup(1);
|
||||
return factory.createToken(GlslTokenId.WHITESPACE);
|
||||
case '\r':
|
||||
input.consumeNewline();
|
||||
case LexerInput.EOF:
|
||||
if(input.readLength() == 0)
|
||||
return null;
|
||||
case '\n':
|
||||
return factory.createToken(GlslTokenId.END_OF_LINE);
|
||||
default:
|
||||
if(Character.isDigit(character)) {
|
||||
return tokenizeNumber();
|
||||
}else if(Character.isUnicodeIdentifierStart(character)) {
|
||||
return tokenizeName();
|
||||
}else{
|
||||
return factory.createToken(GlslTokenId.error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
private final void readRemainingLine() {
|
||||
|
||||
int character = input.read();
|
||||
|
||||
while(character != LexerInput.EOF) {
|
||||
switch (character) {
|
||||
case '\r':
|
||||
input.consumeNewline();
|
||||
case '\n':
|
||||
case LexerInput.EOF:
|
||||
return;
|
||||
}
|
||||
character = input.read();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final Token<GlslTokenId> tokenizeMLComment() {
|
||||
|
||||
int character = input.read();
|
||||
|
||||
while(character != LexerInput.EOF) {
|
||||
if(character == '*' && input.read() == '/') {
|
||||
return factory.createToken(GlslTokenId.ML_COMMENT);
|
||||
}
|
||||
character = input.read();
|
||||
}
|
||||
return factory.createToken(GlslTokenId.ML_COMMENT);
|
||||
|
||||
}
|
||||
|
||||
private final Token<GlslTokenId> tokenizeNumber() {
|
||||
|
||||
int character;
|
||||
|
||||
do{
|
||||
character = input.read();
|
||||
}while(Character.isDigit(character));
|
||||
|
||||
if(character == '.') {
|
||||
|
||||
do{
|
||||
character = input.read();
|
||||
}while(Character.isDigit(character));
|
||||
|
||||
if(character != 'f' && character != 'F')
|
||||
input.backup(1);
|
||||
|
||||
return factory.createToken(GlslTokenId.FLOAT_LITERAL);
|
||||
|
||||
}else{
|
||||
|
||||
if(character != 'u' && character != 'U')
|
||||
input.backup(1);
|
||||
|
||||
// input.backup(1);
|
||||
return factory.createToken(GlslTokenId.INTEGER_LITERAL);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private final Token<GlslTokenId> tokenizeName() {
|
||||
|
||||
if(stringBuilder.length() > 0)
|
||||
stringBuilder.delete(0, stringBuilder.length());
|
||||
|
||||
// backup everything read
|
||||
input.backup(input.readLength());
|
||||
|
||||
// assamble token
|
||||
char c;
|
||||
while(Character.isUnicodeIdentifierPart(c = ((char)input.read())))
|
||||
stringBuilder.append(c);
|
||||
|
||||
if(stringBuilder.length() > 0)
|
||||
input.backup(1);
|
||||
|
||||
// categorise token
|
||||
GLSLElementDescriptor[] desc = manager.getDesc(stringBuilder.toString());
|
||||
|
||||
if(desc != null) {
|
||||
|
||||
if(desc[0].category != null) {
|
||||
|
||||
if(desc[0].category == GLSLElementDescriptor.Category.BUILD_IN_FUNC)
|
||||
return factory.createToken(GlslTokenId.BUILD_IN_FUNC);
|
||||
|
||||
if(desc[0].category == GLSLElementDescriptor.Category.BUILD_IN_VAR)
|
||||
return factory.createToken(GlslTokenId.BUILD_IN_VAR);
|
||||
|
||||
return factory.createToken(GlslTokenId.KEYWORD);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// check if token = function name
|
||||
int tokenEnd = input.readLength();
|
||||
int character = input.read();
|
||||
|
||||
while(true) {
|
||||
switch (character) {
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\n':
|
||||
character = input.read();
|
||||
break;
|
||||
case '(':
|
||||
input.backup(input.readLength()-tokenEnd);
|
||||
return factory.createToken(GlslTokenId.FUNCTION);
|
||||
default:
|
||||
input.backup(input.readLength()-tokenEnd);
|
||||
return factory.createToken(GlslTokenId.IDENTIFIER);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Object state() {
|
||||
// we don't need states
|
||||
return null;
|
||||
}
|
||||
|
||||
public void release() {
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* GlslTokenId.java
|
||||
*
|
||||
* Created on 19.08.2007, 18:09:00
|
||||
*
|
||||
*/
|
||||
|
||||
package net.java.nboglpack.glsleditor.lexer;
|
||||
|
||||
import org.netbeans.api.lexer.TokenId;
|
||||
|
||||
/**
|
||||
* Enumeration of GLSL token ids.
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public enum GlslTokenId implements TokenId {
|
||||
|
||||
|
||||
IDENTIFIER("glsl-name"),
|
||||
INTEGER_LITERAL("glsl-literal"),
|
||||
FLOAT_LITERAL("glsl-literal"),
|
||||
FUNCTION("glsl-function"),
|
||||
KEYWORD("glsl-keyword"),
|
||||
BUILD_IN_FUNC("glsl-build-in-func"),
|
||||
BUILD_IN_VAR("glsl-build-in-var"),
|
||||
COMMENT("glsl-comment"),
|
||||
ML_COMMENT("glsl-comment"),
|
||||
|
||||
PAREN("glsl-paren"),
|
||||
BRACE("glsl-brace"),
|
||||
BRACKET("glsl-bracket"),
|
||||
LEFT_ANGLE("glsl-angle"),
|
||||
RIGHT_ANGLE("glsl-angle"),
|
||||
|
||||
SEMICOLON("glsl-separator"),
|
||||
COMMA("glsl-separator"),
|
||||
DOT("glsl-separator"),
|
||||
COLON("glsl-separator"),
|
||||
|
||||
PERCENT("glsl-operation"),
|
||||
STAR("glsl-operation"),
|
||||
TILDE("glsl-operation"),
|
||||
QUESTION("glsl-operation"),
|
||||
BANG("glsl-operation"),
|
||||
SLASH("glsl-operation"),
|
||||
LEFT_BITSHIFT("glsl-operation"),
|
||||
RIGHT_BITSHIFT("glsl-operation"),
|
||||
PLUS("glsl-operation"),
|
||||
PLUSPLUS("glsl-operation"),
|
||||
MINUS("glsl-operation"),
|
||||
MINUSMINUS("glsl-operation"),
|
||||
AMP("glsl-operation"),
|
||||
AMPAMP("glsl-operation"),
|
||||
EQ("glsl-operation"),
|
||||
EQEQ("glsl-operation"),
|
||||
NE("glsl-operation"),
|
||||
LE("glsl-operation"),
|
||||
GE("glsl-operation"),
|
||||
BAR("glsl-operation"),
|
||||
BARBAR("glsl-operation"),
|
||||
CARET("glsl-operation"),
|
||||
CARETCARET("glsl-operation"),
|
||||
ADD_ASSIGN("glsl-operation"),
|
||||
SUB_ASSIGN("glsl-operation"),
|
||||
MUL_ASSIGN("glsl-operation"),
|
||||
DIV_ASSIGN("glsl-operation"),
|
||||
AND_ASSIGN("glsl-operation"),
|
||||
OR_ASSIGN("glsl-operation"),
|
||||
XOR_ASSIGN("glsl-operation"),
|
||||
MOD_ASSIGN("glsl-operation"),
|
||||
LEFT_BITSHIFT_ASSIGN("glsl-operation"),
|
||||
RIGHT_BITSHIFT_ASSIGN("glsl-operation"),
|
||||
|
||||
WHITESPACE("glsl-whitespace"),
|
||||
END_OF_LINE("glsl-end-of-line"),
|
||||
PREPROCESSOR("glsl-preprocessor"),
|
||||
|
||||
error("glsl-error");
|
||||
|
||||
private final String primaryCategory;
|
||||
|
||||
private GlslTokenId(String primaryCategory) {
|
||||
this.primaryCategory = primaryCategory;
|
||||
}
|
||||
|
||||
public String primaryCategory() {
|
||||
return primaryCategory;
|
||||
}
|
||||
|
||||
}
|
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 607 B |
@ -0,0 +1,8 @@
|
||||
/*
|
||||
* fragment shader template
|
||||
*/
|
||||
void main() {
|
||||
// Set the fragment color for example to gray, alpha 1.0
|
||||
gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
|
||||
}
|
||||
|
After Width: | Height: | Size: 614 B |
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* geometry shader template
|
||||
*/
|
||||
|
||||
#version 120
|
||||
#extension GL_EXT_geometry_shader4 : enable
|
||||
|
||||
// a passthrough geometry shader for color and position
|
||||
void main(void) {
|
||||
|
||||
for(int i = 0; i < gl_VerticesIn; ++i) {
|
||||
|
||||
// copy color
|
||||
gl_FrontColor = gl_FrontColorIn[i];
|
||||
|
||||
// copy position
|
||||
gl_Position = gl_PositionIn[i];
|
||||
|
||||
// done with the vertex
|
||||
EmitVertex();
|
||||
|
||||
}
|
||||
|
||||
EndPrimitive();
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
// ------ Fragment shader ------ //
|
||||
|
||||
#pragma debug(on)
|
||||
|
||||
varying vec3 normal;
|
||||
|
||||
/*
|
||||
* Toon shader
|
||||
*/
|
||||
void main() {
|
||||
|
||||
float intensity;
|
||||
vec4 color;
|
||||
vec3 n = normalize(normal);
|
||||
|
||||
intensity = dot(vec3(gl_LightSource[0].position),n);
|
||||
|
||||
if (intensity > 0.95)
|
||||
color = vec4(1.0,0.5,0.5,1.0);
|
||||
else if (intensity > 0.5)
|
||||
color = vec4(0.6,0.3,0.3,1.0);
|
||||
else if (intensity > 0.25)
|
||||
color = vec4(0.4,0.2,0.2,1.0);
|
||||
else
|
||||
color = vec4(0.2,0.1,0.1,1.0);
|
||||
|
||||
gl_FragColor = color;
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE MIME-resolver PUBLIC "-//NetBeans//DTD MIME Resolver 1.0//EN" "http://www.netbeans.org/dtds/mime-resolver-1_0.dtd">
|
||||
<MIME-resolver>
|
||||
<file>
|
||||
<ext name="frag"/>
|
||||
<ext name="fragment"/>
|
||||
<ext name="glfrag"/>
|
||||
<ext name="glslfrag"/>
|
||||
<ext name="glslfragment"/>
|
||||
<ext name="glfragmentshader"/>
|
||||
<ext name="glslfragmentshader"/>
|
||||
<ext name="glsl-frag"/>
|
||||
<ext name="glsl-fragment"/>
|
||||
<ext name="gl-fragment-shader"/>
|
||||
<ext name="glsl-fragment-shader"/>
|
||||
<resolver mime="text/x-glsl-fragment-shader"/>
|
||||
</file>
|
||||
</MIME-resolver>
|
@ -0,0 +1,26 @@
|
||||
// ------ Geometry shader ------ //
|
||||
|
||||
#version 120
|
||||
#extension GL_EXT_geometry_shader4 : enable
|
||||
|
||||
/*
|
||||
* a passthrough geometry shader for color and position
|
||||
*/
|
||||
void main() {
|
||||
|
||||
for(int i = 0; i < gl_VerticesIn; ++i) {
|
||||
|
||||
// copy color
|
||||
gl_FrontColor = gl_FrontColorIn[i];
|
||||
|
||||
// copy position
|
||||
gl_Position = gl_PositionIn[i];
|
||||
|
||||
// done with the vertex
|
||||
EmitVertex();
|
||||
|
||||
}
|
||||
|
||||
EndPrimitive();
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE MIME-resolver PUBLIC "-//NetBeans//DTD MIME Resolver 1.0//EN" "http://www.netbeans.org/dtds/mime-resolver-1_0.dtd">
|
||||
<MIME-resolver>
|
||||
<file>
|
||||
<ext name="geom"/>
|
||||
<ext name="geometry"/>
|
||||
<ext name="glgeom"/>
|
||||
<ext name="glslgeom"/>
|
||||
<ext name="glslgeometry"/>
|
||||
<ext name="glgeometryshader"/>
|
||||
<ext name="glslgeometryshader"/>
|
||||
<ext name="glsl-geom"/>
|
||||
<ext name="glsl-geometry"/>
|
||||
<ext name="gl-geometry-shader"/>
|
||||
<ext name="glsl-geometry-shader"/>
|
||||
<resolver mime="text/x-glsl-geometry-shader"/>
|
||||
</file>
|
||||
</MIME-resolver>
|
@ -0,0 +1,29 @@
|
||||
// ------ Vertex shader ------ //
|
||||
|
||||
#pragma debug(on)
|
||||
|
||||
uniform vec3 LightPosition;
|
||||
const float SpecularContribution = 0.3;
|
||||
varying float LightIntensity;
|
||||
|
||||
/*
|
||||
* main function
|
||||
*/
|
||||
void main() {
|
||||
|
||||
vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
|
||||
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
|
||||
vec3 lightVec = normalize(LightPosition - ecPosition);
|
||||
vec3 reflectVec = reflect(-lightVec, tnorm);
|
||||
vec3 viewVec = normalize(-ecPosition);
|
||||
float diffuse = max(dot(lightVec, tnorm), 0.0);
|
||||
float spec = 0.0;
|
||||
|
||||
if (diffuse > 0.0) {
|
||||
spec = max(dot(reflectVec, viewVec), 0.0);
|
||||
spec = pow(spec, 16.0);
|
||||
}
|
||||
|
||||
LightIntensity = 0.7 * diffuse + SpecularContribution * spec;
|
||||
gl_Position = ftransform();
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE MIME-resolver PUBLIC "-//NetBeans//DTD MIME Resolver 1.0//EN" "http://www.netbeans.org/dtds/mime-resolver-1_0.dtd">
|
||||
<MIME-resolver>
|
||||
<file>
|
||||
<ext name="vert"/>
|
||||
<ext name="vertex"/>
|
||||
<ext name="glvert"/>
|
||||
<ext name="glslvert"/>
|
||||
<ext name="glslvertex"/>
|
||||
<ext name="glvertexshader"/>
|
||||
<ext name="glslvertexshader"/>
|
||||
<ext name="glsl-vert"/>
|
||||
<ext name="glsl-vertex"/>
|
||||
<ext name="gl-vertex-shader"/>
|
||||
<ext name="glsl-vertex-shader"/>
|
||||
<resolver mime="text/x-glsl-vertex-shader"/>
|
||||
</file>
|
||||
</MIME-resolver>
|
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE fontscolors PUBLIC "-//NetBeans//DTD Editor Fonts and Colors settings 1.1//EN" "http://www.netbeans.org/dtds/EditorFontsColors-1_1.dtd">
|
||||
<fontscolors>
|
||||
<fontcolor name="glsl-keyword" default="keyword"/>
|
||||
<fontcolor name="glsl-name" default="identifier"/>
|
||||
<fontcolor name="glsl-function" default="identifier">
|
||||
<font style="bold"/>
|
||||
</fontcolor>
|
||||
<fontcolor name="glsl-brace" default="operator"/>
|
||||
<fontcolor name="glsl-value" default="number"/>
|
||||
<fontcolor name="glsl-curly-brace" default="operator"/>
|
||||
<fontcolor name="glsl-string-value" default="default"/>
|
||||
<fontcolor name="glsl-comment" default="comment"/>
|
||||
<fontcolor name="glsl-separator" default="operator"/>
|
||||
<fontcolor name="glsl-whitespace" default="whitespace"/>
|
||||
<fontcolor name="glsl-end-of-line" default="whitespace"/>
|
||||
<fontcolor name="glsl-build-in-var" default="string">
|
||||
<font style="bold"/>
|
||||
</fontcolor>
|
||||
<fontcolor name="glsl-build-in-func" default="identifier">
|
||||
<font style="bold,italic"/>
|
||||
</fontcolor>
|
||||
<fontcolor name="glsl-preprocessor" foreColor="ff6060D0">
|
||||
<font style="bold,italic" />
|
||||
</fontcolor>
|
||||
</fontscolors>
|
After Width: | Height: | Size: 163 B |
After Width: | Height: | Size: 613 B |
@ -0,0 +1,7 @@
|
||||
/*
|
||||
* vertex shader template
|
||||
*/
|
||||
void main() {
|
||||
// Vertex transformation
|
||||
gl_Position = ftransform();
|
||||
}
|
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 346 B |
After Width: | Height: | Size: 432 B |
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* GLSLElementDescriptor.java
|
||||
*
|
||||
* Created on 03.06.2007, 23:03:57
|
||||
*
|
||||
*/
|
||||
package net.java.nboglpack.glsleditor.vocabulary;
|
||||
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlEnum;
|
||||
import javax.xml.bind.annotation.XmlType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Michael Bien
|
||||
*/
|
||||
public class GLSLElementDescriptor {
|
||||
|
||||
@XmlType
|
||||
@XmlEnum(String.class)
|
||||
public enum Category { BUILD_IN_FUNC, BUILD_IN_VAR, USER_FUNC, JUMP, ITERATION, SELECTION, QUALIFIER, TYPE, KEYWORD }
|
||||
|
||||
@XmlElement
|
||||
public final Category category;
|
||||
|
||||
@XmlElement(required = true)
|
||||
public final String tooltip;
|
||||
|
||||
@XmlElement(required = true)
|
||||
public final String doc;
|
||||
|
||||
@XmlElement(required = true)
|
||||
public final String arguments;
|
||||
|
||||
@XmlElement(required = true)
|
||||
public final String type;
|
||||
|
||||
/*bean constructor, fields are directly injected*/
|
||||
public GLSLElementDescriptor() {
|
||||
category = Category.KEYWORD;
|
||||
tooltip = null;
|
||||
doc = null;
|
||||
arguments = null;
|
||||
type = null;
|
||||
}
|
||||
|
||||
public GLSLElementDescriptor(Category category, String tooltip, String doc, String arguments, String type) {
|
||||
this.category = category;
|
||||
this.tooltip = tooltip;
|
||||
this.doc = doc;
|
||||
this.arguments = arguments;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* GLSLVocabulary.java
|
||||
*
|
||||
* Created on 03.06.2007, 23:03:57
|
||||
*
|
||||
*/
|
||||
package net.java.nboglpack.glsleditor.vocabulary;
|
||||
|
||||
import java.util.HashMap;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Michael Bien
|
||||
*/
|
||||
@XmlRootElement
|
||||
public class GLSLVocabulary {
|
||||
|
||||
public final HashMap<String, GLSLElementDescriptor[]> mainVocabulary;
|
||||
public final HashMap<String, GLSLElementDescriptor[]> fragmentShaderVocabulary;
|
||||
public final HashMap<String, GLSLElementDescriptor[]> vertexShaderVocabulary;
|
||||
public final HashMap<String, GLSLElementDescriptor[]> geometryShaderVocabulary;
|
||||
|
||||
|
||||
public GLSLVocabulary() {
|
||||
mainVocabulary = new HashMap<String, GLSLElementDescriptor[]>();
|
||||
vertexShaderVocabulary = new HashMap<String, GLSLElementDescriptor[]>();
|
||||
fragmentShaderVocabulary = new HashMap<String, GLSLElementDescriptor[]>();
|
||||
geometryShaderVocabulary = new HashMap<String, GLSLElementDescriptor[]>();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
GLSLElementDescriptor
|
||||
GLSLVocabulary
|
@ -0,0 +1 @@
|
||||
net.java.nboglpack.glsleditor.GlslGeometryShaderDataLoader
|
@ -51,7 +51,6 @@ disabled.modules=\
|
||||
org.netbeans.modules.jellytools.java,\
|
||||
org.netbeans.modules.jellytools.platform,\
|
||||
org.netbeans.modules.jemmy,\
|
||||
org.netbeans.modules.languages,\
|
||||
org.netbeans.modules.maven,\
|
||||
org.netbeans.modules.maven.coverage,\
|
||||
org.netbeans.modules.maven.embedder,\
|
||||
|
@ -44,6 +44,7 @@ modules=\
|
||||
${project.com.jme3.gde.obfuscate}:\
|
||||
${project.com.jme3.gde.blender}:\
|
||||
${project.com.jme3.gde.angelfont}:\
|
||||
${project.net.java.nboglpack.glsleditor}:\
|
||||
${project.com.jme3.gde.android}
|
||||
project.com.jme3.gde.android=jme3-android
|
||||
project.com.jme3.gde.angelfont=jme3-angelfont
|
||||
@ -51,6 +52,7 @@ project.com.jme3.gde.blender=jme3-blender
|
||||
project.com.jme3.gde.codecheck=jme3-code-check
|
||||
project.com.jme3.gde.customcontrols=jme3-custom-controls
|
||||
project.com.jme3.gde.desktop.executables=jme3-desktop-executables
|
||||
project.net.java.nboglpack.glsleditor=jme3-glsl-support
|
||||
project.com.jme3.gde.assetpack=jme3-assetpack-support
|
||||
project.com.jme3.gde.cinematics=jme3-cinematics
|
||||
project.com.jme3.gde.codepalette=jme3-codepalette
|
||||
|