mirror of
https://github.com/lxsang/Diya-API.git
synced 2025-02-21 18:32:47 +01:00
let openGL do the final transformation
This commit is contained in:
parent
8cb2cb543a
commit
7fa21d524b
@ -103,12 +103,12 @@ DiyaBoot >> render [
|
||||
event := SDL_Event new.
|
||||
root := DiyaRootNode new.
|
||||
DiyaRenderer uniqueInstance root: root.
|
||||
rec := root addNode: (DiyaRectangle size: 120@160 shader: GLSimpleShader uniqueInstance) at: 200 @ 200.
|
||||
rec := root addNode: (DiyaRectangle size: 50@50 shader: GLSimpleShader uniqueInstance) at: 200 @ 500.
|
||||
rec := root addNode: (DiyaRectangle size: 120@160 shader: GLSimpleShader uniqueInstance) at: 250 @ 200.
|
||||
rec := root addNode: (DiyaRectangle size: 50@50 shader: GLSimpleShader uniqueInstance) at: 250 @ 500.
|
||||
rec rotation: (Float pi / -8.0).
|
||||
rec scale: 1.5@1.5.
|
||||
text := root addNode: (DiyaText data: 'the quick brown fox jumped over the lazy dog' shader: TotoShader uniqueInstance) at: 50@100.
|
||||
text extent: 100@100.
|
||||
text := root addNode: (DiyaText data: String loremIpsum shader: TotoShader uniqueInstance) at: 20@320.
|
||||
text extent: 200@320.
|
||||
"text rotation:(Float pi / 4.0)."
|
||||
OpenGL viewportX: 0 Y:0 W: display w H: display h.
|
||||
"TODO: maybe give node to customize this"
|
||||
|
@ -6,13 +6,17 @@ Class {
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> draw [
|
||||
self transformDo:[:i :e|
|
||||
context buffer at:i put:e
|
||||
].
|
||||
{
|
||||
0.0. 0.0. 1.0.
|
||||
0.0. extent y. 1.0.
|
||||
extent x. extent y. 1.0.
|
||||
extent x. 0.0. 1.0.
|
||||
} doWithIndex: [:e :i| context buffer at: i put: e].
|
||||
shader use.
|
||||
shader setUniform: #u_time value: DiyaClock uniqueInstance elapsedTime asFloat.
|
||||
shader setUniform: #u_projection value: context projection buffer.
|
||||
shader setUniform: #u_projection value: {GL_FALSE. context projection buffer}.
|
||||
shader setUniform: #u_resolution value: { context resolution x. context resolution y }.
|
||||
shader setUniform: #u_transform value: {GL_TRUE. self tf asGLBuffer}.
|
||||
context mouse ifNotNil: [
|
||||
"in shader, window origin is bottom left conor of the window
|
||||
the mouse position should be transformed to this coodinate"
|
||||
@ -20,7 +24,7 @@ DiyaRectangle >> draw [
|
||||
].
|
||||
context vao enableAttribute: 0.
|
||||
context vbo bind: GL_ARRAY_BUFFER.
|
||||
OpenGLVertexArray vertexAttributePointerIndex: 0 size:3 type: GL_FLOAT normalized: GL_FALSE stride: 12 pointer: nil.
|
||||
OpenGLVertexArray vertexAttributePointerIndex: 0 size:3 type: GL_FLOAT normalized: GL_FALSE stride: 0 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.
|
||||
@ -33,14 +37,3 @@ DiyaRectangle >> initialize [
|
||||
translation := nil.
|
||||
children := nil
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaRectangle >> transformDo: block [
|
||||
|i|
|
||||
i := 1.
|
||||
self gltf: { 0.0@0.0. 0.0@ (extent y). extent. (extent x) @0. } do:[:x :y|
|
||||
block value: i value:x.
|
||||
block value: i + 1 value: y.
|
||||
block value: i + 2 value: 0.0.
|
||||
i := i+3].
|
||||
]
|
||||
|
@ -44,8 +44,9 @@ DiyaText >> draw [
|
||||
OpenGL enable: GL_TEXTURE_2D.
|
||||
OpenGL blendFnWithSfactor: GL_SRC_ALPHA dfactor: GL_ONE_MINUS_SRC_ALPHA.
|
||||
self shader use.
|
||||
self shader setUniform: #u_time value: DiyaClock uniqueInstance elapsedTime asFloat.
|
||||
self shader setUniform: #u_projection value: context projection buffer.
|
||||
shader setUniform: #u_time value: DiyaClock uniqueInstance elapsedTime asFloat.
|
||||
shader setUniform: #u_projection value: {GL_FALSE. context projection buffer}.
|
||||
shader setUniform: #u_transform value: {GL_TRUE. self tf asGLBuffer}.
|
||||
self shader setUniform: #u_texture value: 0.
|
||||
self shader setUniform: #u_resolution value: { context resolution x. context resolution y }.
|
||||
style := DiyaFontManager uniqueInstance style: self fontStyle from: self fontName.
|
||||
@ -83,27 +84,17 @@ DiyaText >> drawCharacter: c at: offset [
|
||||
|
||||
{ #category : #accessing }
|
||||
DiyaText >> fillVerticesBuffer: buffer at: offset tex: tex [
|
||||
|x y w h i uvs|
|
||||
|x y w h|
|
||||
x := offset x + ((tex bearing x )*(self scale x)).
|
||||
y := offset y - (((tex height) - (tex bearing y))*(self scale y)).
|
||||
w := (tex width)*(self scale x).
|
||||
h := (tex height)*(self scale y).
|
||||
i := 1.
|
||||
uvs := { 0@0. 0@1. 1@1. 0@0. 1@1. 1@0 }.
|
||||
self gltf:{x@(y+h). x@y. (x+w)@y. x@(y+h). (x+w)@y. (x+w)@(y+h). } do:[:cx :cy| |uv|
|
||||
uv := uvs at: ((i -1)/4) + 1.
|
||||
buffer at:i put: cx.
|
||||
buffer at: i +1 put: cy.
|
||||
buffer at: i + 2 put: uv x.
|
||||
buffer at: i + 3 put: uv y.
|
||||
i := i+4.
|
||||
].
|
||||
"{x. y + h. 0.0. 0.0.
|
||||
{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. }"
|
||||
x + w. y + h. 1.0. 0.0. } withIndexDo: [ :e :i| buffer at:i put: e ]
|
||||
]
|
||||
|
||||
{ #category : #accessing }
|
||||
|
@ -87,6 +87,11 @@ OpenGLSL class >> linkProgram:program [
|
||||
^self ffiCall: #(void glLinkProgram(GLuint program))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLSL class >> resetShaders [
|
||||
self allSubclassesDo: [ :c| c reset ].
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLSL class >> setShaderSourceFor: shader count: n string: s length: l [
|
||||
^ self ffiCall: #(void glShaderSource( GLuint shader,GLsizei n,const void* s,const GLint *l))
|
||||
@ -109,9 +114,11 @@ OpenGLSL class >> vertexShader [
|
||||
precision mediump float;
|
||||
#endif
|
||||
uniform mat4 u_projection;
|
||||
uniform mat3 u_transform;
|
||||
void main()
|
||||
{
|
||||
gl_Position = u_projection * vec4(gl_Vertex.xy, 0, 1);
|
||||
vec3 coord_global = u_transform * vec3(gl_Vertex.xy, 1.0);
|
||||
gl_Position = u_projection * vec4(coord_global.xy, 0, 1.0);
|
||||
}
|
||||
'
|
||||
]
|
||||
@ -207,6 +214,7 @@ OpenGLSL >> initialize [
|
||||
self addUniform: #u_resolution of: Uniform2F.
|
||||
self addUniform: #u_mouse of: Uniform2F.
|
||||
self addUniform: #u_projection of: UniformMatrix4fv.
|
||||
self addUniform: #u_transform of: UniformMatrix3fv.
|
||||
self setUpUniforms.
|
||||
self compile
|
||||
]
|
||||
|
@ -68,6 +68,11 @@ OpenGLSLUniform class >> uniform4i: location value: v0 value: v1 value: v2 value
|
||||
^self ffiCall: #(void glUniform4i(GLint location,GLint v0,GLint v1,GLint v2, GLint v3))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLSLUniform class >> uniformMatrix3fv: location count: count transpose: transpose value: value [
|
||||
^self ffiCall: #(void glUniformMatrix3fv(GLint location,GLsizei count,GLboolean transpose,const GLfloat *value))
|
||||
]
|
||||
|
||||
{ #category : #'as yet unclassified' }
|
||||
OpenGLSLUniform class >> uniformMatrix4fv: location count: count transpose: transpose value: value [
|
||||
^self ffiCall: #(void glUniformMatrix4fv(GLint location,GLsizei count,GLboolean transpose,const GLfloat *value))
|
||||
|
@ -24,11 +24,17 @@ void main(void) {
|
||||
{ #category : #'as yet unclassified' }
|
||||
TotoShader class >> vertexShader [
|
||||
^'
|
||||
varying vec2 texcoord;
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
uniform mat4 u_projection;
|
||||
void main(void) {
|
||||
gl_Position = u_projection * vec4(gl_Vertex.xy, 0, 1);
|
||||
texcoord = gl_Vertex.zw;
|
||||
uniform mat3 u_transform;
|
||||
varying vec2 texcoord;
|
||||
void main()
|
||||
{
|
||||
vec3 coord_global = u_transform * vec3(gl_Vertex.xy, 1.0);
|
||||
gl_Position = u_projection * vec4(coord_global.xy, 0, 1.0);
|
||||
texcoord = gl_Vertex.zw;
|
||||
}'
|
||||
]
|
||||
|
||||
|
18
Diya/UniformMatrix3fv.class.st
Normal file
18
Diya/UniformMatrix3fv.class.st
Normal file
@ -0,0 +1,18 @@
|
||||
Class {
|
||||
#name : #UniformMatrix3fv,
|
||||
#superclass : #OpenGLSLUniform,
|
||||
#pools : [
|
||||
'OpenGLConstants',
|
||||
'OpenGLTypes'
|
||||
],
|
||||
#category : #'Diya-OpenGL'
|
||||
}
|
||||
|
||||
{ #category : #accessing }
|
||||
UniformMatrix3fv >> setUniformValue [
|
||||
OpenGLSLUniform
|
||||
uniformMatrix3fv: location
|
||||
count: 1
|
||||
transpose: value first
|
||||
value: value last getHandle
|
||||
]
|
@ -13,6 +13,6 @@ UniformMatrix4fv >> setUniformValue [
|
||||
OpenGLSLUniform
|
||||
uniformMatrix4fv: location
|
||||
count: 1
|
||||
transpose: GL_FALSE
|
||||
value: value getHandle
|
||||
transpose: value first
|
||||
value: value last getHandle
|
||||
]
|
||||
|
Loading…
x
Reference in New Issue
Block a user