:- use_foreign_library(foreign(plOpenGL)). :- use_module(library(plOpenGL)). :- use_module(library(plGL_defs)). :- use_module(library(plGLU_defs)). :- use_module(library(plGLUT_defs)). :- use_module(library(plGL)). :- use_module(library(plGLU)). :- use_module(library(plGLUT)). % alpha.pl % This program draws several overlapping filled polygons % to demonstrate the effect order has on alpha blending results. % Use the 't' key to toggle the order of drawing polygons. :- dynamic leftFirst/1. width(400). height(400). leftFirst(1). display:- % defs kGL_COLOR_BUFFER_BIT(COLOR_BUFFER), % gl code glClear(COLOR_BUFFER), ( leftFirst(1) -> draw_left_triangle, draw_right_triangle ; draw_right_triangle, draw_left_triangle ), glFlush. init:- % defs kGL_BLEND(BLEND), kGL_SRC_ALPHA(ALPHA), kGL_FLAT(FLAT), kGL_ONE_MINUS_SRC_ALPHA(MINUS_ALPHA), % gl code glEnable(BLEND), glBlendFunc(ALPHA, MINUS_ALPHA), glShadeModel(FLAT), glClearColor(0.0, 0.0, 0.0, 0.0). draw_left_triangle :- % defs kGL_TRIANGLES(TRIANGLE), % gl code glBegin(TRIANGLE), glColor4f(1.0, 1.0, 0.0, 0.75), glVertex3f(0.1, 0.9, 0.0), glVertex3f(0.1, 0.1, 0.0), glVertex3f(0.7, 0.5, 0.0), glEnd. draw_right_triangle :- % defs kGL_TRIANGLES(TRIANGLE), % gl code glBegin(TRIANGLE), glColor4f(0.0, 1.0, 1.0, 0.75), glVertex3f(0.9, 0.9, 0.0), glVertex3f(0.3, 0.5, 0.0), glVertex3f(0.9, 0.1, 0.0), glEnd. reshape:- % defs X is 0, Y is 0, width(W), width(H), kGL_PROJECTION(PROJECTION), % gl code glViewport(X,Y,W,H), glMatrixMode(PROJECTION), glLoadIdentity, ( W =< H -> Aspect is float(H) / float(W), gluOrtho2D(0.0, 1.0, 0.0, Aspect) ; Aspect is float(W) / float(H), gluOrtho2D(0.0, Aspect, 0.0, 1.0) ). % 27 is ASCII Code for Escape keyboard(27,_,_) :- write('Closing Window and Exiting...'),nl, glutDestroyWindow. % 84 is ASCII Code for T keyboard(84,_,_) :- ( leftFirst(1) -> retract(leftFirst(1)), assert(leftFirst(0)) ; retract(leftFirst(0)), assert(leftFirst(1)) ), glutPostRedisplay. % 116 is ASCII Code for t keyboard(116,_,_) :- ( leftFirst(1) -> retract(leftFirst(1)), assert(leftFirst(0)) ; retract(leftFirst(0)), assert(leftFirst(1)) ), glutPostRedisplay. main:- % defs width(W), height(H), kGLUT_SINGLE(SINGLE), kGLUT_RGB(RGB), % gl code glutInit, glutInitDisplayMode(SINGLE \/ RGB), glutInitWindowSize(W, H), glutInitWindowPosition(0,0), glutCreateWindow('Alpha'), init, glutDisplayFunc, glutReshapeFunc, glutKeyboardFunc, glutMainLoop.