Rename accessor GLTFType to GLTFAccessorType, fix verbose prints, doc

This commit is contained in:
Aaron Franke 2024-04-11 21:29:51 -07:00
parent b7feebefab
commit d3a58e57b8
No known key found for this signature in database
GPG key ID: 40A1750B977E56BF
6 changed files with 112 additions and 108 deletions

View file

@ -12,34 +12,50 @@
<link title="Runtime file loading and saving">$DOCS_URL/tutorials/io/runtime_file_loading_and_saving.html</link> <link title="Runtime file loading and saving">$DOCS_URL/tutorials/io/runtime_file_loading_and_saving.html</link>
</tutorials> </tutorials>
<members> <members>
<member name="accessor_type" type="int" setter="set_accessor_type" getter="get_accessor_type" default="0">
The GLTF accessor type as an enum. Possible values are 0 for "SCALAR", 1 for "VEC2", 2 for "VEC3", 3 for "VEC4", 4 for "MAT2", 5 for "MAT3", and 6 for "MAT4".
</member>
<member name="buffer_view" type="int" setter="set_buffer_view" getter="get_buffer_view" default="-1"> <member name="buffer_view" type="int" setter="set_buffer_view" getter="get_buffer_view" default="-1">
The index of the buffer view this accessor is referencing. If [code]-1[/code], this accessor is not referencing any buffer view. The index of the buffer view this accessor is referencing. If [code]-1[/code], this accessor is not referencing any buffer view.
</member> </member>
<member name="byte_offset" type="int" setter="set_byte_offset" getter="get_byte_offset" default="0"> <member name="byte_offset" type="int" setter="set_byte_offset" getter="get_byte_offset" default="0">
The offset relative to the start of the buffer view in bytes.
</member> </member>
<member name="component_type" type="int" setter="set_component_type" getter="get_component_type" default="0"> <member name="component_type" type="int" setter="set_component_type" getter="get_component_type" default="0">
The GLTF component type as an enum. Possible values are 5120 for "BYTE", 5121 for "UNSIGNED_BYTE", 5122 for "SHORT", 5123 for "UNSIGNED_SHORT", 5125 for "UNSIGNED_INT", and 5126 for "FLOAT". A value of 5125 or "UNSIGNED_INT" must not be used for any accessor that is not referenced by mesh.primitive.indices.
</member> </member>
<member name="count" type="int" setter="set_count" getter="get_count" default="0"> <member name="count" type="int" setter="set_count" getter="get_count" default="0">
The number of elements referenced by this accessor.
</member> </member>
<member name="max" type="PackedFloat64Array" setter="set_max" getter="get_max" default="PackedFloat64Array()"> <member name="max" type="PackedFloat64Array" setter="set_max" getter="get_max" default="PackedFloat64Array()">
Maximum value of each component in this accessor.
</member> </member>
<member name="min" type="PackedFloat64Array" setter="set_min" getter="get_min" default="PackedFloat64Array()"> <member name="min" type="PackedFloat64Array" setter="set_min" getter="get_min" default="PackedFloat64Array()">
Minimum value of each component in this accessor.
</member> </member>
<member name="normalized" type="bool" setter="set_normalized" getter="get_normalized" default="false"> <member name="normalized" type="bool" setter="set_normalized" getter="get_normalized" default="false">
Specifies whether integer data values are normalized before usage.
</member> </member>
<member name="sparse_count" type="int" setter="set_sparse_count" getter="get_sparse_count" default="0"> <member name="sparse_count" type="int" setter="set_sparse_count" getter="get_sparse_count" default="0">
Number of deviating accessor values stored in the sparse array.
</member> </member>
<member name="sparse_indices_buffer_view" type="int" setter="set_sparse_indices_buffer_view" getter="get_sparse_indices_buffer_view" default="0"> <member name="sparse_indices_buffer_view" type="int" setter="set_sparse_indices_buffer_view" getter="get_sparse_indices_buffer_view" default="0">
The index of the buffer view with sparse indices. The referenced buffer view MUST NOT have its target or byteStride properties defined. The buffer view and the optional byteOffset MUST be aligned to the componentType byte length.
</member> </member>
<member name="sparse_indices_byte_offset" type="int" setter="set_sparse_indices_byte_offset" getter="get_sparse_indices_byte_offset" default="0"> <member name="sparse_indices_byte_offset" type="int" setter="set_sparse_indices_byte_offset" getter="get_sparse_indices_byte_offset" default="0">
The offset relative to the start of the buffer view in bytes.
</member> </member>
<member name="sparse_indices_component_type" type="int" setter="set_sparse_indices_component_type" getter="get_sparse_indices_component_type" default="0"> <member name="sparse_indices_component_type" type="int" setter="set_sparse_indices_component_type" getter="get_sparse_indices_component_type" default="0">
The indices component data type as an enum. Possible values are 5121 for "UNSIGNED_BYTE", 5123 for "UNSIGNED_SHORT", and 5125 for "UNSIGNED_INT".
</member> </member>
<member name="sparse_values_buffer_view" type="int" setter="set_sparse_values_buffer_view" getter="get_sparse_values_buffer_view" default="0"> <member name="sparse_values_buffer_view" type="int" setter="set_sparse_values_buffer_view" getter="get_sparse_values_buffer_view" default="0">
The index of the bufferView with sparse values. The referenced buffer view MUST NOT have its target or byteStride properties defined.
</member> </member>
<member name="sparse_values_byte_offset" type="int" setter="set_sparse_values_byte_offset" getter="get_sparse_values_byte_offset" default="0"> <member name="sparse_values_byte_offset" type="int" setter="set_sparse_values_byte_offset" getter="get_sparse_values_byte_offset" default="0">
The offset relative to the start of the bufferView in bytes.
</member> </member>
<member name="type" type="int" setter="set_type" getter="get_type" default="0"> <member name="type" type="int" setter="set_type" getter="get_type" default="0" deprecated="Use [member accessor_type] instead.">
The GLTF accessor type as an enum. Use [member accessor_type] instead.
</member> </member>
</members> </members>
</class> </class>

