It took me a while to understand this a little bit. But the shader can render 
any number of objects you just need to set up the data and tell the shader to 
paint the object. To create 2 cubes I had to modify the a_g_initialize function 
and the a_g_paint function. I have placed comments in the code trying to show 
with my limited understanding of OpenGL what is being done. To just create 2 
duplicate cubes this code could be simplified.  But if 2 different  types of 
objects needed to be rendered everything would likely stay the same with a 
second set of vertex and color data being added for the new object (right now I 
reuse vertexData and colorData).


a_g_initialize=: 3 : 0
if. p=. >@{. glGetString GL_VERSION do. smoutput 'GL_VERSION: ', memr 0 _1 2,~ 
p end.
if. 0=p do. smoutput 'cannot retrieve GL_VERSION' return. end.
if. p=. >@{. glGetString GL_VENDOR do. smoutput 'GL_VENDOR: ', memr 0 _1 2,~ p 
end.
if. p=. >@{. glGetString GL_RENDERER do. smoutput 'GL_RENDERER: ', memr 0 _1 
2,~ p end.
if. p=. >@{. glGetString GL_SHADING_LANGUAGE_VERSION do. smoutput 
'GL_SHADING_LANGUAGE_VERSION: ', memr 0 _1 2,~ p end.
GLSL=: wglGLSL''

wglPROC''
sprog=: 0
if. GLSL>120 do.
vsrc=. vsrc2
fsrc=. fsrc2
else.
vsrc=. vsrc1
fsrc=. fsrc1
if. 0=GLES_VERSION_jgles_ do.
vsrc=. vsrc,~ '#define lowp', LF, '#define mediump', LF, '#define highp', LF
fsrc=. fsrc,~ '#define lowp', LF, '#define mediump', LF, '#define highp', LF
end.
end.
vsrc=. '#version ',(":GLSL),((GLSL>:300)#(*GLES_VERSION){::' core';' 
es'),LF,vsrc
fsrc=. '#version ',(":GLSL),((GLSL>:300)#(*GLES_VERSION){::' core';' 
es'),LF,fsrc
if.(GLSL>:300)*.0~:GLES_VERSION_jgles_ do.
fsrc=. ('void main';'out vec4 gl_FragColor;',LF,'void main') stringreplace fsrc
end.
smoutput vsrc
smoutput fsrc
'err program'=. gl_makeprogram vsrc;fsrc
if. #err do. smoutput err return. end.

NB. original cube data and the model-view-projection matrix
vertexAttr=: >@{. glGetAttribLocation program;'vertex'
assert. _1~: vertexAttr
colorAttr=: >@{. glGetAttribLocation program;'color'
assert. _1~: colorAttr
mvpUni=: >@{. glGetUniformLocation program;'mvp'
assert. _1~: mvpUni

NB. Second duplicate object as above
vertexAttr1=: >@{. glGetAttribLocation program;'vertex'
assert. _1~: vertexAttr1
colorAttr1=: >@{. glGetAttribLocation program;'color'
assert. _1~: colorAttr1

NB. Here is where my shape is defined. this provides the hooks
NB. between J data and openGL
NB. Here I increase the buffer vbo to 4 locations and reuse the
NB. object vertexData and colorData that make the colorful cube
glGenBuffers 2;vbo=: 4#_1
glBindBuffer GL_ARRAY_BUFFER; 0{vbo
glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); 
GL_STATIC_DRAW
glBindBuffer GL_ARRAY_BUFFER; 1{vbo
glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); 
GL_STATIC_DRAW
glBindBuffer GL_ARRAY_BUFFER; 2{vbo
glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); 
GL_STATIC_DRAW
glBindBuffer GL_ARRAY_BUFFER; 3{vbo
glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); 
GL_STATIC_DRAW
glBindBuffer GL_ARRAY_BUFFER; 0

sprog=: program

glClearColor 0; 0; 1; 0
)


a_g_paint=: 3 : 0
if. 0=sprog do. return. end.

wh=. gl_qwh''
glClearColor 0 0 0 0
glClear GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT

glUseProgram sprog
glEnable GL_DEPTH_TEST
glEnable GL_CULL_FACE

NB. matrix convention: current matrix on the left
NB. note pre-multiplication

NB. model-view
NB. I created a new model: mvp1 so it will translate the cube
NB. so there will be 2 cubes side by side
mvp=: (gl_Rotate (0{R), 1 0 0 ) mp (gl_Rotate (1{R), 0 1 0) mp (gl_Rotate 
(2{R), 0 0 1) mp (gl_Scale STEPS%100) mp (gl_Translate 0.6 0 _8) mp glu_LookAt 
EYE,LR,UD,IO,UP
mvp1=: (gl_Rotate (0{R), 1 0 0 ) mp (gl_Rotate (1{R), 0 1 0) mp (gl_Rotate 
(2{R), 0 0 1) mp (gl_Scale STEPS%100) mp (gl_Translate _1.2 0 _8) mp glu_LookAt 
EYE,LR,UD,IO,UP

NB. projection
mvp=: mvp mp gl_Perspective 30, (%/wh),1 10
mvp1=: mvp1 mp gl_Perspective 30, (%/wh),1 10

NB. note GL_FALSE, no transpose
NB. Draw Object 1
glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp

glBindBuffer GL_ARRAY_BUFFER; 0{vbo
glEnableVertexAttribArray vertexAttr
glVertexAttribPointer vertexAttr; 3; GL_FLOAT; 0; 0; 0

glBindBuffer GL_ARRAY_BUFFER; 1{vbo
glEnableVertexAttribArray colorAttr
glVertexAttribPointer colorAttr; 3; GL_FLOAT; 0; 0; 0

glDrawArrays GL_TRIANGLES; 0; 36

NB. Draw object 2
glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp1

glBindBuffer GL_ARRAY_BUFFER; 2{vbo
glEnableVertexAttribArray vertexAttr1
glVertexAttribPointer vertexAttr1; 3; GL_FLOAT; 0; 0; 0

glBindBuffer GL_ARRAY_BUFFER; 3{vbo
glEnableVertexAttribArray colorAttr1
glVertexAttribPointer colorAttr1; 3; GL_FLOAT; 0; 0; 0

glDrawArrays GL_TRIANGLES; 0; 36

NB. Objects drawn perform glDisableVertexAttribArray
NB. what ever that is for
glBindBuffer GL_ARRAY_BUFFER; 0
glDisableVertexAttribArray colorAttr
glDisableVertexAttribArray vertexAttr
glDisableVertexAttribArray colorAttr1
glDisableVertexAttribArray vertexAttr1

glDisable GL_DEPTH_TEST
glDisable GL_CULL_FACE

glUseProgram 0

gl_clear ''
gl_rgb 0 255 0
gl_textcolor ''
gl_textxy 10 30
gl_text 'keys: x y z a s l r F10'
gl_textxy 10 50
gl_text 'scale: ',":STEPS%100
gl_textxy 10 70
gl_text 'angle: ',":R
gl_textxy 10 90
if. 0=sprog do. return. end.
gl_text 'matrix:'
for_i. i.4 do.
gl_textxy 10, 105+i*15
gl_text 6j2": i{mvp
end.
)


> On Feb 14, 2020, at 4:14 PM, Brian Schott <schott.br...@gmail.com> wrote:
> 
> Bill,
> 
> Thank you very much.
> 
> Mostly I want to get n turtles, not cubes, that are not rotating to time
> but behave like "Logo" turtles and react to commands in the Terminal window
> like Forward 3 and Right 90. So I want to start with 2 separate turtles and
> I guess I am all wrong in my idea that the long mvp commands are moving the
> eye, but moving the cube/turtle. So my next experiment will be to copy and
> edit the code beginning at the following line of code.
> 
> glGenBuffers 2;vbo=: 2#_1
> 
> So for example to make another cube/turtle I'm thinking that that line
> could be changed so that _2 replaces the _1. Does that make any sense?
> 
> *****************below I react to your code revisions***********************
> I had to change your f8 and f9 to f6 and f7 because on my Mac f8 is
> clipboard and f9 is run project.
> Now, at least when I put an smoutput into a_f6_fkey and a_f7_fkey I see
> they are being executed, but I do not see the cube, (and this happens
> without changing the focus to the Terminal window, which is needed below).
> After intially loading and running the shader.ijs script in the project
> window, I get a blank "a" window and each time I press F10 I get a new
> fresh, blank "a" window. But if I click on the Terminal window and then
> click on the "a" window and THEN press F10, I get the moving cube.
> Subsequent F6 and F7 presses produce the smoutput results in the Terminal
> window but BLANK the active "a" window.
> *****************above I react to your code revisions***********************
> 
> But the previous paragraph is mostly a distraction except that you code
> revision shows me a little about how the "handle" is important for finding
> the parent from the child and vice versa. And about repainting.
> 
> I am mostly interested in how commands in the Terminal window can be sent
> to the Cube in the "a" window. Any pointers?
> 
> 
> On Fri, Feb 14, 2020 at 1:58 AM bill lam <bbill....@gmail.com> wrote:
> 
>> I tried to incoporate your change into shader.ijs
>> with f8/f9 to change value for gl_translate.
>> The changes lines are marked by NB. <<<<<
>> pressing f8/f9 can trigger repaint and the matrix
>> display also updated, but I can't see the cube at all.
>> Pressing F10 to start original code, the cube came back.
>> I did not pursue further but hope this is enough to
>> answer your question about how to repaint.
>> 
>> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to