aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/jogamp/graph/curve/opengl/RegionRenderer.java
blob: a1d888da98a7a89e68c010e77dbc2e1cf366e4ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package com.jogamp.graph.curve.opengl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import javax.media.opengl.GL2ES2;

import com.jogamp.graph.curve.OutlineShape;
import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.RegionFactory;
import com.jogamp.graph.geom.Triangle;
import com.jogamp.graph.geom.Vertex;

public abstract class RegionRenderer extends Renderer {
    
    /** Create a Hardware accelerated Region Renderer
     */
    public static RegionRenderer create(Vertex.Factory<? extends Vertex> factory, int type) {
        return new jogamp.graph.curve.opengl.RegionRendererImpl01(factory, type);
    }
    
    public RegionRenderer(Vertex.Factory<? extends Vertex> factory, int type) {
        super(factory, type);
    }
    
    /** Render an array of Outline shapes combined in one region
     *  at the position provided the triangles of the 
     *  shapes will be generated, if not yet generated
     * @param outlineShapes array of OutlineShapes to Render.
     * @param position the initial translation of the outlineShapes.
     * @param texSize texture size for multipass render     * 
     * @throws Exception if HwRegionRenderer not initialized
     */
    public abstract void renderOutlineShapes(GL2ES2 gl, OutlineShape[] outlineShapes, float[] position, int texSize);

    /** Render outline in 3D space at the position provided
     *  the triangles of the shapes will be generated, if not yet generated
     * @param outlineShape the OutlineShape to Render.
     * @param position the initial translation of the outlineShape. 
     * @param texSize texture size for multipass render
     * @throws Exception if HwRegionRenderer not initialized
     */
    public abstract void renderOutlineShape(GL2ES2 gl, OutlineShape outlineShape, float[] position, int texSize);

    protected HashMap<Integer, Region> regions = new HashMap<Integer, Region>();

    public void flushCache() {
        Iterator<Region> iterator = regions.values().iterator();
        while(iterator.hasNext()){
            Region region = iterator.next();
            region.destroy();
        }
        regions.clear();
    }       

    /**
     * @param sharpness parameter for Region generation
     * @return the resulting Region inclusive the generated region
     */
    protected Region createRegion(GL2ES2 gl, OutlineShape outlineShape, float sharpness) {
        Region region = RegionFactory.create(gl.getContext(), st, regionType);
        
        outlineShape.transformOutlines(OutlineShape.QUADRATIC_NURBS);
        
        ArrayList<Triangle<Vertex>> triangles = (ArrayList<Triangle<Vertex>>) outlineShape.triangulate(sharpness);
        ArrayList<Vertex> vertices = (ArrayList<Vertex>) outlineShape.getVertices();
        region.addVertices(vertices);
        region.addTriangles(triangles);
        
        region.update();
        return region;
    }
    
    /**
     * @param sharpness parameter for Region generation
     * @return the resulting Region inclusive the generated region
     */
    protected Region createRegion(GL2ES2 gl, OutlineShape[] outlineShapes, float sharpness) {
        Region region = RegionFactory.create(gl.getContext(), st, regionType);
        
        int numVertices = region.getNumVertices();
        
        for(OutlineShape outlineShape:outlineShapes){
            outlineShape.transformOutlines(OutlineShape.QUADRATIC_NURBS);

            ArrayList<Triangle<Vertex>> triangles = outlineShape.triangulate(sharpness);
            region.addTriangles(triangles);
            
            ArrayList<Vertex> vertices = outlineShape.getVertices();
            for(Vertex vert:vertices){
                vert.setId(numVertices++);
            }
            region.addVertices(vertices);
        }
        
        region.update();
        return region;
    }
    
    protected static int getHashCode(OutlineShape outlineShape){
        return outlineShape.hashCode();
    }
    
    protected static int getHashCode(OutlineShape[] outlineShapes){
        int hashcode = 0;
        for(OutlineShape outlineShape:outlineShapes){
            hashcode += getHashCode(outlineShape);
        }
        return hashcode;
    }       
}