@@ -14,6 +14,7 @@ var triangulate = require('delaunay-triangulate');
1414var alphaShape = require ( 'alpha-shape' ) ;
1515var convexHull = require ( 'convex-hull' ) ;
1616
17+ var isIndex = require ( '../../lib' ) . isIndex ;
1718var parseColorScale = require ( '../../lib/gl_format_color' ) . parseColorScale ;
1819var str2RgbaArray = require ( '../../lib/str2rgbarray' ) ;
1920var zip3 = require ( '../../plots/gl3d/zip3' ) ;
@@ -91,12 +92,40 @@ function delaunayCells(delaunayaxis, positions) {
9192 return triangulate ( b ) ;
9293}
9394
95+ // validate indices
96+ function hasValidIndices ( list , numVertices ) {
97+ var len = list . length ;
98+ for ( var i = 0 ; i < len ; i ++ ) {
99+ if ( ! isIndex ( list [ i ] , numVertices ) ) {
100+ return false ;
101+ }
102+ }
103+ return true ;
104+ }
105+
106+ // avoid pointing to an identical vertex twice
107+ function isTriangle ( lists ) {
108+ var len = lists [ 0 ] . length ;
109+ for ( var i = 0 ; i < len ; i ++ ) {
110+ if (
111+ lists [ 0 ] [ i ] === lists [ 1 ] [ i ] ||
112+ lists [ 1 ] [ i ] === lists [ 2 ] [ i ] ||
113+ lists [ 2 ] [ i ] === lists [ 0 ] [ i ]
114+ ) {
115+ return false ;
116+ }
117+ }
118+ return true ;
119+ }
120+
94121proto . update = function ( data ) {
95122 var scene = this . scene ;
96123 var layout = scene . fullSceneLayout ;
97124
98125 this . data = data ;
99126
127+ var numVertices = data . x . length ;
128+
100129 var positions = zip3 (
101130 toDataCoords ( layout . xaxis , data . x , scene . dataScale [ 0 ] , data . xcalendar ) ,
102131 toDataCoords ( layout . yaxis , data . y , scene . dataScale [ 1 ] , data . ycalendar ) ,
@@ -105,6 +134,18 @@ proto.update = function(data) {
105134
106135 var cells ;
107136 if ( data . i && data . j && data . k ) {
137+
138+ if (
139+ data . i . length !== data . j . length ||
140+ data . j . length !== data . k . length ||
141+ ! hasValidIndices ( data . i , numVertices ) ||
142+ ! hasValidIndices ( data . j , numVertices ) ||
143+ ! hasValidIndices ( data . k , numVertices ) ||
144+ ! isTriangle ( [ data . i , data . j , data . k ] )
145+ ) {
146+ data . visible = false ;
147+ return ;
148+ }
108149 cells = zip3 (
109150 toIndex ( data . i ) ,
110151 toIndex ( data . j ) ,
0 commit comments