mirror of
https://github.com/lxsang/Diya-API.git
synced 2024-12-27 03:48:21 +01:00
allow get texture from screen, VM bug on device
This commit is contained in:
parent
141bf2e226
commit
6f5c6b8551
@ -3,7 +3,8 @@ Class {
|
|||||||
#superclass : #DiyaBaseObject,
|
#superclass : #DiyaBaseObject,
|
||||||
#instVars : [
|
#instVars : [
|
||||||
'enable',
|
'enable',
|
||||||
'mapped'
|
'mapped',
|
||||||
|
'target'
|
||||||
],
|
],
|
||||||
#category : #'Diya-Events'
|
#category : #'Diya-Events'
|
||||||
}
|
}
|
||||||
@ -38,3 +39,13 @@ DiyaEvent >> mapped: anObject [
|
|||||||
DiyaEvent >> preventDefault [
|
DiyaEvent >> preventDefault [
|
||||||
enable := false
|
enable := false
|
||||||
]
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
DiyaEvent >> target [
|
||||||
|
^ target
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
DiyaEvent >> target: anObject [
|
||||||
|
target := anObject
|
||||||
|
]
|
||||||
|
@ -67,7 +67,7 @@ DiyaExampleApp >> main [
|
|||||||
|
|
||||||
{ #category : #accessing }
|
{ #category : #accessing }
|
||||||
DiyaExampleApp >> setup [
|
DiyaExampleApp >> setup [
|
||||||
|node node1 ell label icon button|
|
|node node1 img ell label icon button|
|
||||||
|
|
||||||
"DiyaRendererContext uniqueInstance assets
|
"DiyaRendererContext uniqueInstance assets
|
||||||
addAsset:
|
addAsset:
|
||||||
@ -84,9 +84,19 @@ DiyaExampleApp >> setup [
|
|||||||
node1 on: #(mousebuttondown fingerdown) do:[:e|
|
node1 on: #(mousebuttondown fingerdown) do:[:e|
|
||||||
label txt: 'Mouse ', (node1 local: e mapped worldPosition) asIntegerPoint asString].
|
label txt: 'Mouse ', (node1 local: e mapped worldPosition) asIntegerPoint asString].
|
||||||
|
|
||||||
node := root addNode: (DiyaImageView from:'mrsang.png') at: 10 @ 400.
|
img := root addNode: (DiyaImageView from:'mrsang.png') at: 10 @ 400.
|
||||||
node styleName: #image_view.
|
img styleName: #image_view.
|
||||||
node extent:200@200.
|
img extent:200@200.
|
||||||
|
root on: #(mousebuttondown fingerdown) do:[:e|
|
||||||
|
"change texture"
|
||||||
|
|p|
|
||||||
|
p := e mapped worldPosition.
|
||||||
|
label txt: 'Mouse ', p asIntegerPoint asString.
|
||||||
|
DiyaRendererContext uniqueInstance assets
|
||||||
|
addAsset:(DiyaImageTex fromDisplay: (Rectangle origin: ((p x - 100) @ (p y - 100)) extent: 200@200 ) as: 'capture').
|
||||||
|
img textureNamed: 'capture'.
|
||||||
|
|
||||||
|
].
|
||||||
|
|
||||||
node := root addNode: (DiyaRectangle new) at: 10@80.
|
node := root addNode: (DiyaRectangle new) at: 10@80.
|
||||||
node styleName: #rect_view.
|
node styleName: #rect_view.
|
||||||
|
@ -12,6 +12,16 @@ Class {
|
|||||||
#category : #'Diya-Graphics'
|
#category : #'Diya-Graphics'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ #category : #'instance creation' }
|
||||||
|
DiyaImageTex class >> fromDisplay: aRect as: assetName [
|
||||||
|
^ self new fromDisplay: aRect as: assetName; yourself
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'instance creation' }
|
||||||
|
DiyaImageTex class >> fromDisplayAs: assetName [
|
||||||
|
^ self new fromDisplayAs: assetName; yourself
|
||||||
|
]
|
||||||
|
|
||||||
{ #category : #'instance creation' }
|
{ #category : #'instance creation' }
|
||||||
DiyaImageTex class >> fromFile: path [
|
DiyaImageTex class >> fromFile: path [
|
||||||
^ self new fromFile: path; yourself
|
^ self new fromFile: path; yourself
|
||||||
@ -24,9 +34,59 @@ DiyaImageTex >> drop [
|
|||||||
disable: GL_BLEND."
|
disable: GL_BLEND."
|
||||||
]
|
]
|
||||||
|
|
||||||
|
{ #category : #capture }
|
||||||
|
DiyaImageTex >> flipY [
|
||||||
|
|buffer idx idxf|
|
||||||
|
buffer := FFIExternalArray externalNewType: GLubyte size: width * height * 4.
|
||||||
|
LibC memset: buffer getHandle value: 0 size: buffer size.
|
||||||
|
buffer autoRelease.
|
||||||
|
0 to: height - 1 do:[:y|
|
||||||
|
0 to: width - 1 do:[:x|
|
||||||
|
idx := ((y * width) + x)*4 + 1.
|
||||||
|
idxf := ((height - y)*width + x)*4 + 1.
|
||||||
|
buffer at: idx put: (data at: idxf).
|
||||||
|
buffer at: idx+1 put: (data at: idxf+1).
|
||||||
|
buffer at: idx+2 put: (data at: idxf+2).
|
||||||
|
buffer at: idx+3 put: (data at: idxf+3).
|
||||||
|
].
|
||||||
|
].
|
||||||
|
data free.
|
||||||
|
data := buffer.
|
||||||
|
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #capture }
|
||||||
|
DiyaImageTex >> fromDisplay: aRect as: assetName [
|
||||||
|
surface ifNotNil: [ surface free ] ifNil: [data ifNotNil: [data free]].
|
||||||
|
surface := nil.
|
||||||
|
Transcript show:'allocate ', ((aRect extent x) * (aRect extent y) * 4) asInteger asString,' bytes';cr.
|
||||||
|
data := FFIExternalArray externalNewType: GLubyte size:((aRect extent x) * (aRect extent y) * 4) asInteger.
|
||||||
|
LibC memset: data getHandle value: 0 size: data size.
|
||||||
|
data autoRelease.
|
||||||
|
OpenGL readPixelsOn: data getHandle
|
||||||
|
x: aRect origin x
|
||||||
|
y: (DiyaDisplay height) - (aRect origin y) - (aRect extent y)
|
||||||
|
w: aRect extent x
|
||||||
|
h: aRect extent y
|
||||||
|
format:GL_RGBA
|
||||||
|
type: GL_UNSIGNED_BYTE.
|
||||||
|
width := aRect extent x.
|
||||||
|
height := aRect extent y.
|
||||||
|
name := assetName.
|
||||||
|
self flipY.
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #capture }
|
||||||
|
DiyaImageTex >> fromDisplayAs: assetName [
|
||||||
|
self fromDisplay: (Rectangle origin: 0@0 extent: DiyaDisplay extent ) as: assetName
|
||||||
|
]
|
||||||
|
|
||||||
{ #category : #'instance creation' }
|
{ #category : #'instance creation' }
|
||||||
DiyaImageTex >> fromFile: aPath [
|
DiyaImageTex >> fromFile: aPath [
|
||||||
Transcript show: 'Loading texture from ', aPath fullName;cr.
|
Transcript show: 'Loading texture from ', aPath fullName;cr.
|
||||||
|
name := aPath.
|
||||||
aPath exists ifFalse: [ ^DiyaCoreAPIError signal:'File not found ', aPath fullName ].
|
aPath exists ifFalse: [ ^DiyaCoreAPIError signal:'File not found ', aPath fullName ].
|
||||||
surface := SDL2Image SDLImgLoad: aPath fullName.
|
surface := SDL2Image SDLImgLoad: aPath fullName.
|
||||||
surface ifNil: [ ^DiyaCoreAPIError signal:'Unable to load ', aPath fullName ].
|
surface ifNil: [ ^DiyaCoreAPIError signal:'Unable to load ', aPath fullName ].
|
||||||
|
@ -266,7 +266,9 @@ DiyaNode >> tf [
|
|||||||
{ #category : #'event handling' }
|
{ #category : #'event handling' }
|
||||||
DiyaNode >> trigger: evt [
|
DiyaNode >> trigger: evt [
|
||||||
evt enable ifFalse:[^self].
|
evt enable ifFalse:[^self].
|
||||||
ehandlers at: evt mapped type ifPresent:[:handler| handler value: evt].
|
ehandlers at: evt mapped type ifPresent:[:handler|
|
||||||
|
evt target: self.
|
||||||
|
handler value: evt].
|
||||||
children ifNil: [^self].
|
children ifNil: [^self].
|
||||||
evt enable ifTrue: [
|
evt enable ifTrue: [
|
||||||
"evt mapped triggableOn: children first."
|
"evt mapped triggableOn: children first."
|
||||||
|
@ -62,6 +62,7 @@ ImageInitializer >> initializeImage [
|
|||||||
FFIMethodRegistry resetAll.
|
FFIMethodRegistry resetAll.
|
||||||
Smalltalk garbageCollect.
|
Smalltalk garbageCollect.
|
||||||
SourceFiles := SourceFileArray new.
|
SourceFiles := SourceFileArray new.
|
||||||
|
"Smalltalk vm parameterAt: 45 put: (Smalltalk vm parameterAt: 44) * 2."
|
||||||
Transcript show: 'Image initialized'; cr.
|
Transcript show: 'Image initialized'; cr.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1,5 +1,16 @@
|
|||||||
Extension { #name : #LibC }
|
Extension { #name : #LibC }
|
||||||
|
|
||||||
|
{ #category : #'*Diya' }
|
||||||
|
LibC class >> alloc: size [
|
||||||
|
^self uniqueInstance alloc: size
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'*Diya' }
|
||||||
|
LibC >> alloc:size [
|
||||||
|
^self ffiCall: #(void *malloc(size_t size))
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
{ #category : #'*Diya' }
|
{ #category : #'*Diya' }
|
||||||
LibC >> memset:pointer value: value size: size [
|
LibC >> memset:pointer value: value size: size [
|
||||||
^self ffiCall: #(void *memset(void *pointer, int value, size_t size))
|
^self ffiCall: #(void *memset(void *pointer, int value, size_t size))
|
||||||
|
@ -93,6 +93,11 @@ OpenGL class >> pixelstorei: pname param: param [
|
|||||||
^self ffiCall: #(void glPixelStorei( GLenum pname,GLint param))
|
^self ffiCall: #(void glPixelStorei( GLenum pname,GLint param))
|
||||||
]
|
]
|
||||||
|
|
||||||
|
{ #category : #geometry }
|
||||||
|
OpenGL class >> readPixelsOn: buffer x:x y: y w:w h:h format: fmt type: type [
|
||||||
|
^ self ffiCall: #(void glReadPixels( GLint x,GLint y,GLsizei w,GLsizei h,GLenum fmt,GLenum type,void * buffer))
|
||||||
|
]
|
||||||
|
|
||||||
{ #category : #accessing }
|
{ #category : #accessing }
|
||||||
OpenGL class >> vertex3fX:x Y:y Z:z [
|
OpenGL class >> vertex3fX:x Y:y Z:z [
|
||||||
^self ffiCall: #(void glVertex3f( GLfloat x,GLfloat y,GLfloat z))
|
^self ffiCall: #(void glVertex3f( GLfloat x,GLfloat y,GLfloat z))
|
||||||
|
@ -59,7 +59,7 @@ OpenGLTexImage2D >> drop [
|
|||||||
|
|
||||||
{ #category : #accessing }
|
{ #category : #accessing }
|
||||||
OpenGLTexImage2D >> extent [
|
OpenGLTexImage2D >> extent [
|
||||||
^ width @ height
|
^ self width @ self height
|
||||||
]
|
]
|
||||||
|
|
||||||
{ #category : #accessing }
|
{ #category : #accessing }
|
||||||
|
Loading…
Reference in New Issue
Block a user