📄 slang_assemble_typeinfo.c
字号:
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
}
ti->spec.type = _slang_type_base (_ti.spec.type);
}
slang_assembly_typeinfo_destruct (&_ti);
}
break;
case slang_oper_call:
{
GLboolean exists;
if (!_slang_typeof_function (op->a_id, op->children, op->num_children, space, &ti->spec,
&exists, atoms))
return GL_FALSE;
if (!exists)
{
slang_struct *s = slang_struct_scope_find (space->structs, op->a_id, GL_TRUE);
if (s != NULL)
{
ti->spec.type = slang_spec_struct;
ti->spec._struct = (slang_struct *) slang_alloc_malloc (sizeof (slang_struct));
if (ti->spec._struct == NULL)
return GL_FALSE;
if (!slang_struct_construct (ti->spec._struct))
{
slang_alloc_free (ti->spec._struct);
ti->spec._struct = NULL;
return GL_FALSE;
}
if (!slang_struct_copy (ti->spec._struct, s))
return GL_FALSE;
}
else
{
const char *name;
slang_type_specifier_type type;
name = slang_atom_pool_id (atoms, op->a_id);
type = slang_type_specifier_type_from_string (name);
if (type == slang_spec_void)
return GL_FALSE;
ti->spec.type = type;
}
}
}
break;
case slang_oper_field:
{
slang_assembly_typeinfo _ti;
if (!slang_assembly_typeinfo_construct (&_ti))
return GL_FALSE;
if (!_slang_typeof_operation_ (op->children, space, &_ti, atoms))
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
}
if (_ti.spec.type == slang_spec_struct)
{
slang_variable *field;
field = _slang_locate_variable (_ti.spec._struct->fields, op->a_id, GL_FALSE);
if (field == NULL)
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
}
if (!slang_type_specifier_copy (&ti->spec, &field->type.specifier))
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
}
ti->can_be_referenced = _ti.can_be_referenced;
}
else
{
GLuint rows;
const char *swizzle;
slang_type_specifier_type base;
/* determine the swizzle of the field expression */
if (!_slang_type_is_vector (_ti.spec.type))
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
}
rows = _slang_type_dim (_ti.spec.type);
swizzle = slang_atom_pool_id (atoms, op->a_id);
if (!_slang_is_swizzle (swizzle, rows, &ti->swz))
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
}
ti->is_swizzled = GL_TRUE;
ti->can_be_referenced = _ti.can_be_referenced && _slang_is_swizzle_mask (&ti->swz,
rows);
if (_ti.is_swizzled)
{
slang_swizzle swz;
/* swizzle the swizzle */
_slang_multiply_swizzles (&swz, &_ti.swz, &ti->swz);
ti->swz = swz;
}
base = _slang_type_base (_ti.spec.type);
switch (ti->swz.num_components)
{
case 1:
ti->spec.type = base;
break;
case 2:
switch (base)
{
case slang_spec_float:
ti->spec.type = slang_spec_vec2;
break;
case slang_spec_int:
ti->spec.type = slang_spec_ivec2;
break;
case slang_spec_bool:
ti->spec.type = slang_spec_bvec2;
break;
default:
break;
}
break;
case 3:
switch (base)
{
case slang_spec_float:
ti->spec.type = slang_spec_vec3;
break;
case slang_spec_int:
ti->spec.type = slang_spec_ivec3;
break;
case slang_spec_bool:
ti->spec.type = slang_spec_bvec3;
break;
default:
break;
}
break;
case 4:
switch (base)
{
case slang_spec_float:
ti->spec.type = slang_spec_vec4;
break;
case slang_spec_int:
ti->spec.type = slang_spec_ivec4;
break;
case slang_spec_bool:
ti->spec.type = slang_spec_bvec4;
break;
default:
break;
}
break;
default:
break;
}
}
slang_assembly_typeinfo_destruct (&_ti);
}
break;
case slang_oper_postincrement:
case slang_oper_postdecrement:
if (!_slang_typeof_operation_ (op->children, space, ti, atoms))
return GL_FALSE;
ti->can_be_referenced = GL_FALSE;
ti->is_swizzled = GL_FALSE;
break;
default:
return GL_FALSE;
}
return GL_TRUE;
}
/* _slang_typeof_function() */
GLboolean _slang_typeof_function (slang_atom a_name, slang_operation *params, GLuint num_params,
slang_assembly_name_space *space, slang_type_specifier *spec, GLboolean *exists,
slang_atom_pool *atoms)
{
slang_function *fun;
fun = _slang_locate_function (space->funcs, a_name, params, num_params, space, atoms);
*exists = fun != NULL;
if (fun == NULL)
return GL_TRUE;
return slang_type_specifier_copy (spec, &fun->header.type.specifier);
}
/* _slang_type_is_matrix() */
GLboolean _slang_type_is_matrix (slang_type_specifier_type ty)
{
switch (ty)
{
case slang_spec_mat2:
case slang_spec_mat3:
case slang_spec_mat4:
return GL_TRUE;
default:
return GL_FALSE;
}
}
/* _slang_type_is_vector() */
GLboolean _slang_type_is_vector (slang_type_specifier_type ty)
{
switch (ty)
{
case slang_spec_vec2:
case slang_spec_vec3:
case slang_spec_vec4:
case slang_spec_ivec2:
case slang_spec_ivec3:
case slang_spec_ivec4:
case slang_spec_bvec2:
case slang_spec_bvec3:
case slang_spec_bvec4:
return GL_TRUE;
default:
return GL_FALSE;
}
}
/* _slang_type_base_of_vector() */
slang_type_specifier_type _slang_type_base (slang_type_specifier_type ty)
{
switch (ty)
{
case slang_spec_float:
case slang_spec_vec2:
case slang_spec_vec3:
case slang_spec_vec4:
return slang_spec_float;
case slang_spec_int:
case slang_spec_ivec2:
case slang_spec_ivec3:
case slang_spec_ivec4:
return slang_spec_int;
case slang_spec_bool:
case slang_spec_bvec2:
case slang_spec_bvec3:
case slang_spec_bvec4:
return slang_spec_bool;
case slang_spec_mat2:
return slang_spec_vec2;
case slang_spec_mat3:
return slang_spec_vec3;
case slang_spec_mat4:
return slang_spec_vec4;
default:
return slang_spec_void;
}
}
/* _slang_type_dim */
GLuint _slang_type_dim (slang_type_specifier_type ty)
{
switch (ty)
{
case slang_spec_float:
case slang_spec_int:
case slang_spec_bool:
return 1;
case slang_spec_vec2:
case slang_spec_ivec2:
case slang_spec_bvec2:
case slang_spec_mat2:
return 2;
case slang_spec_vec3:
case slang_spec_ivec3:
case slang_spec_bvec3:
case slang_spec_mat3:
return 3;
case slang_spec_vec4:
case slang_spec_ivec4:
case slang_spec_bvec4:
case slang_spec_mat4:
return 4;
default:
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -