mirror of
https://github.com/lxsang/Diya-API.git
synced 2024-12-26 03:18:22 +01:00
WIP: display Freetype font in openGL
This commit is contained in:
parent
6808a3aa0b
commit
d80f31bd42
14
Diya/Array2D.extension.st
Normal file
14
Diya/Array2D.extension.st
Normal file
@ -0,0 +1,14 @@
|
||||
Extension { #name : #Array2D }
|
||||
|
||||
{ #category : #'*Diya' }
|
||||
Array2D >> asGLBuffer [
|
||||
|buffer i|
|
||||
i := 1.
|
||||
buffer := FFIExternalArray externalNewType: #float size: self size.
|
||||
self asArray do:[:e|
|
||||
buffer at:i put:e.
|
||||
i := i+1
|
||||
].
|
||||
buffer autoRelease.
|
||||
^buffer
|
||||
]
|
@ -4,6 +4,15 @@ Class {
|
||||
#category : #'Diya-Graphics'
|
||||
}
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
Diya2DNode >> gltf: points [
|
||||
^ points collect: [ :point | |coord|
|
||||
coord := self tf +* { point x. point y. 1.0 }.
|
||||
coord at:3 put: 0.0.
|
||||
coord
|
||||
]
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
Diya2DNode >> initialize [
|
||||
super initialize.
|
||||
|
@ -66,6 +66,7 @@ DiyaBoot >> init [
|
||||
display := SDL_DisplayMode externalNew autoRelease.
|
||||
SDL2 SDLGetCurrentDisplayMode: display from:0.
|
||||
DiyaRendererContext reset.
|
||||
DiyaFontManager uniqueInstance loadFonts.
|
||||
]
|
||||
|
||||
{ #category : #events }
|
||||
@ -99,14 +100,16 @@ DiyaBoot >> randomColorChannel [
|
||||
|
||||
{ #category : #events }
|
||||
DiyaBoot >> render [
|
||||
|event root rec|
|
||||
|event root rec text|
|
||||
event := SDL_Event new.
|
||||
root := DiyaRootNode new.
|
||||
DiyaRenderer uniqueInstance root: root.
|
||||
rec := root addNode: (DiyaRectangle size: 120@160 shader: GLSimpleShader uniqueInstance) at: 120 @ 160.
|
||||
rec rotation: (Float pi / -8.0).
|
||||
rec scale: 1.5@1.5.
|
||||
text := root addNode: (DiyaText data: 'Hello,world' shader: GLTexShader uniqueInstance) at: 0@0.
|
||||
OpenGL viewportX: 0 Y:0 W: display w H: display h.
|
||||
"TODO: maybe give node to customize this"
|
||||
[ running ] whileTrue: [
|
||||
(SDL2 pollEvent: event) > 0 ifTrue: [
|
||||
self processEvent: event
|
||||
@ -197,7 +200,7 @@ DiyaBoot >> startx [
|
||||
self createGLContext.
|
||||
self createRenderer.
|
||||
self showSystemInfo.
|
||||
DiyaRendererContext uniqueInstance display: display.
|
||||
DiyaRendererContext uniqueInstance display: display; useProjection: OrthoProjectionMatrix.
|
||||
self render.
|
||||
context delete.
|
||||
renderer destroy.
|
||||
|
@ -1,37 +0,0 @@
|
||||
Class {
|
||||
#name : #DiyaComposableNode,
|
||||
#superclass : #DiyaNode,
|
||||
#instVars : [
|
||||
'children'
|
||||
],
|
||||
#category : #'Diya-Graphics'
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaComposableNode >> addNode: node [
|
||||
^self addNode: node at: 0@0
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaComposableNode >> addNode: node at: pos [
|
||||
node parent: self.
|
||||
node position: pos.
|
||||
children add: node.
|
||||
^ node
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaComposableNode >> children [
|
||||
^ children
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
DiyaComposableNode >> initialize [
|
||||
super initialize.
|
||||
children := OrderedCollection new.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaComposableNode >> render [
|
||||
children do: [:c | c render ].
|
||||
]
|
@ -16,13 +16,3 @@ void main()
|
||||
}
|
||||
'
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaDefaultShader class >> vertextShader [
|
||||
^ '
|
||||
void main()
|
||||
{
|
||||
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
}
|
||||
'
|
||||
]
|
||||
|
@ -4,6 +4,7 @@ Class {
|
||||
#instVars : [
|
||||
'translation',
|
||||
'parent',
|
||||
'children',
|
||||
'scale',
|
||||
'rotation',
|
||||
'tf',
|
||||
@ -22,12 +23,47 @@ DiyaNode class >> with: shader [
|
||||
^self new shader: shader; yourself
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> addNode: node [
|
||||
^self addNode: node at: 0@0
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> addNode: node at: pos [
|
||||
children ifNil: [ ^self ].
|
||||
node parent: self.
|
||||
node position: pos.
|
||||
children add: node.
|
||||
^ node
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> boundingBox [
|
||||
^ self subclassResponsibility
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> children [
|
||||
^children
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> draw [
|
||||
self subclassResponsibility
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
DiyaNode >> gltf: points [
|
||||
^self subclassResponsibility
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
DiyaNode >> initialize [
|
||||
super initialize.
|
||||
parent := nil.
|
||||
shader := DiyaDefaultShader uniqueInstance.
|
||||
shader := nil.
|
||||
context := DiyaRendererContext uniqueInstance.
|
||||
children := OrderedCollection new.
|
||||
]
|
||||
|
||||
{ #category : #testing }
|
||||
@ -58,7 +94,9 @@ DiyaNode >> position: anObject [
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> render [
|
||||
^self subclassResponsibility
|
||||
self draw.
|
||||
children ifNil: [ ^self ].
|
||||
children do: [:c | c render ].
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
@ -85,6 +123,9 @@ DiyaNode >> scale: anObject [
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaNode >> shader [
|
||||
shader ifNil: [
|
||||
parent ifNil: [ ^nil ].
|
||||
^parent shader ].
|
||||
^ shader
|
||||
]
|
||||
|
||||
|
@ -18,22 +18,13 @@ DiyaRectangle class >> size: size shader:s [
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> initialize [
|
||||
super initialize.
|
||||
self size:10@10.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> render [
|
||||
|buffer|
|
||||
buffer := FFIExternalArray externalNewType: GLfloat size: 12.
|
||||
DiyaRectangle >> draw [
|
||||
self transformDo:[:i :e|
|
||||
buffer at:i put:e
|
||||
context buffer at:i put:e
|
||||
].
|
||||
context vbo bind: GL_ARRAY_BUFFER.
|
||||
context vbo data: GL_ARRAY_BUFFER data:buffer usage: GL_STATIC_DRAW.
|
||||
shader use.
|
||||
shader setUniform: #u_time value: DiyaClock uniqueInstance elapsedTime asFloat.
|
||||
shader setUniform: #u_projection value: context projection buffer.
|
||||
shader setUniform: #u_resolution value: { context resolution x. context resolution y }.
|
||||
context mouse ifNotNil: [
|
||||
"in shader, window origin is bottom left conor of the window
|
||||
@ -42,10 +33,18 @@ DiyaRectangle >> render [
|
||||
].
|
||||
context vao enableAttribute: 0.
|
||||
context vbo bind: GL_ARRAY_BUFFER.
|
||||
OpenGLVertexArray vertexAttributePointerIndex: 0 size:3 type: GL_FLOAT normalized: GL_FALSE stride: 0 pointer: nil .
|
||||
OpenGLVertexArray vertexAttributePointerIndex: 0 size:3 type: GL_FLOAT normalized: GL_FALSE stride: 12 pointer: nil.
|
||||
context vbo subData: GL_ARRAY_BUFFER offset:0 data: context buffer.
|
||||
OpenGL drawArrays: GL_QUADS first:0 count: 4.
|
||||
context vao disableAttribute: 0.
|
||||
buffer free.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> initialize [
|
||||
super initialize.
|
||||
self size:10@10.
|
||||
translation := nil.
|
||||
children := nil
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
@ -58,25 +57,11 @@ DiyaRectangle >> size: anObject [
|
||||
size := anObject.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> transform [
|
||||
|origin topleft topright bottomright|
|
||||
origin := (self tf +* #(0.0 0.0 1.0)) asPoint asGLCoord.
|
||||
topleft := (self tf +* { 0.0. size y.1.0 }) asPoint asGLCoord.
|
||||
topright := (self tf +* { size x. size y.1.0 }) asPoint asGLCoord.
|
||||
bottomright := (self tf +* { size x. 0.0. 1.0 }) asPoint asGLCoord.
|
||||
^
|
||||
{
|
||||
origin x. origin y. 0.0.
|
||||
topleft x. topleft y. 0.0.
|
||||
topright x. topright y. 0.0.
|
||||
bottomright x. bottomright y. 0.0.
|
||||
}
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> transformDo: block [
|
||||
|i|
|
||||
i := 1.
|
||||
self transform do:[:e| block value:i value:e. i := i+1].
|
||||
(self gltf: { 0.0@0.0. 0.0@ (size y). size. (size x) @0. }) do:[:p|
|
||||
p do: [ :e|
|
||||
block value:i value:e. i := i+1]].
|
||||
]
|
||||
|
@ -5,7 +5,10 @@ Class {
|
||||
'mouse',
|
||||
'display',
|
||||
'vbo',
|
||||
'vao'
|
||||
'vao',
|
||||
'texture0',
|
||||
'projection',
|
||||
'buffer'
|
||||
],
|
||||
#pools : [
|
||||
'OpenGLConstants',
|
||||
@ -19,10 +22,16 @@ DiyaRendererContext class >> cleanUpInstance: singleton [
|
||||
singleton destroy
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRendererContext >> buffer [
|
||||
^ buffer
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRendererContext >> destroy [
|
||||
vao delete.
|
||||
vbo delete.
|
||||
texture0 delete.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
@ -40,8 +49,14 @@ DiyaRendererContext >> initialize [
|
||||
super initialize.
|
||||
vbo := OpenGLVertexBuffer new.
|
||||
vao := OpenGLVertexArray new.
|
||||
texture0 := OpenGLTexture fromUnit: 0.
|
||||
vao bind.
|
||||
vbo bind: GL_ARRAY_BUFFER.
|
||||
projection := Array2D identity: 4.
|
||||
buffer := FFIExternalArray externalNewType: GLfloat size: 128.
|
||||
buffer autoRelease.
|
||||
vbo data: GL_ARRAY_BUFFER data: nil size:512 usage: GL_DYNAMIC_DRAW.
|
||||
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
@ -54,11 +69,26 @@ DiyaRendererContext >> mouse: anObject [
|
||||
mouse := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRendererContext >> projection [
|
||||
^ projection
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
DiyaRendererContext >> resolution [
|
||||
^ (display w) @ (display h)
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRendererContext >> texture0 [
|
||||
^ texture0
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
DiyaRendererContext >> useProjection: aClass [
|
||||
projection := aClass fromDisplay: self display
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRendererContext >> vao [
|
||||
^ vao
|
||||
|
@ -1,13 +1,20 @@
|
||||
Class {
|
||||
#name : #DiyaRootNode,
|
||||
#superclass : #DiyaComposableNode,
|
||||
#superclass : #DiyaNode,
|
||||
#category : #'Diya-Graphics'
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRootNode >> draw [
|
||||
OpenGL clearColorR: 1.0 G: 0.0 B: 1.0 A:0.
|
||||
OpenGL clear: GL_COLOR_BUFFER_BIT.
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
DiyaRootNode >> initialize [
|
||||
super initialize.
|
||||
parent := self.
|
||||
shader := DiyaDefaultShader uniqueInstance.
|
||||
]
|
||||
|
||||
{ #category : #testing }
|
||||
@ -15,15 +22,6 @@ DiyaRootNode >> isRoot [
|
||||
^ true
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRootNode >> render [
|
||||
OpenGL clearColorR: 1.0 G: 0 B: 1.0 A:0.
|
||||
OpenGL clear: GL_COLOR_BUFFER_BIT.
|
||||
"render all child node"
|
||||
children do: [:c | c render ].
|
||||
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRootNode >> updateTF [
|
||||
"donothing"
|
||||
|
@ -4,11 +4,25 @@ Class {
|
||||
#instVars : [
|
||||
'fontStyle',
|
||||
'fontSize',
|
||||
'fontName',
|
||||
'data'
|
||||
],
|
||||
#pools : [
|
||||
'FT2Types'
|
||||
],
|
||||
#category : #'Diya-Graphics'
|
||||
}
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
DiyaText class >> data: string [
|
||||
^ (self new) data: string; yourself
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
DiyaText class >> data: string shader: s [
|
||||
^ (self with:s) data: string; yourself
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> data [
|
||||
^ data
|
||||
@ -19,6 +33,88 @@ DiyaText >> data: anObject [
|
||||
data := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> draw [
|
||||
|face offset|
|
||||
data ifNil: [ ^self ].
|
||||
offset := 50.0@50.0.
|
||||
OpenGL enable: GL_CULL_FACE.
|
||||
OpenGL enable: GL_BLEND.
|
||||
OpenGL blendFnWithSfactor: GL_SRC_ALPHA dfactor: GL_ONE_MINUS_SRC_ALPHA.
|
||||
self shader use.
|
||||
shader setUniform: #u_time value: DiyaClock uniqueInstance elapsedTime asFloat.
|
||||
shader setUniform: #u_projection value: context projection buffer.
|
||||
shader setUniform: #u_resolution value: { context resolution x. context resolution y }.
|
||||
face := DiyaFontManager uniqueInstance face: self fontStyle from: self fontName.
|
||||
"set fontsize"
|
||||
face setPixelWidth:0 height: self fontSize.
|
||||
OpenGL pixelstorei: GL_UNPACK_ALIGNMENT param: 1.
|
||||
"configure vao vbo for texture QUAD"
|
||||
context vao enableAttribute: 0.
|
||||
OpenGLVertexArray vertexAttributePointerIndex: 0 size:4 type: GL_FLOAT normalized: GL_FALSE stride: 16 pointer: nil .
|
||||
data do:[:c | self drawCharacter: c at: offset with: face].
|
||||
context vao disableAttribute: 0.
|
||||
"reset value"
|
||||
OpenGL pixelstorei: GL_UNPACK_ALIGNMENT param: 4.
|
||||
OpenGLTexture bind: GL_TEXTURE_2D texture: 0.
|
||||
OpenGL disable: GL_CULL_FACE.
|
||||
OpenGL disable: GL_BLEND.
|
||||
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> drawCharacter: c at: offset with: face [
|
||||
|tex2D|
|
||||
face loadCharacter: c asciiValue flags: (1 << 2) "FT_LOAD_RENDER".
|
||||
tex2D := OpenGLTexImage2D new target: GL_TEXTURE_2D;
|
||||
level: 0;
|
||||
internalFormat: GL_RED;
|
||||
width: face glyph width;
|
||||
height: face glyph height;
|
||||
border: 0;
|
||||
format: GL_RED;
|
||||
type: GL_UNSIGNED_BYTE;
|
||||
data: (FTFaceRec fromHandle: face getHandle) glyph bitmap buffer;
|
||||
yourself.
|
||||
context texture0 setImage2D: tex2D.
|
||||
OpenGLTexture parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_WRAP_S param: GL_CLAMP_TO_EDGE.
|
||||
OpenGLTexture parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_WRAP_T param: GL_CLAMP_TO_EDGE.
|
||||
OpenGLTexture parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_MIN_FILTER param: GL_LINEAR.
|
||||
OpenGLTexture parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_MAG_FILTER param: GL_LINEAR.
|
||||
"fill the buffer"
|
||||
self fillVerticesBuffer: context buffer at: offset with: face.
|
||||
context vbo subData: GL_ARRAY_BUFFER offset:0 data: context buffer.
|
||||
OpenGL drawArrays: GL_TRIANGLES first:0 count:6.
|
||||
offset setX: (offset x + ((face glyph advanceX )* (self scale x)) ) setY: offset y.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> fillVerticesBuffer: buffer at: offset with: face [
|
||||
|x y w h i|
|
||||
x := offset x + ((face glyph hBearingX )*(self scale x)).
|
||||
y := offset y - (((face glyph height) - (face glyph hBearingY))*(self scale y)).
|
||||
w := (face glyph width)*(self scale x).
|
||||
h := (face glyph height)*(self scale y).
|
||||
i := 1.
|
||||
{x. y + h. 0.0. 0.0.
|
||||
x. y. 0.0. 1.0.
|
||||
x + w. y. 1.0. 1.0.
|
||||
x. y + h. 0.0. 0.0.
|
||||
x + w. y. 1.0. 1.0.
|
||||
x + w. y + h. 1.0. 0.0. }
|
||||
do: [ :e| buffer at:i put:e. i := i+1 ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> fontName [
|
||||
^ fontName
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> fontName: anObject [
|
||||
fontName := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> fontSize [
|
||||
^ fontSize
|
||||
@ -42,7 +138,8 @@ DiyaText >> fontStyle: anObject [
|
||||
{ #category : #initialization }
|
||||
DiyaText >> initialize [
|
||||
super initialize.
|
||||
fontStyle := DiyaFontManager uniqueInstance face: 'Regular' from:'Ubuntu'.
|
||||
fontSize := 12.
|
||||
fontStyle := 'Regular'.
|
||||
fontName := 'Ubuntu'.
|
||||
fontSize := 20.
|
||||
data := nil.
|
||||
]
|
||||
|
@ -22,16 +22,3 @@ void main()
|
||||
}
|
||||
'
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
GLSimpleShader class >> vertextShader [
|
||||
^ '
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
void main()
|
||||
{
|
||||
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
}
|
||||
'
|
||||
]
|
||||
|
23
Diya/GLTexShader.class.st
Normal file
23
Diya/GLTexShader.class.st
Normal file
@ -0,0 +1,23 @@
|
||||
Class {
|
||||
#name : #GLTexShader,
|
||||
#superclass : #OpenGLSL,
|
||||
#category : #'Diya-Shaders'
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
GLTexShader class >> fragmentShader [
|
||||
^ '
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
uniform sampler2D u_texture;
|
||||
uniform vec2 u_resolution;
|
||||
|
||||
void main(){
|
||||
//vec2 uv = gl_FragCoord.xy / u_resolution;
|
||||
vec4 sampled = vec4(1.0, 1.0, 1.0, texture2D(u_texture,gl_FragCoord.zw).r);
|
||||
gl_FragColor = vec4(1.0,1.0,1.0,1.0)* sampled; //texture2D(u_texture,uv.xy);
|
||||
}
|
||||
|
||||
'
|
||||
]
|
@ -13,6 +13,16 @@ OpenGL class >> begin: mode [
|
||||
^ self ffiCall: #(void glBegin(GLenum mode))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGL class >> blendFnOn:buf sfactor: sfactor dfactor: dfactor [
|
||||
^ self ffiCall: #(void glBlendFunci( GLuint buf,GLenum sfactor,GLenum dfactor))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGL class >> blendFnWithSfactor: sfactor dfactor: dfactor [
|
||||
^ self ffiCall: #(void glBlendFunc( GLenum sfactor,GLenum dfactor))
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGL class >> checkSymbol [
|
||||
^#glDrawArrays
|
||||
@ -33,11 +43,21 @@ OpenGL class >> color3fR: red G: green B: blue [
|
||||
^self ffiCall: #(void glColor3f(GLfloat red,GLfloat green,GLfloat blue))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGL class >> disable: cap [
|
||||
^ self ffiCall: #(void glDisable( GLenum cap))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGL class >> drawArrays: mode first: idx count:n [
|
||||
^self ffiCall: #(void glDrawArrays(GLenum mode,GLint idx,GLsizei n))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGL class >> enable: cap [
|
||||
^ self ffiCall: #(void glEnable( GLenum cap))
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGL class >> end [
|
||||
^ self ffiCall: #(void glEnd( void ))
|
||||
@ -53,6 +73,11 @@ OpenGL class >> libNames [
|
||||
^#('libGL.so.1')
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGL class >> pixelstorei: pname param: param [
|
||||
^self ffiCall: #(void glPixelStorei( GLenum pname,GLint param))
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGL class >> vertex3fX:x Y:y Z:z [
|
||||
^self ffiCall: #(void glVertex3f( GLfloat x,GLfloat y,GLfloat z))
|
||||
|
@ -7,13 +7,18 @@ Class {
|
||||
'GL_ACTIVE_ATTRIBUTE_MAX_LENGTH',
|
||||
'GL_ACTIVE_UNIFORMS',
|
||||
'GL_ACTIVE_UNIFORM_MAX_LENGTH',
|
||||
'GL_ALPHA',
|
||||
'GL_ARRAY_BUFFER',
|
||||
'GL_ARRAY_BUFFER_BINDING',
|
||||
'GL_ATTACHED_SHADERS',
|
||||
'GL_BLEND',
|
||||
'GL_BLUE',
|
||||
'GL_BYTE',
|
||||
'GL_CLAMP_TO_EDGE',
|
||||
'GL_COLOR_BUFFER_BIT',
|
||||
'GL_COMPILE_STATUS',
|
||||
'GL_COMPUTE_SHADER',
|
||||
'GL_CULL_FACE',
|
||||
'GL_DELETE_STATUS',
|
||||
'GL_DEPTH_BUFFER_BIT',
|
||||
'GL_DOUBLE',
|
||||
@ -23,31 +28,44 @@ Class {
|
||||
'GL_FLOAT',
|
||||
'GL_FRAGMENT_SHADER',
|
||||
'GL_GEOMETRY_SHADER',
|
||||
'GL_GREEN',
|
||||
'GL_HALF_FLOAT',
|
||||
'GL_INFO_LOG_LENGTH',
|
||||
'GL_INT',
|
||||
'GL_INT_2_10_10_10_REV',
|
||||
'GL_LINEAR',
|
||||
'GL_LINES',
|
||||
'GL_LINE_LOOP',
|
||||
'GL_LINE_STRIP',
|
||||
'GL_LINK_STATUS',
|
||||
'GL_ONE_MINUS_SRC_ALPHA',
|
||||
'GL_PACK_ALIGNMENT',
|
||||
'GL_POINTS',
|
||||
'GL_POLYGON',
|
||||
'GL_QUADS',
|
||||
'GL_QUAD_STRIP',
|
||||
'GL_RED',
|
||||
'GL_SHADER_SOURCE_LENGTH',
|
||||
'GL_SHADER_TYPE',
|
||||
'GL_SHORT',
|
||||
'GL_SRC_ALPHA',
|
||||
'GL_STATIC_DRAW',
|
||||
'GL_STENCIL_BUFFER_BIT',
|
||||
'GL_TESS_CONTROL_SHADER',
|
||||
'GL_TESS_EVALUATION_SHADER',
|
||||
'GL_TEXTURE_2D',
|
||||
'GL_TEXTURE_BUFFER',
|
||||
'GL_TEXTURE_MAG_FILTER',
|
||||
'GL_TEXTURE_MIN_FILTER',
|
||||
'GL_TEXTURE_UNIT_BASE',
|
||||
'GL_TEXTURE_WRAP_S',
|
||||
'GL_TEXTURE_WRAP_T',
|
||||
'GL_TRIANGLES',
|
||||
'GL_TRIANGLE_FAN',
|
||||
'GL_TRIANGLE_STRIP',
|
||||
'GL_TRUE',
|
||||
'GL_UNIFORM_BUFFER',
|
||||
'GL_UNPACK_ALIGNMENT',
|
||||
'GL_UNSIGNED_BYTE',
|
||||
'GL_UNSIGNED_INT',
|
||||
'GL_UNSIGNED_INT_10F_11F_11F_REV',
|
||||
@ -81,7 +99,11 @@ OpenGLConstants class >> initCommonConstants [
|
||||
GL_DYNAMIC_DRAW := 16r88E8.
|
||||
GL_FALSE := 0.
|
||||
GL_TRUE := 1.
|
||||
GL_ARRAY_BUFFER_BINDING := 16r8894
|
||||
GL_ARRAY_BUFFER_BINDING := 16r8894.
|
||||
GL_RED := 16r1903.
|
||||
GL_BLUE := 16r1905.
|
||||
GL_GREEN := 16r1904.
|
||||
GL_ALPHA := 16r1903.
|
||||
]
|
||||
|
||||
{ #category : #'class initialization' }
|
||||
@ -104,6 +126,12 @@ OpenGLConstants class >> initCommonMode [
|
||||
GL_QUADS := 16r0007.
|
||||
GL_QUAD_STRIP := 16r0008.
|
||||
GL_POLYGON := 16r0009.
|
||||
GL_BLEND := 16r0BE2.
|
||||
GL_SRC_ALPHA := 16r0302.
|
||||
GL_ONE_MINUS_SRC_ALPHA := 16r0303.
|
||||
GL_CULL_FACE := 16r0B44.
|
||||
GL_PACK_ALIGNMENT := 16r0D05.
|
||||
GL_UNPACK_ALIGNMENT := 16r0CF5
|
||||
]
|
||||
|
||||
{ #category : #'class initialization' }
|
||||
@ -128,10 +156,24 @@ OpenGLConstants class >> initCommonShader [
|
||||
GL_ACTIVE_UNIFORM_MAX_LENGTH := 16r8B87.
|
||||
]
|
||||
|
||||
{ #category : #'class initialization' }
|
||||
OpenGLConstants class >> initTextureConstants [
|
||||
GL_TEXTURE_WRAP_S := 16r2802.
|
||||
GL_TEXTURE_2D := 16r0DE1.
|
||||
GL_CLAMP_TO_EDGE := 16r812F.
|
||||
GL_TEXTURE_WRAP_T := 16r2803.
|
||||
GL_TEXTURE_MIN_FILTER := 16r2801.
|
||||
GL_TEXTURE_MAG_FILTER := 16r2800.
|
||||
GL_LINEAR := 16r2601.
|
||||
GL_TEXTURE_UNIT_BASE := 16r84C0.
|
||||
|
||||
]
|
||||
|
||||
{ #category : #'class initialization' }
|
||||
OpenGLConstants class >> initialize [
|
||||
self initCommonMode.
|
||||
self initCommonMask.
|
||||
self initCommonShader.
|
||||
self initCommonConstants
|
||||
self initCommonConstants.
|
||||
self initTextureConstants.
|
||||
]
|
||||
|
@ -103,8 +103,17 @@ OpenGLSL class >> useProgram:program [
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLSL class >> vertextShader [
|
||||
^ self subclassResponsibility
|
||||
OpenGLSL class >> vertexShader [
|
||||
^ '
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
uniform mat4 u_projection;
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_projection * vec4(gl_Vertex.xy, 0, 1);
|
||||
}
|
||||
'
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
@ -165,7 +174,7 @@ OpenGLSL >> compileFragmentShader:fragmentShaderID [
|
||||
|
||||
{ #category : #compiling }
|
||||
OpenGLSL >> compileVertexShader: vertexShaderID [
|
||||
self getSourcePtr:self class vertextShader for: vertexShaderID.
|
||||
self getSourcePtr:self class vertexShader for: vertexShaderID.
|
||||
OpenGLSL compileShader: vertexShaderID.
|
||||
self checkStatus:GL_COMPILE_STATUS of: vertexShaderID
|
||||
|
||||
@ -197,6 +206,7 @@ OpenGLSL >> initialize [
|
||||
self addUniform: #u_time of: Uniform1F.
|
||||
self addUniform: #u_resolution of: Uniform2F.
|
||||
self addUniform: #u_mouse of: Uniform2F.
|
||||
self addUniform: #u_projection of: UniformMatrix4fv.
|
||||
self setUpUniforms.
|
||||
self compile
|
||||
]
|
||||
|
110
Diya/OpenGLTexImage2D.class.st
Normal file
110
Diya/OpenGLTexImage2D.class.st
Normal file
@ -0,0 +1,110 @@
|
||||
Class {
|
||||
#name : #OpenGLTexImage2D,
|
||||
#superclass : #DiyaBaseObject,
|
||||
#instVars : [
|
||||
'target',
|
||||
'level',
|
||||
'internalFormat',
|
||||
'width',
|
||||
'height',
|
||||
'border',
|
||||
'format',
|
||||
'type',
|
||||
'data'
|
||||
],
|
||||
#pools : [
|
||||
'OpenGLConstants',
|
||||
'OpenGLTypes'
|
||||
],
|
||||
#category : #'Diya-OpenGL'
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> border [
|
||||
^ border
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> border: anObject [
|
||||
border := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> data [
|
||||
^ data
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> data: anObject [
|
||||
data := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> format [
|
||||
^ format
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> format: anObject [
|
||||
format := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> height [
|
||||
^ height
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> height: anObject [
|
||||
height := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> internalFormat [
|
||||
^ internalFormat
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> internalFormat: anObject [
|
||||
internalFormat := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> level [
|
||||
^ level
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> level: anObject [
|
||||
level := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> target [
|
||||
^ target
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> target: anObject [
|
||||
target := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> type [
|
||||
^ type
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> type: anObject [
|
||||
type := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> width [
|
||||
^ width
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexImage2D >> width: anObject [
|
||||
width := anObject
|
||||
]
|
119
Diya/OpenGLTexture.class.st
Normal file
119
Diya/OpenGLTexture.class.st
Normal file
@ -0,0 +1,119 @@
|
||||
Class {
|
||||
#name : #OpenGLTexture,
|
||||
#superclass : #DiyaBaseObject,
|
||||
#instVars : [
|
||||
'textureID',
|
||||
'unit'
|
||||
],
|
||||
#pools : [
|
||||
'OpenGLConstants',
|
||||
'OpenGLTypes'
|
||||
],
|
||||
#category : #'Diya-OpenGL'
|
||||
}
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> active: unit [
|
||||
^self ffiActive: GL_TEXTURE_UNIT_BASE + unit
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> bind: target texture: texture [
|
||||
^ self ffiCall: #(void glBindTexture(GLenum target,GLuint texture))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> bindDefault: target [
|
||||
self bind: target texture: 0
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> delete: n pointer:textures [
|
||||
^ self ffiCall: #(void glDeleteTextures(GLsizei n,const GLuint * textures))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> ffiActive: unit [
|
||||
^self ffiCall: #(void glActiveTexture( GLenum unit))
|
||||
]
|
||||
|
||||
{ #category : #'library path' }
|
||||
OpenGLTexture class >> ffiLibraryName [
|
||||
^ OpenGL ffiLibraryName
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> fromUnit: unit [
|
||||
^self new unit: unit; yourself
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> genTexture: n pointer: textures [
|
||||
^ self ffiCall: #(void glGenTextures(GLsizei n,GLuint * textures))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> image2D: target level: level internalformat: internalformat w: width h: height border: border format: fmt type: type data: data [
|
||||
^ self ffiCall: #(void glTexImage2D( GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum fmt,GLenum type,const void * data))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLTexture class >> parameteri: target pname: pname param: param [
|
||||
^ self ffiCall: #(void glTexParameteri( GLenum target,GLenum pname,GLint param))
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLTexture >> active [
|
||||
self class active: self unit
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLTexture >> bind: target [
|
||||
^ self class bind: target texture: self textureID
|
||||
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLTexture >> delete [
|
||||
self class delete: 1 pointer: textureID getHandle.
|
||||
textureID free.
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLTexture >> initialize [
|
||||
textureID := FFIExternalArray externalNewType: GLint size:1.
|
||||
textureID autoRelease.
|
||||
textureID at:1 put: -1.
|
||||
self class genTexture: 1 pointer: textureID getHandle.
|
||||
unit := 0.
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLTexture >> setImage2D: tex2D [
|
||||
self active.
|
||||
self bind: tex2D target.
|
||||
self class image2D: tex2D target
|
||||
level: tex2D level
|
||||
internalformat: tex2D internalFormat
|
||||
w: tex2D width
|
||||
h: tex2D height
|
||||
border: tex2D border
|
||||
format: tex2D format
|
||||
type: tex2D type
|
||||
data: tex2D data
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLTexture >> textureID [
|
||||
^textureID at: 1
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexture >> unit [
|
||||
^ unit
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OpenGLTexture >> unit: anObject [
|
||||
unit := anObject
|
||||
]
|
@ -74,7 +74,6 @@ OpenGLVertexArray >> bind [
|
||||
{ #category : #accessing }
|
||||
OpenGLVertexArray >> delete [
|
||||
OpenGLVertexArray deteleVertexArraysSize:1 arrays: vertexArrayID getHandle.
|
||||
vertexArrayID at: 1 put: -1
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
|
@ -46,29 +46,47 @@ OpenGLVertexBuffer class >> namedBufferData:buffer size: size data: data usage:
|
||||
^self ffiCall: #(void glNamedBufferData(GLuint buffer,GLsizeiptr size,const void *data,GLenum usage))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLVertexBuffer class >> subData:target offset: offset size: size data: data [
|
||||
^self ffiCall: #(void glBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const void * data))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLVertexBuffer >> bind: target [
|
||||
^OpenGLVertexBuffer bind:target buffer: self vertexBufferID
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLVertexBuffer >> data:target data: data size: size usage: usage [
|
||||
self bind: target.
|
||||
^OpenGLVertexBuffer bufferData: target size: size data:(data ifNil:[data] ifNotNil: [data getHandle]) usage: usage
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLVertexBuffer >> data:target data: data usage: usage [
|
||||
self bind: target.
|
||||
^OpenGLVertexBuffer bufferData: target size: data size*4 data:data getHandle usage: usage
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLVertexBuffer >> delete [
|
||||
OpenGLVertexBuffer deleteBuffersSize: 1 buffers: vertexBufferID getHandle.
|
||||
vertexBufferID free.
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLVertexBuffer >> initialize [
|
||||
vertexBufferID := FFIExternalArray externalNewType: GLint size:1.
|
||||
vertexBufferID at:1 put: -1.
|
||||
vertexBufferID autoRelease.
|
||||
OpenGLVertexBuffer genVertexBuffersSize: 1 buffers: vertexBufferID getHandle
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLVertexBuffer >> subData:target offset: offset data:data [
|
||||
self bind: target.
|
||||
^OpenGLVertexBuffer subData: target offset: offset size: data size * 4 data: data getHandle
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OpenGLVertexBuffer >> vertexBufferID [
|
||||
^ vertexBufferID at: 1
|
||||
|
96
Diya/OrthoProjectionMatrix.class.st
Normal file
96
Diya/OrthoProjectionMatrix.class.st
Normal file
@ -0,0 +1,96 @@
|
||||
Class {
|
||||
#name : #OrthoProjectionMatrix,
|
||||
#superclass : #ProjectionMatrix,
|
||||
#instVars : [
|
||||
'viewport',
|
||||
'near',
|
||||
'far'
|
||||
],
|
||||
#category : #'Diya-Math'
|
||||
}
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OrthoProjectionMatrix class >> fromDisplay: display [
|
||||
^ self viewport: (Rectangle origin: 0@0 corner: (display w) @ (display h) ) near: -1.0 far: 1.0.
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OrthoProjectionMatrix class >> viewport:v near:n far:f [
|
||||
^ self new setViewport: v near:n far:f; yourself.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> bottom [
|
||||
^ viewport origin y
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OrthoProjectionMatrix >> calculate [
|
||||
self at:1 at:1 put: (2.0 /(self right - self left)).
|
||||
self at:2 at:2 put: (2.0 / (self top - self bottom)).
|
||||
self at:3 at:3 put: (2.0 / (self far - self near)) negated.
|
||||
self at:4 at:1 put: ((self right + self left)/ (self right - self left)) negated.
|
||||
self at:4 at:2 put: ((self top + self bottom) / (self top - self bottom)) negated.
|
||||
self at:4 at:3 put: ((self far + self near)/(self far - self near)) negated.
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OrthoProjectionMatrix >> default [
|
||||
viewport := Rectangle origin: -1.0@ -1.0 corner: 1.0@1.0.
|
||||
near := -1.0.
|
||||
far := 1.0.
|
||||
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> far [
|
||||
^ far
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> far: anObject [
|
||||
far := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> left [
|
||||
^ viewport origin x
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> near [
|
||||
^ near
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> near: anObject [
|
||||
near := anObject
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> right [
|
||||
^ viewport corner x
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
OrthoProjectionMatrix >> setViewport: v near: n far:f [
|
||||
viewport := v.
|
||||
near := n.
|
||||
far := f.
|
||||
self update.
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> top [
|
||||
^ viewport corner y
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> viewport [
|
||||
^ viewport
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
OrthoProjectionMatrix >> viewport: anObject [
|
||||
viewport := anObject
|
||||
]
|
55
Diya/ProjectionMatrix.class.st
Normal file
55
Diya/ProjectionMatrix.class.st
Normal file
@ -0,0 +1,55 @@
|
||||
Class {
|
||||
#name : #ProjectionMatrix,
|
||||
#superclass : #Array2D,
|
||||
#instVars : [
|
||||
'buffer'
|
||||
],
|
||||
#category : #'Diya-Math'
|
||||
}
|
||||
|
||||
{ #category : #'instance creation' }
|
||||
ProjectionMatrix class >> fromDisplay: display [
|
||||
^self subclassResponsibility
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
ProjectionMatrix >> buffer [
|
||||
^ buffer
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
ProjectionMatrix >> calculate [
|
||||
self subclassResponsibility
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
ProjectionMatrix >> default [
|
||||
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
ProjectionMatrix >> handle [
|
||||
^buffer getHandle
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
ProjectionMatrix >> initialize [
|
||||
super initialize.
|
||||
self rows:4 columns: 4 contents: ((Array new: 16) atAllPut: 0).
|
||||
1 to: 4 do: [ :i| self at: i at:i put: 1.0 ].
|
||||
buffer := FFIExternalArray externalNewType: #float size: self size.
|
||||
buffer autoRelease.
|
||||
self default.
|
||||
self update
|
||||
]
|
||||
|
||||
{ #category : #initialization }
|
||||
ProjectionMatrix >> update [
|
||||
|i|
|
||||
self calculate.
|
||||
i := 1.
|
||||
self asArray do:[:e|
|
||||
buffer at:i put:e.
|
||||
i := i+1
|
||||
].
|
||||
]
|
36
Diya/TotoShader.class.st
Normal file
36
Diya/TotoShader.class.st
Normal file
@ -0,0 +1,36 @@
|
||||
Class {
|
||||
#name : #TotoShader,
|
||||
#superclass : #OpenGLSL,
|
||||
#category : #'Diya-Shaders'
|
||||
}
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
TotoShader class >> fragmentShader [
|
||||
^'
|
||||
#version 330 core
|
||||
in vec2 TexCoords;
|
||||
|
||||
uniform sampler2D text;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
|
||||
gl_FragColor = vec4(1.0,1.0,1.0, 1.0) * sampled;
|
||||
} '
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
TotoShader class >> vertexShader [
|
||||
^'
|
||||
#version 330 core
|
||||
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
|
||||
out vec2 TexCoords;
|
||||
|
||||
uniform mat4 u_projection;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_projection * vec4(vertex.xy, 0.0, 1.0);
|
||||
TexCoords = vertex.zw;
|
||||
} '
|
||||
]
|
Loading…
Reference in New Issue
Block a user