SAPI: Accept either ARGB8 table or ColorString to specify colors
parent
8f9af57314
commit
fb36c471d7
|
@ -1607,6 +1607,16 @@ To specify the value of the alpha channel, append `#AA` to the end of the color
|
||||||
(e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha
|
(e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha
|
||||||
value must (always) be two hexadecimal digits.
|
value must (always) be two hexadecimal digits.
|
||||||
|
|
||||||
|
`ColorSpec`
|
||||||
|
-----------
|
||||||
|
A ColorSpec specifies a 32-bit color. It can be written in either:
|
||||||
|
table form, each element ranging from 0..255 (a, if absent, defaults to 255):
|
||||||
|
`colorspec = {a=255, r=0, g=255, b=0}`
|
||||||
|
numerical form, the raw integer value of an ARGB8 quad:
|
||||||
|
`colorspec = 0xFF00FF00`
|
||||||
|
or string form, a ColorString (defined above):
|
||||||
|
`colorspec = "green"`
|
||||||
|
|
||||||
Vector helpers
|
Vector helpers
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
@ -2481,7 +2491,7 @@ This is basically a reference to a C++ `ServerActiveObject`
|
||||||
* `name`: `"breath"` or `"health"`
|
* `name`: `"breath"` or `"health"`
|
||||||
* `hud_definition`: definition to replace builtin definition
|
* `hud_definition`: definition to replace builtin definition
|
||||||
* `set_sky(bgcolor, type, {texture names})`
|
* `set_sky(bgcolor, type, {texture names})`
|
||||||
* `bgcolor`: `{r=0...255, g=0...255, b=0...255}` or `nil`, defaults to white
|
* `bgcolor`: ColorSpec, defaults to white
|
||||||
* Available types:
|
* Available types:
|
||||||
* `"regular"`: Uses 0 textures, `bgcolor` ignored
|
* `"regular"`: Uses 0 textures, `bgcolor` ignored
|
||||||
* `"skybox"`: Uses 6 textures, `bgcolor` used
|
* `"skybox"`: Uses 6 textures, `bgcolor` used
|
||||||
|
@ -2507,13 +2517,13 @@ This is basically a reference to a C++ `ServerActiveObject`
|
||||||
* `get_nametag_attributes()`
|
* `get_nametag_attributes()`
|
||||||
* returns a table with the attributes of the nametag of the player
|
* returns a table with the attributes of the nametag of the player
|
||||||
* {
|
* {
|
||||||
color = { a = 0...255, r = 0...255, g = 0...255, b = 0...255 }
|
color = {a=0..255, r=0..255, g=0..255, b=0..255},
|
||||||
}
|
}
|
||||||
* `set_nametag_attributes(attributes)`
|
* `set_nametag_attributes(attributes)`
|
||||||
* sets the attributes of the nametag of the player
|
* sets the attributes of the nametag of the player
|
||||||
* `attributes`:
|
* `attributes`:
|
||||||
{
|
{
|
||||||
color = { a = 0...255, r = 0...255, g = 0...255, b = 0...255 }
|
color = ColorSpec,
|
||||||
}
|
}
|
||||||
|
|
||||||
### `InvRef`
|
### `InvRef`
|
||||||
|
@ -3023,7 +3033,7 @@ Definition tables
|
||||||
^ List can be shortened to needed length ]]
|
^ List can be shortened to needed length ]]
|
||||||
alpha = 255,
|
alpha = 255,
|
||||||
use_texture_alpha = false, -- Use texture's alpha channel
|
use_texture_alpha = false, -- Use texture's alpha channel
|
||||||
post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
|
post_effect_color = "green#0F", -- If player is inside node, see "ColorSpec"
|
||||||
paramtype = "none", -- See "Nodes" --[[
|
paramtype = "none", -- See "Nodes" --[[
|
||||||
^ paramtype = "light" allows light to propagate from or through the node with light value
|
^ paramtype = "light" allows light to propagate from or through the node with light value
|
||||||
^ falling by 1 per node. This line is essential for a light source node to spread its light. ]]
|
^ falling by 1 per node. This line is essential for a light source node to spread its light. ]]
|
||||||
|
|
|
@ -162,18 +162,13 @@ void read_object_properties(lua_State *L, int index,
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
lua_getfield(L, -1, "colors");
|
lua_getfield(L, -1, "colors");
|
||||||
if(lua_istable(L, -1)){
|
if (lua_istable(L, -1)) {
|
||||||
prop->colors.clear();
|
|
||||||
int table = lua_gettop(L);
|
int table = lua_gettop(L);
|
||||||
lua_pushnil(L);
|
prop->colors.clear();
|
||||||
while(lua_next(L, table) != 0){
|
for (lua_pushnil(L); lua_next(L, table); lua_pop(L, 1)) {
|
||||||
// key at index -2 and value at index -1
|
video::SColor color(255, 255, 255, 255);
|
||||||
if(lua_isstring(L, -1))
|
read_color(L, -1, &color);
|
||||||
prop->colors.push_back(readARGB8(L, -1));
|
prop->colors.push_back(color);
|
||||||
else
|
|
||||||
prop->colors.push_back(video::SColor(255, 255, 255, 255));
|
|
||||||
// removes value, keeps key for next iteration
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
@ -357,8 +352,7 @@ ContentFeatures read_content_features(lua_State *L, int index)
|
||||||
/* Other stuff */
|
/* Other stuff */
|
||||||
|
|
||||||
lua_getfield(L, index, "post_effect_color");
|
lua_getfield(L, index, "post_effect_color");
|
||||||
if(!lua_isnil(L, -1))
|
read_color(L, -1, &f.post_effect_color);
|
||||||
f.post_effect_color = readARGB8(L, -1);
|
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
f.param_type = (ContentParamType)getenumfield(L, index, "paramtype",
|
f.param_type = (ContentParamType)getenumfield(L, index, "paramtype",
|
||||||
|
|
|
@ -23,35 +23,23 @@ extern "C" {
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "util/numeric.h"
|
#include "util/numeric.h"
|
||||||
|
#include "util/string.h"
|
||||||
#include "common/c_converter.h"
|
#include "common/c_converter.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
|
|
||||||
|
|
||||||
#define CHECK_TYPE(index, name, type) do { \
|
#define CHECK_TYPE(index, name, type) do { \
|
||||||
int t = lua_type(L, (index)); \
|
int t = lua_type(L, (index)); \
|
||||||
if (t != (type)) { \
|
if (t != (type)) { \
|
||||||
throw LuaError(std::string("Invalid ") + (name) + \
|
throw LuaError(std::string("Invalid ") + (name) + \
|
||||||
" (expected " + lua_typename(L, (type)) + \
|
" (expected " + lua_typename(L, (type)) + \
|
||||||
" got " + lua_typename(L, t) + ")."); \
|
" got " + lua_typename(L, t) + ")."); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER)
|
#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER)
|
||||||
#define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE)
|
#define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE)
|
||||||
|
|
||||||
|
|
||||||
void push_ARGB8(lua_State *L, video::SColor color)
|
|
||||||
{
|
|
||||||
lua_newtable(L);
|
|
||||||
lua_pushnumber(L, color.getAlpha());
|
|
||||||
lua_setfield(L, -2, "a");
|
|
||||||
lua_pushnumber(L, color.getRed());
|
|
||||||
lua_setfield(L, -2, "r");
|
|
||||||
lua_pushnumber(L, color.getGreen());
|
|
||||||
lua_setfield(L, -2, "g");
|
|
||||||
lua_pushnumber(L, color.getBlue());
|
|
||||||
lua_setfield(L, -2, "b");
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_v3f(lua_State *L, v3f p)
|
void push_v3f(lua_State *L, v3f p)
|
||||||
{
|
{
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
@ -176,6 +164,19 @@ v3f check_v3f(lua_State *L, int index)
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void push_ARGB8(lua_State *L, video::SColor color)
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
lua_pushnumber(L, color.getAlpha());
|
||||||
|
lua_setfield(L, -2, "a");
|
||||||
|
lua_pushnumber(L, color.getRed());
|
||||||
|
lua_setfield(L, -2, "r");
|
||||||
|
lua_pushnumber(L, color.getGreen());
|
||||||
|
lua_setfield(L, -2, "g");
|
||||||
|
lua_pushnumber(L, color.getBlue());
|
||||||
|
lua_setfield(L, -2, "b");
|
||||||
|
}
|
||||||
|
|
||||||
void pushFloatPos(lua_State *L, v3f p)
|
void pushFloatPos(lua_State *L, v3f p)
|
||||||
{
|
{
|
||||||
p /= BS;
|
p /= BS;
|
||||||
|
@ -212,13 +213,31 @@ v3s16 check_v3s16(lua_State *L, int index)
|
||||||
return floatToInt(pf, 1.0);
|
return floatToInt(pf, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
video::SColor readARGB8(lua_State *L, int index)
|
bool read_color(lua_State *L, int index, video::SColor *color)
|
||||||
|
{
|
||||||
|
if (lua_istable(L, index)) {
|
||||||
|
*color = read_ARGB8(L, index);
|
||||||
|
} else if (lua_isnumber(L, index)) {
|
||||||
|
color->set(lua_tonumber(L, index));
|
||||||
|
} else if (lua_isstring(L, index)) {
|
||||||
|
video::SColor parsed_color;
|
||||||
|
if (!parseColorString(lua_tostring(L, index), parsed_color, true))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*color = parsed_color;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
video::SColor read_ARGB8(lua_State *L, int index)
|
||||||
{
|
{
|
||||||
video::SColor color(0);
|
video::SColor color(0);
|
||||||
CHECK_TYPE(index, "ARGB color", LUA_TTABLE);
|
CHECK_TYPE(index, "ARGB color", LUA_TTABLE);
|
||||||
lua_getfield(L, index, "a");
|
lua_getfield(L, index, "a");
|
||||||
if(lua_isnumber(L, -1))
|
color.setAlpha(lua_isnumber(L, -1) ? lua_tonumber(L, -1) : 0xFF);
|
||||||
color.setAlpha(lua_tonumber(L, -1));
|
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
lua_getfield(L, index, "r");
|
lua_getfield(L, index, "r");
|
||||||
color.setRed(lua_tonumber(L, -1));
|
color.setRed(lua_tonumber(L, -1));
|
||||||
|
|
|
@ -76,7 +76,6 @@ void setfloatfield(lua_State *L, int table,
|
||||||
void setboolfield(lua_State *L, int table,
|
void setboolfield(lua_State *L, int table,
|
||||||
const char *fieldname, bool value);
|
const char *fieldname, bool value);
|
||||||
|
|
||||||
|
|
||||||
v3f checkFloatPos (lua_State *L, int index);
|
v3f checkFloatPos (lua_State *L, int index);
|
||||||
v2f check_v2f (lua_State *L, int index);
|
v2f check_v2f (lua_State *L, int index);
|
||||||
v2s16 check_v2s16 (lua_State *L, int index);
|
v2s16 check_v2s16 (lua_State *L, int index);
|
||||||
|
@ -87,7 +86,10 @@ v3f read_v3f (lua_State *L, int index);
|
||||||
v2f read_v2f (lua_State *L, int index);
|
v2f read_v2f (lua_State *L, int index);
|
||||||
v2s16 read_v2s16 (lua_State *L, int index);
|
v2s16 read_v2s16 (lua_State *L, int index);
|
||||||
v2s32 read_v2s32 (lua_State *L, int index);
|
v2s32 read_v2s32 (lua_State *L, int index);
|
||||||
video::SColor readARGB8 (lua_State *L, int index);
|
video::SColor read_ARGB8 (lua_State *L, int index);
|
||||||
|
bool read_color (lua_State *L, int index,
|
||||||
|
video::SColor *color);
|
||||||
|
|
||||||
aabb3f read_aabb3f (lua_State *L, int index, f32 scale);
|
aabb3f read_aabb3f (lua_State *L, int index, f32 scale);
|
||||||
v3s16 read_v3s16 (lua_State *L, int index);
|
v3s16 read_v3s16 (lua_State *L, int index);
|
||||||
std::vector<aabb3f> read_aabb3f_vector (lua_State *L, int index, f32 scale);
|
std::vector<aabb3f> read_aabb3f_vector (lua_State *L, int index, f32 scale);
|
||||||
|
@ -100,11 +102,8 @@ void pushFloatPos (lua_State *L, v3f p);
|
||||||
void push_v3f (lua_State *L, v3f p);
|
void push_v3f (lua_State *L, v3f p);
|
||||||
void push_v2f (lua_State *L, v2f p);
|
void push_v2f (lua_State *L, v2f p);
|
||||||
|
|
||||||
|
void warn_if_field_exists(lua_State *L, int table,
|
||||||
|
const char *fieldname,
|
||||||
void warn_if_field_exists (lua_State *L,
|
const std::string &message);
|
||||||
int table,
|
|
||||||
const char *fieldname,
|
|
||||||
const std::string &message);
|
|
||||||
|
|
||||||
#endif /* C_CONVERTER_H_ */
|
#endif /* C_CONVERTER_H_ */
|
||||||
|
|
|
@ -1222,8 +1222,7 @@ int ObjectRef::l_set_sky(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
video::SColor bgcolor(255,255,255,255);
|
video::SColor bgcolor(255,255,255,255);
|
||||||
if (!lua_isnil(L, 2))
|
read_color(L, 2, &bgcolor);
|
||||||
bgcolor = readARGB8(L, 2);
|
|
||||||
|
|
||||||
std::string type = luaL_checkstring(L, 3);
|
std::string type = luaL_checkstring(L, 3);
|
||||||
|
|
||||||
|
@ -1283,11 +1282,13 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L)
|
||||||
if (playersao == NULL)
|
if (playersao == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
video::SColor color = playersao->getNametagColor();
|
|
||||||
lua_getfield(L, 2, "color");
|
lua_getfield(L, 2, "color");
|
||||||
if (!lua_isnil(L, -1))
|
if (!lua_isnil(L, -1)) {
|
||||||
color = readARGB8(L, -1);
|
video::SColor color = playersao->getNametagColor();
|
||||||
playersao->setNametagColor(color);
|
if (!read_color(L, -1, &color))
|
||||||
|
return 0;
|
||||||
|
playersao->setNametagColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
lua_pushboolean(L, true);
|
lua_pushboolean(L, true);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue