cl-raylib icon indicating copy to clipboard operation
cl-raylib copied to clipboard

Draw to render texture, then show in window does not seem to work.

Open ruffianeo opened this issue 1 year ago • 1 comments

;; Main Loop
(loop
      with compute = t
      while (not (window-should-close))
      when compute
        do (progn
             (pre-compute-mandel-set mandel)  ;; renders mandel set into texture using DrawPixel
             (setf compute nil))
      do (let ((game-time (cl-raylib:get-time)))
           (begin-drawing)
           (clear-background
            *status-panel-background-color*)
           (render-visual mandel game-time) ;; see below - simply draws the texture.
           (end-drawing)))

;; Pre-compute
(defun pre-compute-mandel-set (state)
  (unless (mandel-target-texture state)
    (setf (mandel-target-texture state)
          (load-render-texture (visual-width state) (visual-height state))))
  (format t "computing...")
  (begin-texture-mode (mandel-target-texture state)) ;; tests in C show I don't need clear-background here.
  (loop
    for y below (visual-height state)
    do (loop
         for x below (visual-width state)
         do (draw-pixel
             x y (mandel-core
                  state
                  y x))))
  (draw-line (visual-left state)
                 (visual-top state)
                 (+ (visual-left state) (visual-width state))
                 (+ (visual-top state) (visual-height state))
                 (make-rgba 255 0 0))
  (end-texture-mode)
  (format t "...done!~%"))

;; transfer from texture to screen
(defmethod render-visual ((state mandel-state) game-time)
  (let ((target-texture (mandel-target-texture state)))
    (when target-texture
      (draw-texture
       (render-texture-texture target-texture)
       (visual-left state) (visual-top state) (make-rgba 0 0 0)))))

Neither the set pixels nor the line drawn to the texture ever show on the screen. To see if it is raylib or the bindings (or me?!), here my C test code:

#include <raylib.h>
#include <stddef.h>

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

static void pre_render_something(RenderTexture2D*texture) {
  int x;
  int y;
  Color color;
  
  BeginTextureMode(*texture);
  for (size_t i = 0; i< 1000; i++) {
    x = GetRandomValue(0,WINDOW_WIDTH);
    y = GetRandomValue(0,WINDOW_HEIGHT);
    color.r = GetRandomValue(0,255);
    color.g = GetRandomValue(0,255);
    color.b = GetRandomValue(0,255);
    color.a = 255;
    DrawPixel(x,y,color);
    DrawPixel(x+1,y,color);
    DrawPixel(x,y+1,color);
    DrawPixel(x+1,y+1,color);
  }
  EndTextureMode();
}

int main () {
  InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Draw Pixels into texture.");

  SetRandomSeed(6969);
  SetTargetFPS(20);
  
  RenderTexture2D tex = LoadRenderTexture(WINDOW_WIDTH,WINDOW_HEIGHT);
  pre_render_something(&tex);
  
  while (!WindowShouldClose()) {
    BeginDrawing();
    ClearBackground(RAYWHITE);
    DrawTexture(tex.texture,0,0,RAYWHITE);
    EndDrawing();
  }
  CloseWindow();
    
  return 0;
}

With the C code (which nominally does the very same logical sequence as the lisp code), the pixels show as expected.

ruffianeo avatar Dec 27 '24 20:12 ruffianeo

I recommend to close this issue, since the code below is working. So it must be a problem in my code, even though I am not sure, where. Storing the RenderTexture2D instance in a CLOS object might have to do with it.

(defun render-to-texture (&key
                     (window-width 1024)
                     (window-height 1024))
  (init-window window-width window-height "Game of Life")
  (set-target-fps 20)
  (let ((texture (load-render-texture window-width window-height)))
    (begin-texture-mode texture)
    (draw-line 0 0 window-width window-height (make-rgba 255 255 0))
    (draw-pixel 100 200 (make-rgba 0 0 255))
    (draw-pixel 101 200 (make-rgba 0 0 255))
    (draw-pixel 100 201 (make-rgba 0 0 255))
    (draw-pixel 101 201 (make-rgba 0 0 255))
    (end-texture-mode)
    (loop
      while (not (window-should-close))
      do (progn
           (begin-drawing)
           (clear-background (make-rgba 0 0 0))
           (draw-texture (render-texture-texture texture)
                         0 0 (make-rgba 255 255 255))
           (end-drawing)))
    (unload-render-texture texture))
  (close-window))

ruffianeo avatar Dec 28 '24 06:12 ruffianeo