Project

General

Profile

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

library / src / main / java / org / distorted / library / uniformblock / UniformBlockAssociation.java @ 8c57d77b

1 12c2cfcf Leszek Koltunski
////////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski  leszek@koltunski.pl                                          //
3 97755c02 Leszek Koltunski
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6 12c2cfcf Leszek Koltunski
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10 97755c02 Leszek Koltunski
//                                                                                               //
11 12c2cfcf Leszek Koltunski
// This library is distributed in the hope that it will be useful,                               //
12 97755c02 Leszek Koltunski
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13 12c2cfcf Leszek Koltunski
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15 97755c02 Leszek Koltunski
//                                                                                               //
16 12c2cfcf Leszek Koltunski
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 97755c02 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21 de77a6c5 Leszek Koltunski
package org.distorted.library.uniformblock;
22 97755c02 Leszek Koltunski
23
import android.opengl.GLES30;
24
25 8c57d77b Leszek Koltunski
import org.distorted.library.main.DistortedLibrary;
26 97755c02 Leszek Koltunski
import org.distorted.library.main.InternalBuffer;
27 7958d843 Leszek Koltunski
import org.distorted.library.mesh.MeshBase;
28 97755c02 Leszek Koltunski
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30 de77a6c5 Leszek Koltunski
/**
31
 * Not part of public API, do not document
32
 *
33
 * @y.exclude
34
 */
35
public class UniformBlockAssociation
36 97755c02 Leszek Koltunski
  {
37
  private static final int DEFAULT_ASSOCIATION = 0xffffffff;
38 073e5a7a Leszek Koltunski
  private static final int DEFAULT_STRIDE = 4;
39 80961fc1 Leszek Koltunski
  private static final int LOC_AND = 0;
40
  private static final int LOC_EQU = 1;
41 97755c02 Leszek Koltunski
42 78ff6ea9 Leszek Koltunski
  private final InternalBuffer mUBO;
43 7958d843 Leszek Koltunski
  private final int mMax;
44 80961fc1 Leszek Koltunski
  private int[] mAssociations;
45
  private int mStride;
46 97755c02 Leszek Koltunski
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48 41b3ada0 Leszek Koltunski
49 de77a6c5 Leszek Koltunski
  public UniformBlockAssociation()
50 97755c02 Leszek Koltunski
    {
51 7958d843 Leszek Koltunski
    mMax = MeshBase.getMaxEffComponents();
52 80961fc1 Leszek Koltunski
    mStride = DEFAULT_STRIDE;
53 7958d843 Leszek Koltunski
    mAssociations= new int[mStride*mMax];
54 97755c02 Leszek Koltunski
55 7958d843 Leszek Koltunski
    for(int i=0; i<mMax; i++)
56 97755c02 Leszek Koltunski
      {
57 80961fc1 Leszek Koltunski
      mAssociations[mStride*i+LOC_AND] = DEFAULT_ASSOCIATION;
58
      mAssociations[mStride*i+LOC_EQU] = i;
59 97755c02 Leszek Koltunski
      }
60
61 73bcf555 Leszek Koltunski
    mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_DRAW);
62 97755c02 Leszek Koltunski
    }
63
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65
66 de77a6c5 Leszek Koltunski
  public UniformBlockAssociation(UniformBlockAssociation original)
67 97755c02 Leszek Koltunski
    {
68 7958d843 Leszek Koltunski
    mMax = original.mMax;
69 80961fc1 Leszek Koltunski
    mStride = original.mStride;
70 97755c02 Leszek Koltunski
    int size = original.mAssociations.length;
71
    mAssociations= new int[size];
72
    System.arraycopy(original.mAssociations, 0, mAssociations, 0, size);
73
74 73bcf555 Leszek Koltunski
    mUBO = new InternalBuffer(GLES30.GL_UNIFORM_BUFFER, GLES30.GL_STATIC_DRAW);
75 97755c02 Leszek Koltunski
    }
76
77 80961fc1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
78 41ed3f0d Leszek Koltunski
// stride can be 0, if we just tried compiling a vertex shader which has NUM_VERTEX=0.
79 835b197e Leszek Koltunski
// stride==1 we also don't like because then we have an exception ( stride*mMax-1 < stride*(mMax-1)+1 )
80 80961fc1 Leszek Koltunski
81
  public void correctStride(int stride)
