From: Javier Sancho Date: Mon, 24 Apr 2017 18:14:11 +0000 (+0200) Subject: Merge branch 'feature/composition' into develop X-Git-Url: https://git.jsancho.org/?p=gacela.git;a=commitdiff_plain;h=00a6aa06bc7d618a3a4c158096efaee9c43d4cd6;hp=4300a23450f99d1ddf2b30abec1a529409c076fd Merge branch 'feature/composition' into develop --- diff --git a/examples/06-composition/06-composition.scm b/examples/06-composition/06-composition.scm new file mode 100644 index 0000000..eeb1130 --- /dev/null +++ b/examples/06-composition/06-composition.scm @@ -0,0 +1,59 @@ +#!/usr/bin/env guile +!# + +;;; Gacela, a GNU Guile extension for fast games development +;;; Copyright (C) 2017 by Javier Sancho Fernandez +;;; +;;; This program is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see . + +(use-modules (gacela)) + +(define (tick) (* 3000000 (get-internal-real-time))) +(define (waggle) (* 200 (cos (* pi (tick))))) +(define (wiggle) (* 300 (sin (* pi (tick))))) +(define (swaggle) (cos (* pi (tick)))) +(define (swiggle) (sin (* pi (tick)))) + +(define homer (image "homer.png")) +(define marge (image "marge.png")) + +(define (hv-dance image1 image2) + (over (move image1 wiggle 0) + (move image2 0 waggle))) + +(define homer-marge-dance + (hv-dance homer marge)) + +(display-scene + (window ((resolution '(640 480))) + homer-marge-dance)) + +(display-scene + (window ((resolution '(640 480))) + (let ((small (scale homer-marge-dance 0.5))) + (hv-dance small small)))) + +(display-scene + (window ((resolution '(640 480))) + (scale homer-marge-dance (lambda () (abs (swiggle)))))) + +(display-scene + (window ((resolution '(640 480))) + (hv-dance (scale homer swiggle) + (scale marge swaggle)))) + +(display-scene + (window ((resolution '(640 480))) + (over (scale homer swiggle) + (move marge wiggle waggle)))) diff --git a/examples/06-composition/homer.png b/examples/06-composition/homer.png new file mode 100644 index 0000000..485e01e Binary files /dev/null and b/examples/06-composition/homer.png differ diff --git a/examples/06-composition/marge.png b/examples/06-composition/marge.png new file mode 100644 index 0000000..576092b Binary files /dev/null and b/examples/06-composition/marge.png differ diff --git a/gacela/game.scm b/gacela/game.scm index 326db78..fc0e135 100644 --- a/gacela/game.scm +++ b/gacela/game.scm @@ -137,15 +137,16 @@ milliseconds of the last iteration of the game loop." (define %gl-context #f) (define (init-window) - (sdl2:sdl-init) - (sdl2:set-gl-attribute! 'context-major-version 3) - (sdl2:set-gl-attribute! 'context-minor-version 2) - (sdl2:set-gl-attribute! 'double-buffer 1) - (sdl2:set-gl-attribute! 'depth-size 24) - (set! %sdl-window (sdl2:make-window #:opengl? #t #:show? #t)) - (set! %sdl-renderer (sdl2:make-renderer %sdl-window)) - (set! %gl-context (sdl2:make-gl-context %sdl-window)) - (sdl2:set-gl-swap-interval! 'vsync) + (when (not %sdl-window) + (sdl2:sdl-init) + (sdl2:set-gl-attribute! 'context-major-version 3) + (sdl2:set-gl-attribute! 'context-minor-version 2) + (sdl2:set-gl-attribute! 'double-buffer 1) + (sdl2:set-gl-attribute! 'depth-size 24) + (set! %sdl-window (sdl2:make-window #:opengl? #t #:show? #t)) + (set! %sdl-renderer (sdl2:make-renderer %sdl-window)) + (set! %gl-context (sdl2:make-gl-context %sdl-window)) + (sdl2:set-gl-swap-interval! 'vsync)) (init-gl)) (define (init-gl) @@ -162,8 +163,7 @@ milliseconds of the last iteration of the game loop." (sdl2:show-window! %sdl-window)) (define (close-window) - (sdl2:hide-window! %sdl-window) - (sdl2:sdl-quit)) + (sdl2:hide-window! %sdl-window)) (define (resize-window width height) (gl-viewport 0 0 width height) diff --git a/gacela/image.scm b/gacela/image.scm index e6c8f4e..236ac74 100644 --- a/gacela/image.scm +++ b/gacela/image.scm @@ -25,7 +25,8 @@ #:use-module (gl) #:export (image move - scale)) + scale + over)) (define (calculate proc-or-value) (if (procedure? proc-or-value) @@ -46,6 +47,9 @@ (set! h/2 (/ (sdl2:surface-height image) 2))) (gl-enable (oes-framebuffer-object texture-2d)) (sdl2:bind-texture texture) + (gl-enable (oes-framebuffer-object blend)) + (set-gl-blend-function (blending-factor-src src-alpha) + (blending-factor-dest one-minus-src-alpha)) (gl-begin (begin-mode quads) (gl-texture-coordinates 0 0) (gl-vertex (- w/2) h/2 0) @@ -55,6 +59,7 @@ (gl-vertex w/2 (- h/2) 0) (gl-texture-coordinates 0 1) (gl-vertex (- w/2) (- h/2) 0)) + (gl-disable (oes-framebuffer-object blend)) (gl-disable (oes-framebuffer-object texture-2d)))))) (define* (move scene x y #:optional (z 0)) @@ -70,5 +75,17 @@ (make-scene "scale" (lambda () - (gl-scale x y z) + (gl-scale (calculate x) + (calculate y) + (calculate z)) (display-scene scene)))) + +(define (over . scenes) + (make-scene + "over" + (lambda () + (let display ((sc scenes)) + (cond ((not (null? sc)) + (with-gl-push-matrix + (display-scene (car sc))) + (display (cdr sc))))))))