Project

General

Profile

« Previous | Next » 

Revision aaeef328

Added by Leszek Koltunski about 1 year ago

Support split type 'EDGE_COIN' in case of every shape.

View differences:

src/main/java/org/distorted/objectlib/touchcontrol/TouchControlTetrahedron.java
37 37
    super(object,D3D,FACE_AXIS);
38 38
    }
39 39

  
40
///////////////////////////////////////////////////////////////////////////////////////////////////
41

  
42
  private boolean isFaceInverted(int face)
43
    {
44
    return face>1;
45
    }
46

  
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48

  
49
  private int partEdge(float[] point, int face)
50
    {
51
    float y = (isFaceInverted(face) ? point[1] : -point[1]);
52
    float x = point[0];
53

  
54
    boolean e0 = x>0;
55
    boolean e1 = y>( SQ3/3)*x;
56
    boolean e2 = y>(-SQ3/3)*x;
57

  
58
    if(  e1 && e2 ) return 0;
59
    if( !e1 && e0 ) return 1;
60
    return 2;
61
    }
62

  
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

  
65
  private int partCorner(float[] point, int face)
66
    {
67
    float y = (isFaceInverted(face) ? point[1] : -point[1]);
68
    float x = point[0];
69

  
70
    boolean c0 = x>0;
71
    boolean c1 = y>( SQ3/3)*x;
72
    boolean c2 = y>(-SQ3/3)*x;
73

  
74
    if(  c0 && c2 ) return 0;
75
    if( !c1 &&!c2 ) return 1;
76
    return 2;
77
    }
78

  
40 79
///////////////////////////////////////////////////////////////////////////////////////////////////
41 80
// corner    edge
42 81
//   |       \ 0 /
......
46 85
//
47 86
// COIN: pieces inside the coin just like in EDGE; outside +=3.
48 87

  
49
  int returnPart(int type, int face, float[] touchPoint)
88
  int returnPart(int type, int face, float[] point)
50 89
    {
51 90
    switch(type)
52 91
      {
53 92
      case TYPE_NOT_SPLIT      : return 0;
54

  
55
      case TYPE_SPLIT_EDGE     : float y1 = (face > 1 ? touchPoint[1] : -touchPoint[1]);
56
                                 float x1 = touchPoint[0];
57

  
58
                                 boolean e0 = x1>0;
59
                                 boolean e1 = y1>( SQ3/3)*x1;
60
                                 boolean e2 = y1>(-SQ3/3)*x1;
61

  
62
                                 if(  e1 && e2 ) return 0;
63
                                 if( !e1 && e0 ) return 1;
64
                                 if( !e0 &&!e2 ) return 2;
65
                                 return 0;
66

  
67
      case TYPE_SPLIT_CORNER:    float y2 = (face > 1 ? touchPoint[1] : -touchPoint[1]);
68
                                 float x2 = touchPoint[0];
69

  
70
                                 boolean c0 = x2>0;
71
                                 boolean c1 = y2>( SQ3/3)*x2;
72
                                 boolean c2 = y2>(-SQ3/3)*x2;
73

  
74
                                 if(  c0 && c2 ) return 0;
75
                                 if( !c1 &&!c2 ) return 1;
76
                                 if( !c0 && c1 ) return 2;
77
                                 return 0;
78
      case TYPE_SPLIT_EDGE_COIN: float y3 = (face > 1 ? touchPoint[1] : -touchPoint[1]);
79
                                 float x3 = touchPoint[0];
80

  
81
                                 boolean s0 = x3>0;
82
                                 boolean s1 = y3>( SQ3/3)*x3;
83
                                 boolean s2 = y3>(-SQ3/3)*x3;
84

  
85
                                 int add = (x3*x3+y3*y3<DIST2D*DIST2D ? 0:3 );
86

  
87
                                 if(  s1 && s2 ) return add;
88
                                 if( !s1 && s0 ) return add+1;
89
                                 if( !s0 &&!s2 ) return add+2;
90
                                 return 0;
93
      case TYPE_SPLIT_EDGE     : return partEdge(point,face);
94
      case TYPE_SPLIT_CORNER   : return partCorner(point,face);
95
      case TYPE_SPLIT_EDGE_COIN: float y = point[1];
96
                                 float x = point[0];
97
                                 return partEdge(point,face) + (x*x+y*y < DIST2D*DIST2D ? 0:3 );
91 98
      }
92 99

  
93 100
    return 0;
......
104 111

  
105 112
///////////////////////////////////////////////////////////////////////////////////////////////////
106 113

  
107
  boolean isInsideFace(int face, float[] p)
114
  boolean isInsideFace(int face, float[] point)
108 115
    {
109
    float y = (face > 1 ? p[1] : -p[1]);
110
    float x = p[0];
116
    float y = (isFaceInverted(face) ? point[1] : -point[1]);
117
    float x = point[0];
111 118
    return (y >= -DIST2D) && (y <= DIST2D*(2-6*x)) && (y <= DIST2D*(2+6*x));
112 119
    }
113 120
}

Also available in: Unified diff