2022-03-08 23:30:01 +01:00
|
|
|
Class {
|
|
|
|
#name : #DiyaImageTex,
|
|
|
|
#superclass : #OpenGLTexImage2D,
|
2022-03-21 18:03:15 +01:00
|
|
|
#instVars : [
|
2022-08-09 00:22:18 +02:00
|
|
|
'name',
|
|
|
|
'surface'
|
2022-03-21 18:03:15 +01:00
|
|
|
],
|
2022-03-08 23:30:01 +01:00
|
|
|
#pools : [
|
|
|
|
'OpenGLConstants',
|
|
|
|
'OpenGLTypes'
|
|
|
|
],
|
|
|
|
#category : #'Diya-Graphics'
|
|
|
|
}
|
|
|
|
|
2022-08-09 03:14:23 +02:00
|
|
|
{ #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
|
|
|
|
]
|
|
|
|
|
2022-03-08 23:30:01 +01:00
|
|
|
{ #category : #'instance creation' }
|
|
|
|
DiyaImageTex class >> fromFile: path [
|
|
|
|
^ self new fromFile: path; yourself
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
DiyaImageTex >> drop [
|
2022-08-08 00:12:54 +02:00
|
|
|
"OpenGL
|
2022-03-08 23:30:01 +01:00
|
|
|
disable: GL_CULL_FACE;
|
2022-08-08 00:12:54 +02:00
|
|
|
disable: GL_BLEND."
|
2022-03-08 23:30:01 +01:00
|
|
|
]
|
|
|
|
|
2022-08-09 03:14:23 +02:00
|
|
|
{ #category : #capture }
|
|
|
|
DiyaImageTex >> flipY [
|
2022-08-10 19:55:49 +02:00
|
|
|
|buffer size linesize top bottom|
|
|
|
|
size := self bytesSize.
|
|
|
|
linesize := width << 2.
|
|
|
|
buffer := FFIExternalArray externalNewType: GLubyte size: linesize.
|
2022-08-09 03:14:23 +02:00
|
|
|
LibC memset: buffer getHandle value: 0 size: buffer size.
|
2022-08-10 19:55:49 +02:00
|
|
|
0 to: (height >> 1) -1 do: [ :line|
|
|
|
|
top := line * linesize.
|
|
|
|
bottom := (size - (linesize * (line + 1))).
|
|
|
|
LibC memCopy: (data getHandle) + top to: buffer getHandle size: linesize.
|
|
|
|
LibC memCopy: (data getHandle) + bottom to: (data getHandle) + top size: linesize.
|
|
|
|
LibC memCopy: buffer getHandle to: (data getHandle) + bottom size: linesize.
|
2022-08-09 03:14:23 +02:00
|
|
|
].
|
2022-08-10 19:55:49 +02:00
|
|
|
buffer free
|
2022-08-09 03:14:23 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #capture }
|
|
|
|
DiyaImageTex >> fromDisplay: aRect as: assetName [
|
|
|
|
surface ifNotNil: [ surface free ] ifNil: [data ifNotNil: [data free]].
|
|
|
|
surface := nil.
|
2022-08-10 19:55:49 +02:00
|
|
|
width := aRect extent x asInteger.
|
|
|
|
height := aRect extent y asInteger.
|
|
|
|
data := FFIExternalArray externalNewType: GLubyte size: self bytesSize.
|
2022-08-09 03:14:23 +02:00
|
|
|
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.
|
|
|
|
name := assetName.
|
|
|
|
self flipY.
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #capture }
|
|
|
|
DiyaImageTex >> fromDisplayAs: assetName [
|
|
|
|
self fromDisplay: (Rectangle origin: 0@0 extent: DiyaDisplay extent ) as: assetName
|
|
|
|
]
|
|
|
|
|
2022-03-08 23:30:01 +01:00
|
|
|
{ #category : #'instance creation' }
|
2022-03-21 18:03:15 +01:00
|
|
|
DiyaImageTex >> fromFile: aPath [
|
2022-08-09 00:22:18 +02:00
|
|
|
Transcript show: 'Loading texture from ', aPath fullName;cr.
|
2022-08-09 03:14:23 +02:00
|
|
|
name := aPath.
|
2022-08-09 00:22:18 +02:00
|
|
|
aPath exists ifFalse: [ ^DiyaCoreAPIError signal:'File not found ', aPath fullName ].
|
|
|
|
surface := SDL2Image SDLImgLoad: aPath fullName.
|
|
|
|
surface ifNil: [ ^DiyaCoreAPIError signal:'Unable to load ', aPath fullName ].
|
|
|
|
width := surface w.
|
|
|
|
height := surface h.
|
|
|
|
data := surface pixels.
|
|
|
|
surface autoRelease.
|
|
|
|
Transcript show: 'Loaded ', aPath fullName;cr.
|
2022-03-08 23:30:01 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #'instance creation' }
|
|
|
|
DiyaImageTex >> initialize [
|
|
|
|
super initialize.
|
|
|
|
level := 0.
|
|
|
|
border := 0.
|
|
|
|
format := GL_RGBA.
|
|
|
|
internalFormat := GL_RGBA.
|
|
|
|
type := GL_UNSIGNED_BYTE.
|
|
|
|
target := GL_TEXTURE_2D.
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
DiyaImageTex >> mipmap [
|
|
|
|
^false
|
|
|
|
]
|
|
|
|
|
2022-03-21 18:03:15 +01:00
|
|
|
{ #category : #accessing }
|
2022-08-09 00:22:18 +02:00
|
|
|
DiyaImageTex >> name [
|
|
|
|
^ name
|
2022-03-21 18:03:15 +01:00
|
|
|
]
|
|
|
|
|
2022-03-08 23:30:01 +01:00
|
|
|
{ #category : #accessing }
|
|
|
|
DiyaImageTex >> setup [
|
|
|
|
OpenGLTexture
|
|
|
|
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_WRAP_S param: GL_CLAMP_TO_EDGE;
|
|
|
|
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_WRAP_T param: GL_CLAMP_TO_EDGE;
|
|
|
|
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_MIN_FILTER param: GL_LINEAR;
|
|
|
|
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_MAG_FILTER param: GL_LINEAR.
|
|
|
|
]
|
2022-08-09 00:22:18 +02:00
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
DiyaImageTex >> surface [
|
|
|
|
^ surface
|
|
|
|
]
|