View file

@ -66,14 +66,4 @@ using GLTFSkinIndex = int;
using GLTFTextureIndex = int; using GLTFTextureIndex = int;
using GLTFTextureSamplerIndex = int; using GLTFTextureSamplerIndex = int;
enum GLTFType {
TYPE_SCALAR,
TYPE_VEC2,
TYPE_VEC3,
TYPE_VEC4,
TYPE_MAT2,
TYPE_MAT3,
TYPE_MAT4,
};
#endif // GLTF_DEFINES_H #endif // GLTF_DEFINES_H

View file

@ -886,7 +886,7 @@ Error GLTFDocument::_encode_accessors(Ref<GLTFState> p_state) {
Ref<GLTFAccessor> accessor = p_state->accessors[i]; Ref<GLTFAccessor> accessor = p_state->accessors[i];
d["componentType"] = accessor->component_type; d["componentType"] = accessor->component_type;
d["count"] = accessor->count; d["count"] = accessor->count;
d["type"] = _get_accessor_type_name(accessor->type); d["type"] = _get_accessor_type_name(accessor->accessor_type);
d["normalized"] = accessor->normalized; d["normalized"] = accessor->normalized;
d["max"] = accessor->max; d["max"] = accessor->max;
d["min"] = accessor->min; d["min"] = accessor->min;
@ -934,58 +934,58 @@ Error GLTFDocument::_encode_accessors(Ref<GLTFState> p_state) {
return OK; return OK;
} }
String GLTFDocument::_get_accessor_type_name(const GLTFType p_type) { String GLTFDocument::_get_accessor_type_name(const GLTFAccessorType p_accessor_type) {
if (p_type == GLTFType::TYPE_SCALAR) { if (p_accessor_type == GLTFAccessorType::TYPE_SCALAR) {
return "SCALAR"; return "SCALAR";
} }
if (p_type == GLTFType::TYPE_VEC2) { if (p_accessor_type == GLTFAccessorType::TYPE_VEC2) {
return "VEC2"; return "VEC2";
} }
if (p_type == GLTFType::TYPE_VEC3) { if (p_accessor_type == GLTFAccessorType::TYPE_VEC3) {
return "VEC3"; return "VEC3";
} }
if (p_type == GLTFType::TYPE_VEC4) { if (p_accessor_type == GLTFAccessorType::TYPE_VEC4) {
return "VEC4"; return "VEC4";
} }
if (p_type == GLTFType::TYPE_MAT2) { if (p_accessor_type == GLTFAccessorType::TYPE_MAT2) {
return "MAT2"; return "MAT2";
} }
if (p_type == GLTFType::TYPE_MAT3) { if (p_accessor_type == GLTFAccessorType::TYPE_MAT3) {
return "MAT3"; return "MAT3";
} }
if (p_type == GLTFType::TYPE_MAT4) { if (p_accessor_type == GLTFAccessorType::TYPE_MAT4) {
return "MAT4"; return "MAT4";
} }
ERR_FAIL_V("SCALAR"); ERR_FAIL_V("SCALAR");
} }
GLTFType GLTFDocument::_get_type_from_str(const String &p_string) { GLTFAccessorType GLTFDocument::_get_accessor_type_from_str(const String &p_string) {
if (p_string == "SCALAR") { if (p_string == "SCALAR") {
return GLTFType::TYPE_SCALAR; return GLTFAccessorType::TYPE_SCALAR;
} }
if (p_string == "VEC2") { if (p_string == "VEC2") {
return GLTFType::TYPE_VEC2; return GLTFAccessorType::TYPE_VEC2;
} }
if (p_string == "VEC3") { if (p_string == "VEC3") {
return GLTFType::TYPE_VEC3; return GLTFAccessorType::TYPE_VEC3;
} }
if (p_string == "VEC4") { if (p_string == "VEC4") {
return GLTFType::TYPE_VEC4; return GLTFAccessorType::TYPE_VEC4;
} }
if (p_string == "MAT2") { if (p_string == "MAT2") {
return GLTFType::TYPE_MAT2; return GLTFAccessorType::TYPE_MAT2;
} }
if (p_string == "MAT3") { if (p_string == "MAT3") {
return GLTFType::TYPE_MAT3; return GLTFAccessorType::TYPE_MAT3;
} }
if (p_string == "MAT4") { if (p_string == "MAT4") {
return GLTFType::TYPE_MAT4; return GLTFAccessorType::TYPE_MAT4;
} }
ERR_FAIL_V(GLTFType::TYPE_SCALAR); ERR_FAIL_V(GLTFAccessorType::TYPE_SCALAR);
} }
Error GLTFDocument::_parse_accessors(Ref<GLTFState> p_state) { Error GLTFDocument::_parse_accessors(Ref<GLTFState> p_state) {
@ -1004,7 +1004,7 @@ Error GLTFDocument::_parse_accessors(Ref<GLTFState> p_state) {
ERR_FAIL_COND_V(!d.has("count"), ERR_PARSE_ERROR); ERR_FAIL_COND_V(!d.has("count"), ERR_PARSE_ERROR);
accessor->count = d["count"]; accessor->count = d["count"];
ERR_FAIL_COND_V(!d.has("type"), ERR_PARSE_ERROR); ERR_FAIL_COND_V(!d.has("type"), ERR_PARSE_ERROR);
accessor->type = _get_type_from_str(d["type"]); accessor->accessor_type = _get_accessor_type_from_str(d["type"]);
if (d.has("bufferView")) { if (d.has("bufferView")) {
accessor->buffer_view = d["bufferView"]; //optional because it may be sparse... accessor->buffer_view = d["bufferView"]; //optional because it may be sparse...
@ -1088,26 +1088,12 @@ String GLTFDocument::_get_component_type_name(const uint32_t p_component) {
return "<Error>"; return "<Error>";
} }
String GLTFDocument::_get_type_name(const GLTFType p_component) { Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> p_state, const double *p_src, const int p_count, const GLTFAccessorType p_accessor_type, const int p_component_type, const bool p_normalized, const int p_byte_offset, const bool p_for_vertex, GLTFBufferViewIndex &r_accessor, const bool p_for_vertex_indices) {
static const char *names[] = {
"float",
"vec2",
"vec3",
"vec4",
"mat2",
"mat3",
"mat4"
};
return names[p_component];
}
Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> p_state, const double *p_src, const int p_count, const GLTFType p_type, const int p_component_type, const bool p_normalized, const int p_byte_offset, const bool p_for_vertex, GLTFBufferViewIndex &r_accessor, const bool p_for_vertex_indices) {
const int component_count_for_type[7] = { const int component_count_for_type[7] = {
1, 2, 3, 4, 4, 9, 16 1, 2, 3, 4, 4, 9, 16
}; };
const int component_count = component_count_for_type[p_type]; const int component_count = component_count_for_type[p_accessor_type];
const int component_size = _get_component_type_size(p_component_type); const int component_size = _get_component_type_size(p_component_type);
ERR_FAIL_COND_V(component_size == 0, FAILED); ERR_FAIL_COND_V(component_size == 0, FAILED);
@ -1117,18 +1103,18 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> p_state, const double *p_
switch (p_component_type) { switch (p_component_type) {
case COMPONENT_TYPE_BYTE: case COMPONENT_TYPE_BYTE:
case COMPONENT_TYPE_UNSIGNED_BYTE: { case COMPONENT_TYPE_UNSIGNED_BYTE: {
if (p_type == TYPE_MAT2) { if (p_accessor_type == TYPE_MAT2) {
skip_every = 2; skip_every = 2;
skip_bytes = 2; skip_bytes = 2;
} }
if (p_type == TYPE_MAT3) { if (p_accessor_type == TYPE_MAT3) {
skip_every = 3; skip_every = 3;
skip_bytes = 1; skip_bytes = 1;
} }
} break; } break;
case COMPONENT_TYPE_SHORT: case COMPONENT_TYPE_SHORT:
case COMPONENT_TYPE_UNSIGNED_SHORT: { case COMPONENT_TYPE_UNSIGNED_SHORT: {
if (p_type == TYPE_MAT3) { if (p_accessor_type == TYPE_MAT3) {
skip_every = 6; skip_every = 6;
skip_bytes = 4; skip_bytes = 4;
} }
@ -1147,7 +1133,7 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> p_state, const double *p_
stride += 4 - (stride % 4); //according to spec must be multiple of 4 stride += 4 - (stride % 4); //according to spec must be multiple of 4
} }
//use to debug //use to debug
print_verbose("glTF: encoding type " + _get_type_name(p_type) + " component type: " + _get_component_type_name(p_component_type) + " stride: " + itos(stride) + " amount " + itos(p_count)); print_verbose("glTF: encoding accessor type " + _get_accessor_type_name(p_accessor_type) + " component type: " + _get_component_type_name(p_component_type) + " stride: " + itos(stride) + " amount " + itos(p_count));
print_verbose("glTF: encoding accessor offset " + itos(p_byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(gltf_buffer.size()) + " view len " + itos(bv->byte_length)); print_verbose("glTF: encoding accessor offset " + itos(p_byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(gltf_buffer.size()) + " view len " + itos(bv->byte_length));
@ -1310,7 +1296,7 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> p_state, const double *p_
return OK; return OK;
} }
Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> p_state, double *p_dst, const GLTFBufferViewIndex p_buffer_view, const int p_skip_every, const int p_skip_bytes, const int p_element_size, const int p_count, const GLTFType p_type, const int p_component_count, const int p_component_type, const int p_component_size, const bool p_normalized, const int p_byte_offset, const bool p_for_vertex) { Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> p_state, double *p_dst, const GLTFBufferViewIndex p_buffer_view, const int p_skip_every, const int p_skip_bytes, const int p_element_size, const int p_count, const GLTFAccessorType p_accessor_type, const int p_component_count, const int p_component_type, const int p_component_size, const bool p_normalized, const int p_byte_offset, const bool p_for_vertex) {
const Ref<GLTFBufferView> bv = p_state->buffer_views[p_buffer_view]; const Ref<GLTFBufferView> bv = p_state->buffer_views[p_buffer_view];
int stride = p_element_size; int stride = p_element_size;
@ -1328,7 +1314,7 @@ Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> p_state, double *p_dst, c
const uint8_t *bufptr = buffer.ptr(); const uint8_t *bufptr = buffer.ptr();
//use to debug //use to debug
print_verbose("glTF: type " + _get_type_name(p_type) + " component type: " + _get_component_type_name(p_component_type) + " stride: " + itos(stride) + " amount " + itos(p_count)); print_verbose("glTF: accessor type " + _get_accessor_type_name(p_accessor_type) + " component type: " + _get_component_type_name(p_component_type) + " stride: " + itos(stride) + " amount " + itos(p_count));
print_verbose("glTF: accessor offset " + itos(p_byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(buffer.size()) + " view len " + itos(bv->byte_length)); print_verbose("glTF: accessor offset " + itos(p_byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(buffer.size()) + " view len " + itos(bv->byte_length));
const int buffer_end = (stride * (p_count - 1)) + p_element_size; const int buffer_end = (stride * (p_count - 1)) + p_element_size;
@ -1430,7 +1416,7 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> p_state, const GLTF
1, 2, 3, 4, 4, 9, 16 1, 2, 3, 4, 4, 9, 16
}; };
const int component_count = component_count_for_type[a->type]; const int component_count = component_count_for_type[a->accessor_type];
const int component_size = _get_component_type_size(a->component_type); const int component_size = _get_component_type_size(a->component_type);
ERR_FAIL_COND_V(component_size == 0, Vector<double>()); ERR_FAIL_COND_V(component_size == 0, Vector<double>());
int element_size = component_count * component_size; int element_size = component_count * component_size;
@ -1441,12 +1427,12 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> p_state, const GLTF
switch (a->component_type) { switch (a->component_type) {
case COMPONENT_TYPE_BYTE: case COMPONENT_TYPE_BYTE:
case COMPONENT_TYPE_UNSIGNED_BYTE: { case COMPONENT_TYPE_UNSIGNED_BYTE: {
if (a->type == TYPE_MAT2) { if (a->accessor_type == TYPE_MAT2) {
skip_every = 2; skip_every = 2;
skip_bytes = 2; skip_bytes = 2;
element_size = 8; //override for this case element_size = 8; //override for this case
} }
if (a->type == TYPE_MAT3) { if (a->accessor_type == TYPE_MAT3) {
skip_every = 3; skip_every = 3;
skip_bytes = 1; skip_bytes = 1;
element_size = 12; //override for this case element_size = 12; //override for this case
@ -1454,7 +1440,7 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> p_state, const GLTF
} break; } break;
case COMPONENT_TYPE_SHORT: case COMPONENT_TYPE_SHORT:
case COMPONENT_TYPE_UNSIGNED_SHORT: { case COMPONENT_TYPE_UNSIGNED_SHORT: {
if (a->type == TYPE_MAT3) { if (a->accessor_type == TYPE_MAT3) {
skip_every = 6; skip_every = 6;
skip_bytes = 4; skip_bytes = 4;
element_size = 16; //override for this case element_size = 16; //override for this case
@ -1471,7 +1457,7 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> p_state, const GLTF
if (a->buffer_view >= 0) { if (a->buffer_view >= 0) {
ERR_FAIL_INDEX_V(a->buffer_view, p_state->buffer_views.size(), Vector<double>()); ERR_FAIL_INDEX_V(a->buffer_view, p_state->buffer_views.size(), Vector<double>());
const Error err = _decode_buffer_view(p_state, dst, a->buffer_view, skip_every, skip_bytes, element_size, a->count, a->type, component_count, a->component_type, component_size, a->normalized, a->byte_offset, p_for_vertex); const Error err = _decode_buffer_view(p_state, dst, a->buffer_view, skip_every, skip_bytes, element_size, a->count, a->accessor_type, component_count, a->component_type, component_size, a->normalized, a->byte_offset, p_for_vertex);
if (err != OK) { if (err != OK) {
return Vector<double>(); return Vector<double>();
} }
@ -1495,7 +1481,7 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> p_state, const GLTF
Vector<double> data; Vector<double> data;
data.resize(component_count * a->sparse_count); data.resize(component_count * a->sparse_count);
err = _decode_buffer_view(p_state, data.ptrw(), a->sparse_values_buffer_view, skip_every, skip_bytes, element_size, a->sparse_count, a->type, component_count, a->component_type, component_size, a->normalized, a->sparse_values_byte_offset, p_for_vertex); err = _decode_buffer_view(p_state, data.ptrw(), a->sparse_values_buffer_view, skip_every, skip_bytes, element_size, a->sparse_count, a->accessor_type, component_count, a->component_type, component_size, a->normalized, a->sparse_values_byte_offset, p_for_vertex);
if (err != OK) { if (err != OK) {
return Vector<double>(); return Vector<double>();
} }
@ -1550,7 +1536,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_ints(Ref<GLTFState> p_state,
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_SCALAR; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_SCALAR;
int component_type; int component_type;
if (max_index > 65535 || p_for_vertex) { if (max_index > 65535 || p_for_vertex) {
component_type = GLTFDocument::COMPONENT_TYPE_INT; component_type = GLTFDocument::COMPONENT_TYPE_INT;
@ -1562,10 +1548,10 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_ints(Ref<GLTFState> p_state,
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = ret_size; accessor->count = ret_size;
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i, p_for_vertex_indices); Error err = _encode_buffer_view(p_state, attribs.ptr(), attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i, p_for_vertex_indices);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -1664,17 +1650,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec2(Ref<GLTFState> p_state,
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC2; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC2;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -1717,17 +1703,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_color(Ref<GLTFState> p_state
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC4; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC4;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -1784,17 +1770,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_weights(Ref<GLTFState> p_sta
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC4; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC4;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -1835,17 +1821,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_joints(Ref<GLTFState> p_stat
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC4; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC4;
const int component_type = GLTFDocument::COMPONENT_TYPE_UNSIGNED_SHORT; const int component_type = GLTFDocument::COMPONENT_TYPE_UNSIGNED_SHORT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -1888,17 +1874,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_quaternions(Ref<GLTFState> p
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC4; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC4;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -1963,17 +1949,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_floats(Ref<GLTFState> p_stat
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_SCALAR; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_SCALAR;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = ret_size; accessor->count = ret_size;
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -2013,17 +1999,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec3(Ref<GLTFState> p_state,
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC3; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC3;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -2089,12 +2075,12 @@ GLTFAccessorIndex GLTFDocument::_encode_sparse_accessor_as_vec3(Ref<GLTFState> p
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_VEC3; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_VEC3;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
sparse_accessor->normalized = false; sparse_accessor->normalized = false;
sparse_accessor->count = p_attribs.size(); sparse_accessor->count = p_attribs.size();
sparse_accessor->type = type; sparse_accessor->accessor_type = accessor_type;
sparse_accessor->component_type = component_type; sparse_accessor->component_type = component_type;
if (p_reference_accessor < p_state->accessors.size() && p_reference_accessor >= 0 && p_state->accessors[p_reference_accessor].is_valid()) { if (p_reference_accessor < p_state->accessors.size() && p_reference_accessor >= 0 && p_state->accessors[p_reference_accessor].is_valid()) {
sparse_accessor->byte_offset = p_state->accessors[p_reference_accessor]->byte_offset; sparse_accessor->byte_offset = p_state->accessors[p_reference_accessor]->byte_offset;
@ -2117,11 +2103,11 @@ GLTFAccessorIndex GLTFDocument::_encode_sparse_accessor_as_vec3(Ref<GLTFState> p
} else { } else {
sparse_accessor->sparse_indices_component_type = GLTFDocument::COMPONENT_TYPE_UNSIGNED_SHORT; sparse_accessor->sparse_indices_component_type = GLTFDocument::COMPONENT_TYPE_UNSIGNED_SHORT;
} }
if (_encode_buffer_view(p_state, changed_indices.ptr(), changed_indices.size(), GLTFType::TYPE_SCALAR, sparse_accessor->sparse_indices_component_type, sparse_accessor->normalized, sparse_accessor->sparse_indices_byte_offset, false, buffer_view_i_indices) != OK) { if (_encode_buffer_view(p_state, changed_indices.ptr(), changed_indices.size(), GLTFAccessorType::TYPE_SCALAR, sparse_accessor->sparse_indices_component_type, sparse_accessor->normalized, sparse_accessor->sparse_indices_byte_offset, false, buffer_view_i_indices) != OK) {
return -1; return -1;
} }
// We use changed_indices.size() here, because we must pass the number of vec3 values rather than the number of components. // We use changed_indices.size() here, because we must pass the number of vec3 values rather than the number of components.
if (_encode_buffer_view(p_state, changed_values.ptr(), changed_indices.size(), sparse_accessor->type, sparse_accessor->component_type, sparse_accessor->normalized, sparse_accessor->sparse_values_byte_offset, false, buffer_view_i_values) != OK) { if (_encode_buffer_view(p_state, changed_values.ptr(), changed_indices.size(), sparse_accessor->accessor_type, sparse_accessor->component_type, sparse_accessor->normalized, sparse_accessor->sparse_values_byte_offset, false, buffer_view_i_values) != OK) {
return -1; return -1;
} }
sparse_accessor->sparse_indices_buffer_view = buffer_view_i_indices; sparse_accessor->sparse_indices_buffer_view = buffer_view_i_indices;
@ -2130,7 +2116,7 @@ GLTFAccessorIndex GLTFDocument::_encode_sparse_accessor_as_vec3(Ref<GLTFState> p
} else if (changed_indices.size() > 0) { } else if (changed_indices.size() > 0) {
GLTFBufferIndex buffer_view_i; GLTFBufferIndex buffer_view_i;
sparse_accessor->byte_offset = 0; sparse_accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, sparse_accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, sparse_accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -2194,17 +2180,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_xform(Ref<GLTFState> p_state
p_state->buffers.push_back(Vector<uint8_t>()); p_state->buffers.push_back(Vector<uint8_t>());
} }
int64_t size = p_state->buffers[0].size(); int64_t size = p_state->buffers[0].size();
const GLTFType type = GLTFType::TYPE_MAT4; const GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_MAT4;
const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT;
accessor->max = type_max; accessor->max = type_max;
accessor->min = type_min; accessor->min = type_min;
accessor->normalized = false; accessor->normalized = false;
accessor->count = p_attribs.size(); accessor->count = p_attribs.size();
accessor->type = type; accessor->accessor_type = accessor_type;
accessor->component_type = component_type; accessor->component_type = component_type;
accessor->byte_offset = 0; accessor->byte_offset = 0;
Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), accessor_type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i);
if (err != OK) { if (err != OK) {
return -1; return -1;
} }
@ -2247,10 +2233,10 @@ Vector<Color> GLTFDocument::_decode_accessor_as_color(Ref<GLTFState> p_state, co
return ret; return ret;
} }
const int type = p_state->accessors[p_accessor]->type; const int accessor_type = p_state->accessors[p_accessor]->accessor_type;
ERR_FAIL_COND_V(!(type == TYPE_VEC3 || type == TYPE_VEC4), ret); ERR_FAIL_COND_V(!(accessor_type == TYPE_VEC3 || accessor_type == TYPE_VEC4), ret);
int vec_len = 3; int vec_len = 3;
if (type == TYPE_VEC4) { if (accessor_type == TYPE_VEC4) {
vec_len = 4; vec_len = 4;
} }

View file

@ -111,8 +111,7 @@ private:
int _get_component_type_size(const int p_component_type); int _get_component_type_size(const int p_component_type);
Error _parse_scenes(Ref<GLTFState> p_state); Error _parse_scenes(Ref<GLTFState> p_state);
Error _parse_nodes(Ref<GLTFState> p_state); Error _parse_nodes(Ref<GLTFState> p_state);
String _get_type_name(const GLTFType p_component); String _get_accessor_type_name(const GLTFAccessorType p_accessor_type);
String _get_accessor_type_name(const GLTFType p_type);
String _sanitize_animation_name(const String &p_name); String _sanitize_animation_name(const String &p_name);
String _gen_unique_animation_name(Ref<GLTFState> p_state, const String &p_name); String _gen_unique_animation_name(Ref<GLTFState> p_state, const String &p_name);
String _sanitize_bone_name(const String &p_name); String _sanitize_bone_name(const String &p_name);
@ -132,13 +131,13 @@ private:
void _compute_node_heights(Ref<GLTFState> p_state); void _compute_node_heights(Ref<GLTFState> p_state);
Error _parse_buffers(Ref<GLTFState> p_state, const String &p_base_path); Error _parse_buffers(Ref<GLTFState> p_state, const String &p_base_path);
Error _parse_buffer_views(Ref<GLTFState> p_state); Error _parse_buffer_views(Ref<GLTFState> p_state);
GLTFType _get_type_from_str(const String &p_string); GLTFAccessorType _get_accessor_type_from_str(const String &p_string);
Error _parse_accessors(Ref<GLTFState> p_state); Error _parse_accessors(Ref<GLTFState> p_state);
Error _decode_buffer_view(Ref<GLTFState> p_state, double *p_dst, Error _decode_buffer_view(Ref<GLTFState> p_state, double *p_dst,
const GLTFBufferViewIndex p_buffer_view, const GLTFBufferViewIndex p_buffer_view,
const int p_skip_every, const int p_skip_bytes, const int p_skip_every, const int p_skip_bytes,
const int p_element_size, const int p_count, const int p_element_size, const int p_count,
const GLTFType p_type, const int p_component_count, const GLTFAccessorType p_accessor_type, const int p_component_count,
const int p_component_type, const int p_component_size, const int p_component_type, const int p_component_size,
const bool p_normalized, const int p_byte_offset, const bool p_normalized, const int p_byte_offset,
const bool p_for_vertex); const bool p_for_vertex);
@ -267,7 +266,7 @@ private:
const Vector<Transform3D> p_attribs, const Vector<Transform3D> p_attribs,
const bool p_for_vertex); const bool p_for_vertex);
Error _encode_buffer_view(Ref<GLTFState> p_state, const double *p_src, Error _encode_buffer_view(Ref<GLTFState> p_state, const double *p_src,
const int p_count, const GLTFType p_type, const int p_count, const GLTFAccessorType p_accessor_type,
const int p_component_type, const bool p_normalized, const int p_component_type, const bool p_normalized,
const int p_byte_offset, const bool p_for_vertex, const int p_byte_offset, const bool p_for_vertex,
GLTFBufferViewIndex &r_accessor, const bool p_for_indices = false); GLTFBufferViewIndex &r_accessor, const bool p_for_indices = false);

View file

@ -41,8 +41,10 @@ void GLTFAccessor::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_normalized", "normalized"), &GLTFAccessor::set_normalized); ClassDB::bind_method(D_METHOD("set_normalized", "normalized"), &GLTFAccessor::set_normalized);
ClassDB::bind_method(D_METHOD("get_count"), &GLTFAccessor::get_count); ClassDB::bind_method(D_METHOD("get_count"), &GLTFAccessor::get_count);
ClassDB::bind_method(D_METHOD("set_count", "count"), &GLTFAccessor::set_count); ClassDB::bind_method(D_METHOD("set_count", "count"), &GLTFAccessor::set_count);
ClassDB::bind_method(D_METHOD("get_type"), &GLTFAccessor::get_type); ClassDB::bind_method(D_METHOD("get_accessor_type"), &GLTFAccessor::get_accessor_type);
ClassDB::bind_method(D_METHOD("set_type", "type"), &GLTFAccessor::set_type); ClassDB::bind_method(D_METHOD("set_accessor_type", "accessor_type"), &GLTFAccessor::set_accessor_type);
ClassDB::bind_method(D_METHOD("get_type"), &GLTFAccessor::get_accessor_type);
ClassDB::bind_method(D_METHOD("set_type", "type"), &GLTFAccessor::set_accessor_type);
ClassDB::bind_method(D_METHOD("get_min"), &GLTFAccessor::get_min); ClassDB::bind_method(D_METHOD("get_min"), &GLTFAccessor::get_min);
ClassDB::bind_method(D_METHOD("set_min", "min"), &GLTFAccessor::set_min); ClassDB::bind_method(D_METHOD("set_min", "min"), &GLTFAccessor::set_min);
ClassDB::bind_method(D_METHOD("get_max"), &GLTFAccessor::get_max); ClassDB::bind_method(D_METHOD("get_max"), &GLTFAccessor::get_max);
@ -65,7 +67,8 @@ void GLTFAccessor::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "component_type"), "set_component_type", "get_component_type"); // int ADD_PROPERTY(PropertyInfo(Variant::INT, "component_type"), "set_component_type", "get_component_type"); // int
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "normalized"), "set_normalized", "get_normalized"); // bool ADD_PROPERTY(PropertyInfo(Variant::BOOL, "normalized"), "set_normalized", "get_normalized"); // bool
ADD_PROPERTY(PropertyInfo(Variant::INT, "count"), "set_count", "get_count"); // int ADD_PROPERTY(PropertyInfo(Variant::INT, "count"), "set_count", "get_count"); // int
ADD_PROPERTY(PropertyInfo(Variant::INT, "type"), "set_type", "get_type"); // GLTFType ADD_PROPERTY(PropertyInfo(Variant::INT, "accessor_type"), "set_accessor_type", "get_accessor_type"); // GLTFAccessorType
ADD_PROPERTY(PropertyInfo(Variant::INT, "type"), "set_type", "get_type"); // Deprecated, GLTFAccessorType
ADD_PROPERTY(PropertyInfo(Variant::PACKED_FLOAT64_ARRAY, "min"), "set_min", "get_min"); // Vector<real_t> ADD_PROPERTY(PropertyInfo(Variant::PACKED_FLOAT64_ARRAY, "min"), "set_min", "get_min"); // Vector<real_t>
ADD_PROPERTY(PropertyInfo(Variant::PACKED_FLOAT64_ARRAY, "max"), "set_max", "get_max"); // Vector<real_t> ADD_PROPERTY(PropertyInfo(Variant::PACKED_FLOAT64_ARRAY, "max"), "set_max", "get_max"); // Vector<real_t>
ADD_PROPERTY(PropertyInfo(Variant::INT, "sparse_count"), "set_sparse_count", "get_sparse_count"); // int ADD_PROPERTY(PropertyInfo(Variant::INT, "sparse_count"), "set_sparse_count", "get_sparse_count"); // int
@ -116,12 +119,12 @@ void GLTFAccessor::set_count(int p_count) {
count = p_count; count = p_count;
} }
int GLTFAccessor::get_type() { int GLTFAccessor::get_accessor_type() {
return (int)type; return (int)accessor_type;
} }
void GLTFAccessor::set_type(int p_type) { void GLTFAccessor::set_accessor_type(int p_accessor_type) {
type = (GLTFType)p_type; // TODO: Register enum accessor_type = (GLTFAccessorType)p_accessor_type; // TODO: Register enum
} }
Vector<double> GLTFAccessor::get_min() { Vector<double> GLTFAccessor::get_min() {

View file

@ -35,6 +35,16 @@
#include "core/io/resource.h" #include "core/io/resource.h"
enum GLTFAccessorType {
TYPE_SCALAR,
TYPE_VEC2,
TYPE_VEC3,
TYPE_VEC4,
TYPE_MAT2,
TYPE_MAT3,
TYPE_MAT4,
};
struct GLTFAccessor : public Resource { struct GLTFAccessor : public Resource {
GDCLASS(GLTFAccessor, Resource); GDCLASS(GLTFAccessor, Resource);
friend class GLTFDocument; friend class GLTFDocument;
@ -45,7 +55,7 @@ private:
int component_type = 0; int component_type = 0;
bool normalized = false; bool normalized = false;
int count = 0; int count = 0;
GLTFType type = GLTFType::TYPE_SCALAR; GLTFAccessorType accessor_type = GLTFAccessorType::TYPE_SCALAR;
Vector<double> min; Vector<double> min;
Vector<double> max; Vector<double> max;
int sparse_count = 0; int sparse_count = 0;
@ -74,8 +84,8 @@ public:
int get_count(); int get_count();
void set_count(int p_count); void set_count(int p_count);
int get_type(); int get_accessor_type();
void set_type(int p_type); void set_accessor_type(int p_accessor_type);
Vector<double> get_min(); Vector<double> get_min();
void set_min(Vector<double> p_min); void set_min(Vector<double> p_min);