GLShadersRegistry.m 1.95 KB
Newer Older
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
1 2 3 4 5 6 7
#import <UIKit/UIKit.h>

#import "RCTBridgeModule.h"
#import "RCTConvert.h"
#import "RCTLog.h"
#import "GLShadersRegistry.h"

8
// FIXME: current context and fbos live here... this should be global somewhere else.
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
9 10 11 12 13

@implementation GLShadersRegistry
{
  NSMutableDictionary *_shaders;
  EAGLContext *_context;
14
  NSMutableDictionary *_fbos;
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
15 16 17 18 19 20
}

GLShadersRegistry *GLShadersRegistry_instance; // FIXME is that the proper way to do singleton?

RCT_EXPORT_MODULE();

21
+ (GLShader*) getShader: (NSNumber *)id
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
22
{
23
  return [GLShadersRegistry_instance getShader:id];
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
24 25
}

26 27 28 29 30 31 32 33 34 35 36 37
+ (GLFBO *) getFBO: (NSNumber *)id
{
  return [GLShadersRegistry_instance getFBO:id];
}

+ (EAGLContext *) getContext
{
  return [GLShadersRegistry_instance getContext];
}

// methods

Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
38 39 40 41 42
- (instancetype)init
{
  self = [super init];
  if (self) {
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
43
    
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
44 45 46 47
    if (!_context) {
      RCTLogError(@"Failed to initialize OpenGLES 2.0 context");
    }
    _shaders = @{}.mutableCopy;
48
    _fbos = @{}.mutableCopy;
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
49 50 51 52 53
    GLShadersRegistry_instance = self;
  }
  return self;
}

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
- (GLShader *) getShader: (NSNumber *)id
{
  return _shaders[id];
}

- (GLFBO *) getFBO: (NSNumber *)id
{
  GLFBO *fbo = _fbos[id];
  if (!fbo) {
    fbo = [[GLFBO alloc] init];
    _fbos[id] = fbo;
  }
  return fbo;
}

- (EAGLContext *) getContext
{
  return _context;
}

Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
74 75
static NSString* fullViewportVert = @"attribute vec2 position;varying vec2 uv;void main() {gl_Position = vec4(position,0.0,1.0);uv = vec2(0.5, 0.5) * (position+vec2(1.0, 1.0));}";

76
RCT_EXPORT_METHOD(register:(nonnull NSNumber *)id withConfig:(NSDictionary *)config) {
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
77
  NSString *frag = [RCTConvert NSString:config[@"frag"]];
78
  NSString *name = [RCTConvert NSString:config[@"name"]];
79 80 81 82 83
  if (!frag) {
    RCTLogError(@"Shader '%@': missing frag field", name);
    return;
  }
  GLShader *shader = [[GLShader alloc] initWithContext:_context withName:name withVert:fullViewportVert withFrag:frag];
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
84 85 86 87
  _shaders[id] = shader;
}

@end