Commit: 7f25da650943aa24d7f851552c1a9741b0ba6891
Author: Gaia Clary
Date: Fri Feb 27 21:56:14 2015 +0100
Branches: master
https://developer.blender.org/rB7f25da650943aa24d7f851552c1a9741b0ba6891
fix T43094 Added check for out of bounds in vertex color array
===================================================================
M source/blender/collada/MeshImporter.cpp
===================================================================
diff --git a/source/blender/collada/MeshImporter.cpp
b/source/blender/collada/MeshImporter.cpp
index d743a29..2adbdd2 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -185,7 +185,7 @@ void VCOLDataWrapper::get_vcol(int v_index, MLoopCol
*mloopcol)
case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
{
COLLADAFW::ArrayPrimitiveType<float> *values =
mVData->getFloatValues();
- if (values->empty()) return;
+ if (values->empty() || values->getCount() <= (v_index *
stride + 2)) return; // xxx need to create an eror instead
mloopcol->r = FTOCHAR((*values)[v_index * stride]);
mloopcol->g = FTOCHAR((*values)[v_index * stride + 1]);
@@ -196,7 +196,7 @@ void VCOLDataWrapper::get_vcol(int v_index, MLoopCol
*mloopcol)
case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
{
COLLADAFW::ArrayPrimitiveType<double> *values =
mVData->getDoubleValues();
- if (values->empty()) return;
+ if (values->empty() || values->getCount() <= (v_index *
stride + 2)) return; // xxx need to create an eror instead
mloopcol->r = FTOCHAR((*values)[v_index * stride]);
mloopcol->g = FTOCHAR((*values)[v_index * stride + 1]);
@@ -225,10 +225,9 @@ void MeshImporter::set_poly_indices(MPoly *mpoly, MLoop
*mloop, int loop_index,
void MeshImporter::set_vcol(MLoopCol *mlc, VCOLDataWrapper &vob, int
loop_index, COLLADAFW::IndexList &index_list, int count)
{
- COLLADAFW::UIntValuesArray& indices =index_list.getIndices();
int index;
for (index = 0; index < count; index++, mlc++) {
- int v_index = indices[index+loop_index];
+ int v_index = index_list.getIndex(index + loop_index);
vob.get_vcol(v_index,mlc);
}
}
@@ -627,6 +626,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh
*collada_mesh, Mesh *me)
unsigned int *position_indices =
mp->getPositionIndices().getData();
unsigned int *normal_indices =
mp->getNormalIndices().getData();
+
bool mp_has_normals = primitive_has_useable_normals(mp);
bool mp_has_faces = primitive_has_faces(mp);
@@ -707,15 +707,21 @@ void MeshImporter::read_polys(COLLADAFW::Mesh
*collada_mesh, Mesh *me)
mpoly->flag |= ME_SMOOTH;
}
- for (unsigned int vcolor_index = 0 ;
vcolor_index < index_list_array_vcolor.getCount();vcolor_index++) {
- COLLADAFW::IndexList& index_list =
*index_list_array_vcolor[vcolor_index];
- COLLADAFW::String colname =
extract_vcolname(index_list.getName());
- MLoopCol *mloopcol = (MLoopCol
*)CustomData_get_layer_named(&me->ldata, CD_MLOOPCOL, colname.c_str());
- if (mloopcol == NULL) {
- fprintf(stderr, "Collada
import: Mesh [%s] : Unknown reference to VCOLOR [#%s].\n", me->id.name,
index_list.getName().c_str() );
- }
- else {
- set_vcol(mloopcol+loop_index,
vcol, start_index, *index_list_array_vcolor[vcolor_index], vcount);
+
+ if (mp->hasColorIndices()) {
+ int vcolor_count =
index_list_array_vcolor.getCount();
+
+ for (unsigned int vcolor_index = 0;
vcolor_index < vcolor_count; vcolor_index++) {
+
+ COLLADAFW::IndexList&
color_index_list = *mp->getColorIndices(vcolor_index);
+ COLLADAFW::String colname =
extract_vcolname(color_index_list.getName());
+ MLoopCol *mloopcol = (MLoopCol
*)CustomData_get_layer_named(&me->ldata, CD_MLOOPCOL, colname.c_str());
+ if (mloopcol == NULL) {
+ fprintf(stderr,
"Collada import: Mesh [%s] : Unknown reference to VCOLOR [#%s].\n",
me->id.name, color_index_list.getName().c_str());
+ }
+ else {
+ set_vcol(mloopcol +
loop_index, vcol, start_index, color_index_list, vcount);
+ }
}
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs