2525#include "misc/ctype.h"
2626#include "user_shaders.h"
2727
28+ static int resolve_enum_name (struct gl_user_shader_param * param , struct bstr val )
29+ {
30+ struct bstr enum_rest = param -> enum_body ;
31+ int idx = 0 ;
32+ while (enum_rest .len > 0 ) {
33+ struct bstr enum_line = bstr_strip (bstr_getline (enum_rest , & enum_rest ));
34+ if (enum_line .len == 0 )
35+ continue ;
36+ if (bstr_equals (enum_line , val ))
37+ return idx ;
38+ idx ++ ;
39+ }
40+ return -1 ;
41+ }
42+
2843bool parse_shader_param_value (struct mp_log * log , struct gl_user_shader_param * param ,
2944 struct bstr val , double * out )
3045{
3146 double v , range [2 ];
32- struct bstr rest ;
47+ struct bstr rest = { 0 } ;
3348
3449 switch (param -> type ) {
3550 case GL_USER_SHADER_PARAM_UNKNOWN :
3651 mp_err (log , "Missing type for param '%.*s'\n" , BSTR_P (param -> name ));
3752 return false;
3853 case GL_USER_SHADER_PARAM_INT :
3954 case GL_USER_SHADER_PARAM_DEFINE :
40- v = bstrtoll (val , & rest , 10 );
55+ v = resolve_enum_name (param , val );
56+ v = v >= 0 ? v : bstrtoll (val , & rest , 10 );
4157 range [0 ] = INT_MIN ;
4258 range [1 ] = INT_MAX ;
4359 break ;
@@ -99,6 +115,7 @@ static bool parse_param(struct mp_log *log, struct bstr *body,
99115
100116 struct gl_user_shader_param * param = & params [(* num_params )++ ];
101117 * param = (struct gl_user_shader_param ){ .name = bstr_strip (line ) };
118+ bool is_enum = false;
102119
103120 while (true) {
104121 * body = rest ;
@@ -113,6 +130,47 @@ static bool parse_param(struct mp_log *log, struct bstr *body,
113130 }
114131
115132 if (!bstr_eatstart0 (& line , "//!" )) {
133+ if (is_enum ) {
134+ int count = 0 ;
135+ struct bstr enum_rest = {
136+ .start = line .start ,
137+ .len = rest .start + rest .len - line .start ,
138+ };
139+ param -> enum_body = enum_rest ;
140+
141+ while (enum_rest .len > 0 ) {
142+ struct bstr next_line ;
143+ struct bstr enum_line = bstr_strip (bstr_getline (enum_rest , & next_line ));
144+ if (bstr_startswith0 (enum_line , "//!" ))
145+ break ;
146+ if (next_line .len == 0 )
147+ continue ;
148+ enum_rest = next_line ;
149+ count ++ ;
150+ }
151+
152+ if (param -> type != GL_USER_SHADER_PARAM_INT &&
153+ param -> type != GL_USER_SHADER_PARAM_DEFINE )
154+ {
155+ mp_err (log , "ENUM parameter '%.*s' must be type int or DEFINE!\n" ,
156+ BSTR_P (param -> name ));
157+ return false;
158+ }
159+ if (count == 0 ) {
160+ mp_err (log , "ENUM parameter '%.*s' has no values!\n" ,
161+ BSTR_P (param -> name ));
162+ return false;
163+ }
164+
165+ param -> enum_body .len -= enum_rest .len ;
166+ param -> has_min = true;
167+ param -> has_max = true;
168+ param -> max = count - 1 ;
169+
170+ * body = enum_rest ;
171+ return true;
172+ }
173+
116174 if (!parse_shader_param_value (log , param , line , & param -> initial ))
117175 return false;
118176 param -> value = param -> initial ;
@@ -132,6 +190,8 @@ static bool parse_param(struct mp_log *log, struct bstr *body,
132190 }
133191
134192 if (bstr_eatstart0 (& line , "TYPE" )) {
193+ line = bstr_strip (line );
194+ is_enum = bstr_eatstart0 (& line , "ENUM" );
135195 line = bstr_strip (line );
136196 if (bstr_equals0 (line , "float" )) {
137197 param -> type = GL_USER_SHADER_PARAM_FLOAT ;
0 commit comments