b69741a8d9841c23acf2c1556dba09e3c2645d1a — octaspire 7 months ago 0daea2d v0.484.0
Lightcube: fix color picking on some cases

* Fix color picking in game Lightcube in cases
  where the RED, GREEN and BLUE sizes are not
  8 by default.
M dev/include/octaspire/dern/octaspire_dern_config.h => dev/include/octaspire/dern/octaspire_dern_config.h +1 -1
@@ 18,7 18,7 @@ #define OCTASPIRE_DERN_CONFIG_H
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_MAJOR "0"
- #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "483"
+ #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "484"
  #define OCTASPIRE_DERN_CONFIG_VERSION_PATCH "0"
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_STR "Octaspire Dern version " \

M release/games/octaspire-lightcube.dern => release/games/octaspire-lightcube.dern +5 -0
@@ 2315,6 2315,11 @@   (sdl2-Init 'VIDEO)
  
+ ; Required for color picking.
+ (sdl2-GL-SetAttribute 'RED_SIZE   {D+8})
+ (sdl2-GL-SetAttribute 'GREEN_SIZE {D+8})
+ (sdl2-GL-SetAttribute 'BLUE_SIZE  {D+8})
+ 
  (define window   as (sdl2-CreateWindow [octaspire-maze] 'CENTERED 'CENTERED {D+640} {D+640}) [window])
  (define renderer as (sdl2-CreateRenderer window {D-1} 'SOFTWARE) [renderer])
  

M release/octaspire-dern-amalgamated.c => release/octaspire-dern-amalgamated.c +1 -1
@@ 26336,7 26336,7 @@ #define OCTASPIRE_DERN_CONFIG_H
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_MAJOR "0"
- #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "483"
+ #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "484"
  #define OCTASPIRE_DERN_CONFIG_VERSION_PATCH "0"
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_STR "Octaspire Dern version " \

M release/plugins/dern_sdl2.c => release/plugins/dern_sdl2.c +118 -0
@@ 7089,6 7089,112 @@ #ifdef _MSC_VER
  extern __declspec(dllexport)
  #endif
+ octaspire_dern_value_t *dern_sdl2_GL_SetAttribute(
+     octaspire_dern_vm_t * const vm,
+     octaspire_dern_value_t * const arguments,
+     octaspire_dern_value_t * const environment)
+ {
+     OCTASPIRE_HELPERS_UNUSED_PARAMETER(environment);
+ 
+     size_t const stackLength = octaspire_dern_vm_get_stack_length(vm);
+     char   const * const dernFuncName    = "sdl2-GL-SetAttribute";
+     size_t const         numExpectedArgs = 2;
+ 
+     size_t const numArgs =
+         octaspire_dern_value_as_vector_get_length(arguments);
+ 
+     if (numArgs != numExpectedArgs)
+     {
+         octaspire_helpers_verify_true(
+             stackLength == octaspire_dern_vm_get_stack_length(vm));
+ 
+         return octaspire_dern_vm_create_new_value_error_format(
+             vm,
+             "Builtin '%s' expects %zu arguments. "
+             "%zu arguments were given.",
+             dernFuncName,
+             numExpectedArgs,
+             numArgs);
+     }
+ 
+     // name
+ 
+     // TODO XXX Add rest of supported names.
+     char const * const attrNames[] =
+     {
+         "RED_SIZE",
+         "GREEN_SIZE",
+         "BLUE_SIZE",
+         0
+     };
+ 
+     octaspire_dern_one_of_texts_or_unpushed_error_const_t textOrErrorAttrName =
+         octaspire_dern_value_as_vector_get_element_at_as_one_of_texts_or_unpushed_error_const(
+             arguments,
+             0,
+             dernFuncName,
+             attrNames);
+ 
+     if (textOrErrorAttrName.unpushedError)
+     {
+         octaspire_helpers_verify_true(
+             stackLength == octaspire_dern_vm_get_stack_length(vm));
+ 
+         return textOrErrorAttrName.unpushedError;
+     }
+ 
+     octaspire_helpers_verify_true(
+         textOrErrorAttrName.index >= 0 && textOrErrorAttrName.index <= 2);
+ 
+     SDL_GLattr attr = 0;
+ 
+     switch (textOrErrorAttrName.index)
+     {
+         case 0: { attr = SDL_GL_RED_SIZE;   } break;
+         case 1: { attr = SDL_GL_GREEN_SIZE; } break;
+         case 2: { attr = SDL_GL_BLUE_SIZE;  } break;
+     }
+ 
+     // value
+ 
+     octaspire_dern_number_or_unpushed_error_const_t numberOrError =
+         octaspire_dern_value_as_vector_get_element_at_as_number_or_unpushed_error_const(
+             arguments,
+             1,
+             dernFuncName);
+ 
+     if (numberOrError.unpushedError)
+     {
+         octaspire_helpers_verify_true(
+             stackLength == octaspire_dern_vm_get_stack_length(vm));
+ 
+         return numberOrError.unpushedError;
+     }
+ 
+     // Set the attribute.
+ 
+     int const result = SDL_GL_SetAttribute(
+         attr,
+         (int)numberOrError.number);
+ 
+     octaspire_helpers_verify_true(
+         stackLength == octaspire_dern_vm_get_stack_length(vm));
+ 
+     if (result == 0)
+     {
+         return octaspire_dern_vm_create_new_value_boolean(vm, true);
+     }
+ 
+     return octaspire_dern_vm_create_new_value_error_format(
+         vm,
+         "Builtin '%s' failed: %s.",
+         dernFuncName,
+         SDL_GetError());
+ }
+ 
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_SetRenderDrawColor(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 9285,6 9391,18 @@       if (!octaspire_dern_vm_create_and_register_new_builtin(
              vm,
+             "sdl2-GL-SetAttribute",
+             dern_sdl2_GL_SetAttribute,
+             2,
+             "(sdl2-GL-SetAttribute name value) -> <true or error message>",
+             true,
+             targetEnv))
+     {
+         return false;
+     }
+ 
+     if (!octaspire_dern_vm_create_and_register_new_builtin(
+             vm,
              "sdl2-RenderDrawPoint",
              dern_sdl2_RenderDrawPoint,
              3,