Skip to content

Commit

Permalink
Embed GL shaders in source; close #444
Browse files Browse the repository at this point in the history
  • Loading branch information
phoboslab committed Dec 27, 2014
1 parent be1a4cd commit 9578789
Show file tree
Hide file tree
Showing 11 changed files with 102 additions and 125 deletions.
34 changes: 2 additions & 32 deletions Ejecta.xcodeproj/project.pbxproj
Expand Up @@ -20,7 +20,6 @@
B607AC33132EA75F00D7C3EA /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B607AC32132EA75F00D7C3EA /* AudioToolbox.framework */; };
B607AD0A132EB51000D7C3EA /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B607AD09132EB51000D7C3EA /* OpenGLES.framework */; };
B607AD10132EB52400D7C3EA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B607AD0F132EB52400D7C3EA /* QuartzCore.framework */; };
B609F2D416AD877E00A3B2B9 /* RadialGradient.fsh in Resources */ = {isa = PBXBuildFile; fileRef = B609F2CE16AD873A00A3B2B9 /* RadialGradient.fsh */; };
B60FA92817021E0900078D20 /* EJBindingVideo.m in Sources */ = {isa = PBXBuildFile; fileRef = B60FA92717021E0900078D20 /* EJBindingVideo.m */; };
B60FA92A1702297C00078D20 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B60FA9291702297C00078D20 /* MediaPlayer.framework */; };
B62436681666851E0046B8C7 /* Ejecta.js in Resources */ = {isa = PBXBuildFile; fileRef = B64CE63F166682700087CF94 /* Ejecta.js */; };
Expand All @@ -33,11 +32,6 @@
B63D256A16E8DF33007E6034 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B63D256916E8DF33007E6034 /* Security.framework */; };
B63D256D16E8E0EE007E6034 /* EJBindingWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = B63D256C16E8DFAB007E6034 /* EJBindingWebSocket.m */; };
B6468006188AB3260087F098 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6468005188AB3260087F098 /* JavaScriptCore.framework */; };
B64C878A16B800DA0097CD5B /* AlphaTexture.fsh in Resources */ = {isa = PBXBuildFile; fileRef = B64C878016B800C10097CD5B /* AlphaTexture.fsh */; };
B64C878B16B800DA0097CD5B /* Flat.fsh in Resources */ = {isa = PBXBuildFile; fileRef = B64C878116B800C10097CD5B /* Flat.fsh */; };
B64C878C16B800DA0097CD5B /* Pattern.fsh in Resources */ = {isa = PBXBuildFile; fileRef = B64C878216B800C10097CD5B /* Pattern.fsh */; };
B64C878D16B800DA0097CD5B /* Texture.fsh in Resources */ = {isa = PBXBuildFile; fileRef = B64C878316B800C10097CD5B /* Texture.fsh */; };
B64C878E16B800DA0097CD5B /* Vertex.vsh in Resources */ = {isa = PBXBuildFile; fileRef = B64C878416B800C10097CD5B /* Vertex.vsh */; };
B64C87AC16B81BAA0097CD5B /* EJGLProgram2D.m in Sources */ = {isa = PBXBuildFile; fileRef = B64C87A816B80F410097CD5B /* EJGLProgram2D.m */; };
B64C87AE16B81BAA0097CD5B /* EJGLProgram2DRadialGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = B64C87AA16B80F4C0097CD5B /* EJGLProgram2DRadialGradient.m */; };
B64CE662166682700087CF94 /* EJAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B64CE611166682700087CF94 /* EJAppViewController.m */; };
Expand Down Expand Up @@ -133,7 +127,6 @@
B607AC32132EA75F00D7C3EA /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
B607AD09132EB51000D7C3EA /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
B607AD0F132EB52400D7C3EA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
B609F2CE16AD873A00A3B2B9 /* RadialGradient.fsh */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = RadialGradient.fsh; sourceTree = "<group>"; };
B60FA92617021E0900078D20 /* EJBindingVideo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EJBindingVideo.h; sourceTree = "<group>"; };
B60FA92717021E0900078D20 /* EJBindingVideo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EJBindingVideo.m; sourceTree = "<group>"; };
B60FA9291702297C00078D20 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };
Expand All @@ -151,11 +144,6 @@
B63D256B16E8DFAB007E6034 /* EJBindingWebSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EJBindingWebSocket.h; sourceTree = "<group>"; };
B63D256C16E8DFAB007E6034 /* EJBindingWebSocket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EJBindingWebSocket.m; sourceTree = "<group>"; };
B6468005188AB3260087F098 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = JavaScriptCore.framework; sourceTree = "<group>"; };
B64C878016B800C10097CD5B /* AlphaTexture.fsh */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = AlphaTexture.fsh; sourceTree = "<group>"; };
B64C878116B800C10097CD5B /* Flat.fsh */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = Flat.fsh; sourceTree = "<group>"; };
B64C878216B800C10097CD5B /* Pattern.fsh */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = Pattern.fsh; sourceTree = "<group>"; };
B64C878316B800C10097CD5B /* Texture.fsh */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = Texture.fsh; sourceTree = "<group>"; };
B64C878416B800C10097CD5B /* Vertex.vsh */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = Vertex.vsh; sourceTree = "<group>"; };
B64C87A716B80F400097CD5B /* EJGLProgram2D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EJGLProgram2D.h; sourceTree = "<group>"; };
B64C87A816B80F410097CD5B /* EJGLProgram2D.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EJGLProgram2D.m; sourceTree = "<group>"; };
B64C87A916B80F450097CD5B /* EJGLProgram2DRadialGradient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EJGLProgram2DRadialGradient.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -210,6 +198,7 @@
B64CE68B166682B10087CF94 /* Icon-72@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72@2x.png"; sourceTree = "<group>"; };
B64CE68C166682B10087CF94 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
B64CE68D166682B10087CF94 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = "<group>"; };
B659D3121A4F6FE300B9AEF9 /* EJCanvasShaders.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EJCanvasShaders.h; sourceTree = "<group>"; };
B65A25C019618E5C00CC1744 /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MainWindow.xib; path = Resources/MainWindow.xib; sourceTree = SOURCE_ROOT; };
B664B9891699F3370093E04E /* EJBindingCanvasPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EJBindingCanvasPattern.h; sourceTree = "<group>"; };
B664B98A1699F3380093E04E /* EJBindingCanvasPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EJBindingCanvasPattern.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -379,19 +368,6 @@
name = Frameworks;
sourceTree = "<group>";
};
B609F2CB16AD873900A3B2B9 /* Shaders */ = {
isa = PBXGroup;
children = (
B64C878016B800C10097CD5B /* AlphaTexture.fsh */,
B64C878116B800C10097CD5B /* Flat.fsh */,
B64C878216B800C10097CD5B /* Pattern.fsh */,
B64C878316B800C10097CD5B /* Texture.fsh */,
B64C878416B800C10097CD5B /* Vertex.vsh */,
B609F2CE16AD873A00A3B2B9 /* RadialGradient.fsh */,
);
path = Shaders;
sourceTree = "<group>";
};
B63D255C16E8DE23007E6034 /* SocketRocket */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -567,7 +543,6 @@
B6F114E91676BD40001F1324 /* 2D */ = {
isa = PBXGroup;
children = (
B609F2CB16AD873900A3B2B9 /* Shaders */,
B6F114EA1676BD40001F1324 /* EJBindingCanvasContext2D.h */,
B6F114EB1676BD40001F1324 /* EJBindingCanvasContext2D.m */,
B6F114EE1676BD40001F1324 /* EJCanvasContext2D.h */,
Expand All @@ -576,6 +551,7 @@
B6F114F11676BD40001F1324 /* EJCanvasContext2DScreen.m */,
B6F114F21676BD40001F1324 /* EJCanvasContext2DTexture.h */,
B6F114F31676BD40001F1324 /* EJCanvasContext2DTexture.m */,
B659D3121A4F6FE300B9AEF9 /* EJCanvasShaders.h */,
B664B9891699F3370093E04E /* EJBindingCanvasPattern.h */,
B664B98A1699F3380093E04E /* EJBindingCanvasPattern.m */,
B664B98C1699F49B0093E04E /* EJCanvasPattern.h */,
Expand Down Expand Up @@ -686,12 +662,6 @@
buildActionMask = 2147483647;
files = (
B65A25C119618E5C00CC1744 /* MainWindow.xib in Resources */,
B64C878A16B800DA0097CD5B /* AlphaTexture.fsh in Resources */,
B64C878B16B800DA0097CD5B /* Flat.fsh in Resources */,
B64C878C16B800DA0097CD5B /* Pattern.fsh in Resources */,
B64C878D16B800DA0097CD5B /* Texture.fsh in Resources */,
B64C878E16B800DA0097CD5B /* Vertex.vsh in Resources */,
B609F2D416AD877E00A3B2B9 /* RadialGradient.fsh in Resources */,
B68C5B95132E6CD60015092E /* App in Resources */,
B637065E1A27BD5600F42B90 /* LaunchScreen.xib in Resources */,
B64CE695166682B10087CF94 /* Icon-72.png in Resources */,
Expand Down
91 changes: 91 additions & 0 deletions Source/Ejecta/EJCanvas/2D/EJCanvasShaders.h
@@ -0,0 +1,91 @@
#define EJ_SHADER_SOURCE(NAME, ...) const char * const NAME = #__VA_ARGS__;

EJ_SHADER_SOURCE(EJShaderVertex,
attribute vec2 pos;
attribute vec2 uv;
attribute vec4 color;

varying lowp vec4 vColor;
varying highp vec2 vUv;

uniform highp vec2 screen;

void main() {
vColor = color;
vUv = uv;

gl_Position = vec4(pos * (vec2(2,2)/screen) - clamp(screen,-1.0,1.0), 0.0, 1.0);
}
);

EJ_SHADER_SOURCE(EJShaderAlphaTexture,
varying lowp vec4 vColor;
varying highp vec2 vUv;

uniform sampler2D texture;

void main() {
gl_FragColor = texture2D(texture, vUv).aaaa * vColor;
}
);

EJ_SHADER_SOURCE(EJShaderFlat,
varying lowp vec4 vColor;
varying highp vec2 vUv;

void main() {
gl_FragColor = vColor;
}
);

EJ_SHADER_SOURCE(EJShaderPattern,
varying lowp vec4 vColor;
varying highp vec2 vUv;

uniform sampler2D texture;

void main() {
gl_FragColor = texture2D(texture, mod(vUv, vec2(1.0, 1.0)) ) * vColor;
}
);

EJ_SHADER_SOURCE(EJShaderTexture,
varying lowp vec4 vColor;
varying highp vec2 vUv;

uniform sampler2D texture;

void main() {
gl_FragColor = texture2D(texture, vUv) * vColor;
}
);

EJ_SHADER_SOURCE(EJShaderRadialGradient,
precision highp float;

varying highp vec2 vUv;
varying lowp vec4 vColor;

uniform mediump vec3 inner; // x, y, z=radius
uniform mediump vec3 diff; // x, y, z=radius

uniform sampler2D texture;

void main() {
vec2 p2 = vUv - inner.xy;

float A = dot(diff.xy, diff.xy) - diff.z * diff.z;
float B = dot(p2.xy, diff.xy) + inner.z * diff.z;
float C = dot(p2, p2) - (inner.z * inner.z);
float D = (B * B) - (A * C);

float DA = sqrt(D) / A;
float BA = B / A;

float t = max(BA+DA, BA-DA);

lowp float keep = sign(diff.z * t + inner.z); // discard if < 0.0
gl_FragColor = texture2D(texture, vec2(t, 0.0)) * vColor * keep;
}
);

5 changes: 2 additions & 3 deletions Source/Ejecta/EJCanvas/2D/EJGLProgram2D.h
Expand Up @@ -15,12 +15,11 @@ enum {
GLuint screen;
}

- (id)initWithVertexShader:(NSString *)vertexShaderFile fragmentShader:(NSString *)fragmentShaderFile;
- (id)initWithVertexShader:(const char *)vertexShaderSource fragmentShader:(const char *)fragmentShaderSource;
- (void)bindAttributeLocations;
- (void)getUniforms;

+ (GLint)compileShaderFile:(NSString *)file type:(GLenum)type;
+ (GLint)compileShaderSource:(NSString *)source type:(GLenum)type;
+ (GLint)compileShaderSource:(const char *)source type:(GLenum)type;
+ (void)linkProgram:(GLuint)program;

@property (nonatomic, readonly) GLuint program;
Expand Down
23 changes: 5 additions & 18 deletions Source/Ejecta/EJCanvas/2D/EJGLProgram2D.m
Expand Up @@ -5,11 +5,11 @@ @implementation EJGLProgram2D
@synthesize program;
@synthesize screen;

- (id)initWithVertexShader:(NSString *)vertexShaderFile fragmentShader:(NSString *)fragmentShaderFile {
- (id)initWithVertexShader:(const char *)vertexShaderSource fragmentShader:(const char *)fragmentShaderSource {
if( self = [super init] ) {
program = glCreateProgram();
GLuint vertexShader = [EJGLProgram2D compileShaderFile:vertexShaderFile type:GL_VERTEX_SHADER];
GLuint fragmentShader = [EJGLProgram2D compileShaderFile:fragmentShaderFile type:GL_FRAGMENT_SHADER];
GLuint vertexShader = [EJGLProgram2D compileShaderSource:vertexShaderSource type:GL_VERTEX_SHADER];
GLuint fragmentShader = [EJGLProgram2D compileShaderSource:fragmentShaderSource type:GL_FRAGMENT_SHADER];

glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
Expand Down Expand Up @@ -44,22 +44,9 @@ - (void)getUniforms {
screen = glGetUniformLocation(program, "screen");
}

+ (GLint)compileShaderFile:(NSString *)file type:(GLenum)type {
NSString *path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], file];
NSString *source = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
if( !source ) {
NSLog(@"Failed to load shader file %@", file);
return 0;
}

return [EJGLProgram2D compileShaderSource:source type:type];
}

+ (GLint)compileShaderSource:(NSString *)source type:(GLenum)type {
const GLchar *glsource = (GLchar *)[source UTF8String];

+ (GLint)compileShaderSource:(const char *)source type:(GLenum)type {
GLint shader = glCreateShader(type);
glShaderSource(shader, 1, &glsource, NULL);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);

GLint status;
Expand Down
8 changes: 0 additions & 8 deletions Source/Ejecta/EJCanvas/2D/Shaders/AlphaTexture.fsh

This file was deleted.

6 changes: 0 additions & 6 deletions Source/Ejecta/EJCanvas/2D/Shaders/Flat.fsh

This file was deleted.

8 changes: 0 additions & 8 deletions Source/Ejecta/EJCanvas/2D/Shaders/Pattern.fsh

This file was deleted.

26 changes: 0 additions & 26 deletions Source/Ejecta/EJCanvas/2D/Shaders/RadialGradient.fsh

This file was deleted.

8 changes: 0 additions & 8 deletions Source/Ejecta/EJCanvas/2D/Shaders/Texture.fsh

This file was deleted.

15 changes: 0 additions & 15 deletions Source/Ejecta/EJCanvas/2D/Shaders/Vertex.vsh

This file was deleted.

3 changes: 2 additions & 1 deletion Source/Ejecta/EJSharedOpenGLContext.m
@@ -1,4 +1,5 @@
#import "EJSharedOpenGLContext.h"
#import "EJCanvas/2D/EJCanvasShaders.h"

@implementation EJSharedOpenGLContext

Expand Down Expand Up @@ -51,7 +52,7 @@ - (NSMutableData *)vertexBuffer {
#define EJ_GL_PROGRAM_GETTER(TYPE, NAME) \
- (TYPE *)glProgram2D##NAME { \
if( !glProgram2D##NAME ) { \
glProgram2D##NAME = [[TYPE alloc] initWithVertexShader:@"Vertex.vsh" fragmentShader: @ #NAME @".fsh"]; \
glProgram2D##NAME = [[TYPE alloc] initWithVertexShader:EJShaderVertex fragmentShader:EJShader##NAME]; \
} \
return glProgram2D##NAME; \
}
Expand Down

0 comments on commit 9578789

Please sign in to comment.