Project

General

Profile

Download (7.39 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / mesh / DeferredJobs.java @ 6923706f

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.library.mesh;
21

    
22
import org.distorted.library.effect.VertexEffect;
23
import org.distorted.library.effectqueue.EffectQueueVertex;
24
import org.distorted.library.main.DistortedLibrary;
25

    
26
import java.util.ArrayList;
27

    
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29
/**
30
 * Not part of public API, do not document (public only because has to be cleaned from the main package)
31
 *
32
 * @y.exclude
33
 */
34
public class DeferredJobs
35
  {
36
  private static final int JOB_TYPE_VERTEX = 0;
37
  private static final int JOB_TYPE_MERGE  = 1;
38
  private static final int JOB_TYPE_JOIN   = 2;
39
  private static final int JOB_TYPE_COPY   = 3;
40

    
41
  private static ArrayList<JobNode> mJobs = new ArrayList<>();
42

    
43
  //////////////////////////////////////////////////////////////////////////
44

    
45
  private static class Job
46
    {
47
    private int mType;
48
    private int mArg;
49
    private MeshBase mTarget;
50
    private MeshBase[] mSource;
51
    private EffectQueueVertex mEffects;
52

    
53
    Job(int type, MeshBase target, MeshBase[] source, VertexEffect effect, int arg)
54
      {
55
      mType   = type;
56
      mTarget = target;
57
      mSource = source;
58
      mArg    = arg;
59

    
60
      if( effect!=null )
61
        {
62
        mEffects= new EffectQueueVertex();
63
        mEffects.add(effect);
64
        }
65
      }
66

    
67
    void addEffect(VertexEffect effect)
68
      {
69
      mEffects.add(effect);
70
      }
71

    
72
    void execute()
73
      {
74
      switch(mType)
75
        {
76
        case JOB_TYPE_VERTEX: DistortedLibrary.adjustVertices(mTarget, mEffects);
77
                              break;
78
        case JOB_TYPE_MERGE : mTarget.merge();
79
                              break;
80
        case JOB_TYPE_JOIN  : mTarget.joinAttrib1(mSource,mArg);
81
                              break;
82
        case JOB_TYPE_COPY  : mTarget.deepCopyAttribs1(mSource[0]);
83
                              break;
84
        }
85
      }
86

    
87
    void clear()
88
      {
89
      if( mEffects!=null ) mEffects.removeAll(false);
90
      }
91
    }
92

    
93
  //////////////////////////////////////////////////////////////////////////
94

    
95
  static class JobNode
96
    {
97
    private ArrayList<JobNode> mPrevJobs;
98
    private ArrayList<JobNode> mNextJobs;
99
    private Job mJob;
100

    
101
    JobNode(Job job)
102
      {
103
      mPrevJobs = new ArrayList<>();
104
      mNextJobs = new ArrayList<>();
105
      mJob      = job;
106
      }
107

    
108
    void execute()
109
      {
110
      JobNode node;
111
      int numPrev = mPrevJobs.size();
112

    
113
      for(int i=0; i<numPrev; i++)
114
        {
115
        node = mPrevJobs.get(i);
116
        node.execute();
117
        }
118

    
119
      removeNode(this);
120
      mJob.execute();
121
      }
122

    
123
    void clear()
124
      {
125
      mPrevJobs.clear();
126
      mPrevJobs = null;
127
      mNextJobs.clear();
128
      mNextJobs = null;
129

    
130
      mJob.clear();
131
      mJob = null;
132
      }
133
    }
134

    
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136

    
137
  private static void removeNode(JobNode node)
138
    {
139
    mJobs.remove(node);
140
    JobNode jn;
141

    
142
    int numPrev = node.mPrevJobs.size();
143

    
144
    for(int i=0; i<numPrev; i++)
145
      {
146
      jn = node.mPrevJobs.get(i);
147
      jn.mNextJobs.remove(node);
148
      }
149

    
150
    int numNext = node.mNextJobs.size();
151

    
152
    for(int i=0; i<numNext; i++)
153
      {
154
      jn = node.mNextJobs.get(i);
155
      jn.mPrevJobs.remove(node);
156
      }
157

    
158
    node.mJob.mTarget.mJobNode[0] = null;
159
    }
160

    
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162

    
163
  static JobNode vertex(MeshBase target, VertexEffect effect)
164
    {
165
    JobNode jn = target.mJobNode[0];
166

    
167
    if( jn==null )
168
      {
169
      Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,0);
170
      JobNode node = new JobNode(job);
171
      mJobs.add(node);
172
      return node;
173
      }
174
    else
175
      {
176
      if( jn.mJob.mType==JOB_TYPE_VERTEX )
177
        {
178
        jn.mJob.addEffect(effect);
179
        return jn;
180
        }
181
      else
182
        {
183
        Job job = new Job(JOB_TYPE_VERTEX,target,null,effect,0);
184
        JobNode node = new JobNode(job);
185
        node.mPrevJobs.add(jn);
186
        jn.mNextJobs.add(node);
187
        mJobs.add(node);
188
        return node;
189
        }
190
      }
191
    }
192

    
193
///////////////////////////////////////////////////////////////////////////////////////////////////
194

    
195
  static JobNode merge(MeshBase target)
196
    {
197
    JobNode jn = target.mJobNode[0];
198
    Job job = new Job(JOB_TYPE_MERGE,target,null,null,0);
199
    JobNode node = new JobNode(job);
200
    node.mPrevJobs.add(jn);
201
    jn.mNextJobs.add(node);
202
    mJobs.add(node);
203
    return node;
204
    }
205

    
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207

    
208
  static JobNode join(MeshBase target, MeshBase[] meshes, int origVertices)
209
    {
210
    JobNode jn;
211

    
212
    Job job = new Job(JOB_TYPE_JOIN,target,meshes,null,origVertices);
213
    JobNode node = new JobNode(job);
214

    
215
    for (MeshBase mesh : meshes)
216
      {
217
      jn = mesh.mJobNode[0];
218
      node.mPrevJobs.add(jn);
219
      jn.mNextJobs.add(node);
220
      }
221

    
222
    mJobs.add(node);
223
    return node;
224
    }
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  static JobNode copy(MeshBase target, MeshBase mesh)
229
    {
230
    JobNode jn = mesh.mJobNode[0];
231
    MeshBase[] meshes = new MeshBase[1];
232
    meshes[0] = mesh;
233
    Job job = new Job(JOB_TYPE_COPY,target,meshes,null,0);
234
    JobNode node = new JobNode(job);
235
    node.mPrevJobs.add(jn);
236
    jn.mNextJobs.add(node);
237
    mJobs.add(node);
238
    return node;
239
    }
240

    
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242
/**
243
 * Only for use by the library itself.
244
 *
245
 * @y.exclude
246
 */
247
  public static void onDestroy()
248
    {
249
    int num = mJobs.size();
250

    
251
    for(int i=0; i<num; i++)
252
      {
253
      mJobs.get(i).clear();
254
      }
255

    
256
    mJobs.clear();
257
    }
258
  }
(1-1/8)