NB. OpGLN_Rubik.ijs NB. 2011/9/19 NB. referred from OpGLN3.ijs wr =: 1!:2&2 require 'opengl gl3' coinsert 'jgl3' A=: 0 : 0 pc a closeok;pn "Rubik Cube Simulated"; menupop "&Help"; menu help "&Help" "" "" ""; menupopz; xywh 6 22 200 200;cc g isigraph opengl rightmove bottommove; xywh 211 93 34 11;cc Reset button; xywh 209 23 34 11;cc Step button; xywh 210 43 34 11;cc Auto button; xywh 7 6 121 11;cc Program edit ws_border es_autohscroll; pas 0 0; rem form end; ) NB. Color Definition ======================== NB. revised for OpenGL spec. 2011/10/12 R =: 1 0 0 NB. red O =: 1 0.64 0 NB. orange NB. O =: 1 0.27 NB. orange red Y =: 1 1 0 NB. yellow G =: 0 1 0 NB. green W =: 1 1 1 NB. white B =: 0 0 1 NB. blue p =: 0 0.8 0.7 NB. sky blue for work Q =: 0 0 0 NB. black test_C =: 'PGGGGGQGG' run=: a_run a_run=: 3 : 0 wd :: ] 'psel a;pclose' wd A NB. glaRC '' ogl =: '' conew 'jzopengl' NB. for J6 RR =: 0 0 0 Key =: '' NB. Initial Color Setting for Rubik Cube =========== if. 0 = #y do. S_COL =: 'YYYYYYYYY' E_COL =: 'OOOOOOOOO' W_COL =: 'RRRRRRRRR' T_COL =: 'WWWWWWWWW' B_COL =: 'BBBBBBBBB' N_COL =: 'GGGGGGGGG' NB. N_COL =: test_C else. init_color y NB. change color patterns in several books end. istep =: 0 wd 'pshow;ptop' ) a_close=: 3 : 0 destroy__ogl'' wd'pclose' ) NB. display the model picture ======================================= a_g_paint =: verb define RC =: rc__ogl '' if. RC do. g_draw_init wh__ogl end. g_draw_rubik '' g_draw_frames '' g_drawtext '' show__ogl'' ) NB. key-in x, y, z, X, Y, Z for rotation ================ a_g_char =: verb define RR =: 360 | RR + 5 * 'xyz' = 0 { sysdata RR =: 360 | RR - 5 * 'XYZ' = 0 { sysdata NB. Change Color of Cubies for Rubik Moves ============= KK0 =. 0 { sysdata sel_color KK0 NB. move Rubik and change color KK1 =. KK0 -. 'xyzXYZ' Key =: Key, KK1 NB. record of moves a_g_paint'' ) NB. project the picture on the screen / added for J6==== g_draw_init=: 3 : 0 glViewport 0 0,y ('arial';30) glaUseFontBitmaps__ogl 32 95 32 glMatrixMode GL_PROJECTION glLoadIdentity'' glOrtho _2.5 2.5 _2.5 2.5 _2.5 2.5 NB. gluPerspective 30, (%/y),1 10 ) sel_color =: 3 : 0 S_C =. S_COL T_C =. T_COL E_C =. E_COL W_C =. W_COL N_C =. N_COL B_C =. B_COL select. y case. 'e' do. E_COL =: , |: |. (3 3)$E_C S_COL =: ((2 5 8){B_C) (2 5 8) } S_C T_COL =: ((2 5 8){S_C) (2 5 8) } T_C N_COL =: ((8 5 2){T_C) (0 3 6) } N_C NB. revised by N-face B_COL =: ((0 3 6){N_C) (8 2 5) } B_C NB. revised by N-face case. 'E' do. E_COL =: , |: |."(1) (3 3)$E_C S_COL =: ((2 5 8){T_C) (2 5 8) } S_C T_COL =: ((0 3 6){N_C) (8 5 2) } T_C NB. revised by N-face N_COL =: ((8 5 2){B_C) (0 3 6) } N_C NB. revised by N-face B_COL =: ((2 5 8){S_C) (2 5 8) } B_C case. 'w' do. W_COL =: , |: |. (3 3)$W_C T_COL =: ((8 5 2){N_C) (0 3 6) } T_C NB. revised by N-face S_COL =: ((0 3 6){T_C) (0 3 6) } S_C B_COL =: ((0 3 6){S_C) (0 3 6) } B_C N_COL =: ((0 3 6){B_C) (8 5 2) } N_C NB. revised by N-face case. 'W' do. W_COL =: , |: |."(1) (3 3)$W_C T_COL =: ((0 3 6){S_C) (0 3 6) } T_C S_COL =: ((0 3 6){B_C) (0 3 6) } S_C B_COL =: ((8 5 2){N_C) (0 3 6) } B_C NB. revised by N-face N_COL =: ((0 3 6){T_C) (8 5 2) } N_C case. 'n' do. N_COL =: , |: |. (3 3)$N_C B_COL =: ((0 3 6){W_C) (6 7 8) } B_C E_COL =: ((6 7 8){B_C) (8 5 2) } E_C T_COL =: ((8 5 2){E_C) (2 1 0) } T_C W_COL =: ((2 1 0){T_C) (0 3 6) } W_C case. 'N' do. N_COL =: , |: |."(1) (3 3)$N_C B_COL =: ((8 5 2){E_C) (6 7 8) } B_C E_COL =: ((2 1 0){T_C) (8 5 2) } E_C T_COL =: ((0 3 6){W_C) (2 1 0) } T_C W_COL =: ((6 7 8){B_C) (0 3 6) } W_C case. 't' do. T_COL =: , |: |. (3 3)$T_C N_COL =: ((2 1 0){W_C) (2 1 0) } N_C NB. revised by N-face E_COL =: ((2 1 0){N_C) (2 1 0) } E_C NB. revised by N-face S_COL =: ((2 1 0){E_C) (2 1 0) } S_C W_COL =: ((2 1 0){S_C) (2 1 0) } W_C case. 'T' do. T_COL =: , |: |."(1) (3 3)$T_C N_COL =: ((2 1 0){E_C) (2 1 0) } N_C NB. revised by N-face E_COL =: ((2 1 0){S_C) (2 1 0) } E_C S_COL =: ((2 1 0){W_C) (2 1 0) } S_C W_COL =: ((2 1 0){N_C) (2 1 0) } W_C NB. revised by N-face case. 's' do. S_COL =: , |: |. (3 3)$S_C T_COL =: ((8 5 2){W_C) (6 7 8) } T_C E_COL =: ((6 7 8){T_C) (0 3 6) } E_C B_COL =: ((0 3 6){E_C) (2 1 0) } B_C W_COL =: ((2 1 0){B_C) (8 5 2) } W_C case. 'S' do. S_COL =: , |: |."(1) (3 3)$S_C T_COL =: ((0 3 6){E_C) (6 7 8) } T_C E_COL =: ((2 1 0){B_C) (0 3 6) } E_C B_COL =: ((8 5 2){W_C) (2 1 0) } B_C W_COL =: ((6 7 8){T_C) (8 5 2) } W_C case. 'b' do. B_COL =: , |: |. (3 3)$B_C S_COL =: ((6 7 8){W_C) (6 7 8) } S_C E_COL =: ((6 7 8){S_C) (6 7 8) } E_C N_COL =: ((6 7 8){E_C) (6 7 8) } N_C NB. revised by N-face W_COL =: ((6 7 8){N_C) (6 7 8) } W_C NB. revised by N-face case. 'B' do. B_COL =: , |: |."(1) (3 3)$B_C S_COL =: ((6 7 8){E_C) (6 7 8) } S_C E_COL =: ((6 7 8){N_C) (6 7 8) } E_C NB. revised by N-face N_COL =: ((6 7 8){W_C) (6 7 8) } N_C NB. revised by N-face W_COL =: ((6 7 8){S_C) (6 7 8) } W_C NB. move through innner center and edge cubies 2011/10/6 case. 'i' do. S_COL =: ((3 4 5){W_C) (3 4 5) } S_C W_COL =: ((3 4 5){N_C) (3 4 5) } W_C N_COL =: ((3 4 5){E_C) (3 4 5) } N_C E_COL =: ((3 4 5){S_C) (3 4 5) } E_C case. 'I' do. S_COL =: ((3 4 5){E_C) (3 4 5) } S_C W_COL =: ((3 4 5){S_C) (3 4 5) } W_C N_COL =: ((3 4 5){W_C) (3 4 5) } N_C E_COL =: ((3 4 5){N_C) (3 4 5) } E_C case. 'j' do. S_COL =: ((1 4 7){B_C) (1 4 7) } S_C T_COL =: ((1 4 7){S_C) (1 4 7) } T_C N_COL =: ((1 4 7){T_C) (7 4 1) } N_C B_COL =: ((7 4 1){N_C) (1 4 7) } B_C case. 'J' do. S_COL =: ((1 4 7){T_C) (1 4 7) } S_C T_COL =: ((7 4 1){N_C) (1 4 7) } T_C N_COL =: ((1 4 7){B_C) (7 4 1) } N_C B_COL =: ((1 4 7){S_C) (1 4 7) } B_C case. 'k' do. E_COL =: ((5 4 3){B_C) (1 4 7) } E_C T_COL =: ((1 4 7){E_C) (3 4 5) } T_C W_COL =: ((3 4 5){T_C) (7 4 1) } W_C B_COL =: ((7 4 1){W_C) (5 4 3) } B_C case. 'K' do. E_COL =: ((3 4 5){T_C) (1 4 7) } E_C T_COL =: ((7 4 1){W_C) (3 4 5) } T_C W_COL =: ((5 4 3){B_C) (7 4 1) } W_C B_COL =: ((1 4 7){E_C) (5 4 3) } B_C end. ) NB. indicate rotated angle values x, y, z in degree ============ g_drawtext =: verb define glMatrixMode GL_MODELVIEW glLoadIdentity '' glColor 0 0 0 0 glRasterPos _2.0 2.0 0 glaCallLists Key NB. revised for J6 glRasterPos _2.0 _2.0 0 glaCallLists (5 ": RR) NB. revised for J6 ) a_help_button =: verb define wd 'mb OpenGL *Keys, x/X, y/Y, z/Z rotate, e/E, w/W, t/T, b/B, s/S, n/N move Rubik. ' wd 'setfocus g' ) a_Reset_button=: 3 : 0 glClearColor 1 1 1 0 glClear GL_COLOR_BUFFER_BIT S_COL =: 'YYYYYYYYY' E_COL =: 'OOOOOOOOO' W_COL =: 'RRRRRRRRR' T_COL =: 'WWWWWWWWW' B_COL =: 'BBBBBBBBB' N_COL =: 'GGGGGGGGG' g_draw_rubik '' g_draw_frames '' Key =: '' g_drawtext '' istep =: 0 a_g_paint'' NB. revised fo J6 NB. glaSwapBuffers '' wd 'setfocus g' ) a_Program_button=: 3 : 0 PDA =: Program wd 'setfocus g' ) a_Step_button=: 3 : 0 if. istep < #PDA do. sel_color istep{PDA g_draw_rubik '' g_draw_frames '' a_g_paint'' NB. revised fo J6 istep =: istep + 1 end. wd 'setfocus g' ) a_Auto_button=: 3 : 0 glClearColor 1 1 1 0 glClear GL_COLOR_BUFFER_BIT S_COL =: 'YYYYYYYYY' E_COL =: 'OOOOOOOOO' W_COL =: 'RRRRRRRRR' T_COL =: 'WWWWWWWWW' B_COL =: 'BBBBBBBBB' N_COL =: 'GGGGGGGGG' sel_color L:0 <"(0) PDA g_draw_rubik '' g_draw_frames '' Key =: '' g_drawtext '' PDA =: '' a_g_paint'' NB. revised fo J6 NB. glaSwapBuffers '' wd 'setfocus g' ) NB. Calc. Cubie Points ================================================ Point =: |. |: {(i:1);(i:1) NB. Along -Z axis (looking far), square_numbered counter_clockwise! ==== boundary =: 3 : 0 'X Y' =. y ((0.5+X), 0.5+Y);((_0.5+X), 0.5+Y);((_0.5+X), _0.5+Y);((0.5+X), _0.5+Y) ) Bound =. >, boundary L:0 Point S_P =: (,&1.5) L:0 Bound E_P =: |. L:0 Bound E_P =: ({. , (-@{:)) L:0 E_P E_P =: (1.5&,) L:0 E_P W_P =: |. L:0 Bound W_P =: (_1.5&,) L:0 W_P T_P =: ({. , (-@{:)) L:0 Bound T_P =: (1.5&,) L:0 T_P T_P =: ((1 0 2)&{) L:0 T_P B_P =: (_1.5&,) L:0 Bound B_P =: ((1 0 2)&{) L:0 B_P N_P =: ((-@{.), {:) L:0 Bound N_P =: (,&_1.5) L:0 N_P NB. Set Color of Cubies ================================================== NB. test_COL =: 'RED';'RED';'GREEN';'GREEN';'GREEN';'GREEN';'BLUE';'RED';'BLUE' face_col =: 3 : 0 : i =. 0 while. i < 9 do. (". i{x) polygon >i{y i =. i + 1 end. ) polygon=: 4 : 0 glColor4d 4{.x, 1 NB. revised for J6 glBegin GL_POLYGON glVertex y glEnd '' ) g_draw_rubik =: 3 : 0 glClearColor 1 1 1 0 glClear GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT glEnable GL_DEPTH_TEST glMatrixMode GL_MODELVIEW glLoadIdentity '' glTranslate 0 0 _1 glRotate RR ,. 3 3 $ 1 0 0 0 glPolygonMode GL_FRONT, GL_FILL NB. Front and Back: Full Paint glPolygonMode GL_BACK, GL_POINT NB. Back: Point(Hidden) glBegin GL_QUADS (>B_COL) face_col (0.6&*) L:0 B_P NB. reduced 0.6 size (>W_COL) face_col (0.6&*) L:0 W_P (>T_COL) face_col (0.6&*) L:0 T_P (>E_COL) face_col (0.6&*) L:0 E_P (>N_COL) face_col (0.6&*) L:0 N_P (>S_COL) face_col (0.6&*) L:0 S_P glEnd '' ) NB. Frame Cubies == 2011/9/23 ==================================== face_frame =: 3 : 0 i =. 0 while. i < 9 do. fpolygon i{y i =. i + 1 end. ) fpolygon=: 3 : 0 NB. glColor4d 4{.x, 1 NB. revised for J6 glColor4d 0 0 0 1 glBegin GL_POLYGON glVertex y glEnd '' ) g_draw_frames =: 3 : 0 glMatrixMode GL_MODELVIEW glLoadIdentity '' glTranslate 0 0 _1 glRotate RR ,. 3 3 $ 1 0 0 0 glPolygonMode GL_FRONT, GL_LINE NB. Front and Back: Full Paint glPolygonMode GL_BACK, GL_POINT NB. Back: Point(Hidden) face_frame > (0.6&*) L:0 S_P face_frame > (0.6&*) L:0 T_P face_frame > (0.6&*) L:0 E_P face_frame > (0.6&*) L:0 W_P face_frame > (0.6&*) L:0 N_P face_frame > (0.6&*) L:0 B_P ) NB. Old Version make cubic as a model =================================== NB. Vertex Values PP =: ] ;._2 (0 : 0) 0.5 0.5 0.5 _0.5 0.5 0.5 _0.5 _0.5 0.5 0.5 _0.5 0.5 0.5 0.5 _0.5 _0.5 0.5 _0.5 _0.5 _0.5 _0.5 0.5 _0.5 _0.5 ) PP =: ". PP PP =: 1.5 * PP NB. Draw Vertex draw =: verb define glMatrixMode GL_MODELVIEW glLoadIdentity '' glTranslate 0 0 _1 glRotate R ,. 3 3 $ 1 0 0 0 if. LS = 0 do. glPolygonMode GL_FRRONT, GL_LINE NB. Paint line else. glPolygonMode GL_FRONT_AND_BACK, GL_FILL NB. Paint full end. glPolygonMode GL_BACK, Hid{GL_LINE, GL_POINT NB. Hidden glBegin GL_QUADS NB. (_X)-Y plane Back Face-Yellow glColor 1 1 0 0 glVertex 4{PP glVertex 7{PP glVertex 6{PP glVertex 5{PP NB. (_Z)-X plane Top Face-Aqua glColor 0 1 1 0 glVertex 0{PP glVertex 4{PP glVertex 5{PP glVertex 1{PP NB. X-Z plane Bottom Face-Black glColor 0 0 0 0 glVertex 2{PP glVertex 6{PP glVertex 7{PP glVertex 3{PP NB. Z-Y plane Left Face-Blue glColor 0 0 1 0 glVertex 1{PP glVertex 5{PP glVertex 6{PP glVertex 2{PP NB. (_Z)-Y plane Right Face-Green glColor 0 1 0 0 glVertex 0{PP glVertex 3{PP glVertex 7{PP glVertex 4{PP NB. X-Y plane Front Face-Red glColor 1 0 0 0 glVertex 0{PP glVertex 1{PP glVertex 2{PP glVertex 3{PP glEnd '' )