public override int getShapeDim() { throw new NotImplementedException(); int dim = 2; if (getShapes().Count > 0) { GeoShape shape0 = getShapes()[0]; if (shape0.getPartCount() > 0) { GeoPointList part0 = shape0.getPart(0); if (part0.Count > 0) { GeoPoint p0 = part0[0]; dim = (int)p0.getDim(); } } } return(dim); }
// ensures that all single-part shapes have their verts wound CCW. static Feature wind(Feature input) { #if TODO if (input.getShapeType() == GeoShape.ShapeType.TYPE_POLYGON) { foreach (GeoShape i in input.getShapes()) { GeoShape shape = i; if (shape.getPartCount() == 1) { GeoPointList part = shape.getPart(0); GeomUtils.openPolygon(part); if (!GeomUtils.isPolygonCCW(part)) { std.reverse(part.begin(), part.end()); } } } } return(input); #endif throw new NotImplementedException(); }
public override FragmentList process(Feature input, FilterEnv env) { FragmentList output; // LIMITATION: this filter assumes all feature's shapes are the same // shape type! TODO: sort into bins of shape type and create a separate // geometry for each. Then merge the geometries. bool needs_tessellation = false; Fragment frag = new Fragment(); GeoShapeList shapes = input.getShapes(); #if TODO // if we're in batch mode, the color was resolved in the other process() function. // otherwise we still need to resolve it. Vector4D color = getColorForFeature(input, env); #endif #if TODO foreach (GeoShape s in shapes) { GeoShape shape = s; if (shape.getShapeType() == GeoShape.ShapeType.TYPE_POLYGON) { needs_tessellation = true; } osg.Geometry geom = new osg.Geometry(); // TODO: pre-total points and pre-allocate these arrays: osg.Vec3Array verts = new osg.Vec3Array(); geom.setVertexArray(verts); uint vert_ptr = 0; // per-vertex coloring takes more memory than per-primitive-set coloring, // but it renders faster. osg.Vec4Array colors = new osg.Vec4Array(); geom.setColorArray(colors); geom.setColorBinding(osg.Geometry.BIND_PER_VERTEX); //osg.Vec3Array* normals = new osg.Vec3Array(); //geom.setNormalArray( normals ); //geom.setNormalBinding( osg.Geometry.BIND_OVERALL ); //normals.push_back( osg.Vec3( 0, 0, 1 ) ); Mogre.PixelFormat prim_type = shape.getShapeType() == GeoShape.ShapeType.TYPE_POINT ? osg.PrimitiveSet.POINTS : shape.getShapeType() == GeoShape.ShapeType.TYPE_LINE ? osg.PrimitiveSet.LINE_STRIP : osg.PrimitiveSet.LINE_LOOP; #endif #if TODO for (int pi = 0; pi < shape.getPartCount(); pi++) { int part_ptr = vert_ptr; GeoPointList points = shape.getPart(pi); for (int vi = 0; vi < points.Count; vi++) { verts.Add(points[vi]); vert_ptr++; colors.Add(color); } geom.addPrimitiveSet(new osg.DrawArrays(prim_type, part_ptr, vert_ptr - part_ptr)); } // tessellate all polygon geometries. Tessellating each geometry separately // with TESS_TYPE_GEOMETRY is much faster than doing the whole bunch together // using TESS_TYPE_DRAWABLE. if (needs_tessellation) { osgUtil.Tessellator tess; tess.setTessellationType(osgUtil.Tessellator.TESS_TYPE_GEOMETRY); tess.setWindingType(osgUtil.Tessellator.TESS_WINDING_POSITIVE); tess.retessellatePolygons(*geom); applyOverlayTexturing(geom, input, env); } generateNormals(geom); frag.addDrawable(geom); } frag.addAttributes(input.getAttributes()); applyFragmentName(frag, input, env); output.Add(frag); return(output); #endif throw new NotImplementedException(); }