82
    {
83 835b197e Leszek Koltunski
    if( mStride != stride && stride>1 )
84 80961fc1 Leszek Koltunski
      {
85 7958d843 Leszek Koltunski
      int[] tmp = new int[stride*mMax];
86 80961fc1 Leszek Koltunski
87 7958d843 Leszek Koltunski
      for(int i=0; i<mMax; i++)
88 80961fc1 Leszek Koltunski
        {
89
        tmp[stride*i+LOC_AND] = mAssociations[mStride*i+LOC_AND];
90
        tmp[stride*i+LOC_EQU] = mAssociations[mStride*i+LOC_EQU];
91
        }
92
93
      mAssociations = tmp;
94
      mStride = stride;
95
      }
96
    }
97
98 97755c02 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
99
100 de77a6c5 Leszek Koltunski
  public boolean matchesAssociation( int comp, int andAssoc, int equAssoc)
101 728a7820 Leszek Koltunski
    {
102 80961fc1 Leszek Koltunski
    return (andAssoc & mAssociations[mStride*comp+LOC_AND]) != 0 || (equAssoc == mAssociations[mStride*comp+LOC_EQU]);
103 728a7820 Leszek Koltunski
    }
104 97755c02 Leszek Koltunski
105
///////////////////////////////////////////////////////////////////////////////////////////////////
106
107 de77a6c5 Leszek Koltunski
  public void setEffectAssociationNow(int comp, int andAssociation, int equAssociation)
108 728a7820 Leszek Koltunski
    {
109 80961fc1 Leszek Koltunski
    mAssociations[mStride*comp+LOC_AND] = andAssociation;
110
    mAssociations[mStride*comp+LOC_EQU] = equAssociation;
111 97755c02 Leszek Koltunski
112 728a7820 Leszek Koltunski
    mUBO.invalidate();
113
    }
114 97755c02 Leszek Koltunski
115
///////////////////////////////////////////////////////////////////////////////////////////////////
116
117 de77a6c5 Leszek Koltunski
  public int getIndex()
118 728a7820 Leszek Koltunski
    {
119 7958d843 Leszek Koltunski
    return mUBO.createImmediatelyInt( 4*mStride*mMax, mAssociations);
120 728a7820 Leszek Koltunski
    }
121 97755c02 Leszek Koltunski
122
///////////////////////////////////////////////////////////////////////////////////////////////////
123
124 de77a6c5 Leszek Koltunski
  public void copy(int compTo, UniformBlockAssociation assocFrom, int compFrom)
125 728a7820 Leszek Koltunski
    {
126 80961fc1 Leszek Koltunski
    mAssociations[mStride*compTo+LOC_AND] = assocFrom.mAssociations[mStride*compFrom+LOC_AND];
127
    mAssociations[mStride*compTo+LOC_EQU] = assocFrom.mAssociations[mStride*compFrom+LOC_EQU];
128 728a7820 Leszek Koltunski
    }
129
130 8b36dabf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
131
132 de77a6c5 Leszek Koltunski
  public void markForDeletion()
133 8b36dabf Leszek Koltunski
    {
134
    mUBO.markForDeletion();
135
    }
136
137 728a7820 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
138
139 de77a6c5 Leszek Koltunski
  public void print()
140 728a7820 Leszek Koltunski
    {
141
    StringBuilder builder = new StringBuilder();
142
143
    builder.append(mUBO.getID());
144
    builder.append(' ');
145
146
    for(int i=0; i<8; i++)
147
      {
148 80961fc1 Leszek Koltunski
      builder.append(mAssociations[mStride*i+LOC_AND]);
149 728a7820 Leszek Koltunski
      builder.append(' ');
150 80961fc1 Leszek Koltunski
      builder.append(mAssociations[mStride*i+LOC_EQU]);
151 728a7820 Leszek Koltunski
      builder.append(' ');
152
      }
153
154
    String res = builder.toString();
155
156 8c57d77b Leszek Koltunski
    DistortedLibrary.logMessage("UniformBlockAssociation: "+res);
157 728a7820 Leszek Koltunski
    }
158 97755c02 Leszek Koltunski
  }