• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.galaxy4;
2 
3 import android.content.res.Resources;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.renderscript.Allocation;
7 import android.renderscript.Matrix4f;
8 import android.renderscript.Mesh;
9 import android.renderscript.ProgramFragment;
10 import android.renderscript.ProgramFragmentFixedFunction;
11 import android.renderscript.ProgramRaster;
12 import android.renderscript.ProgramStore;
13 import android.renderscript.Sampler;
14 import android.renderscript.ProgramStore.BlendDstFunc;
15 import android.renderscript.ProgramStore.BlendSrcFunc;
16 import android.renderscript.ProgramVertex;
17 import android.renderscript.ProgramVertexFixedFunction;
18 import android.renderscript.RenderScriptGL;
19 import android.renderscript.ProgramVertexFixedFunction.Builder;
20 import android.util.Log;
21 import android.renderscript.Program;
22 import static android.renderscript.Sampler.Value.*;
23 
24 public class GalaxyRS {
25     public static final int BG_STAR_COUNT = 11000;
26     public static final int SPACE_CLOUDSTAR_COUNT = 25;
27     public static final int STATIC_STAR_COUNT = 50;
28     private Resources mRes;
29 
30     private RenderScriptGL mRS;
31     private ScriptC_galaxy mScript;
32 
33     private ScriptField_VpConsts mPvConsts;
34     private ScriptField_Particle mSpaceClouds;
35     private ScriptField_Particle mBgStars;
36     private ScriptField_Particle mStaticStars;
37     private Mesh mSpaceCloudsMesh;
38     private Mesh mBgStarsMesh;
39     private Mesh mStaticStarsMesh;
40 
41     private int mHeight;
42     private int mWidth;
43     private boolean mInited = false;
44     private int mDensityDPI;
45 
46     private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options();
47 
48     private Allocation mCloudAllocation;
49     private Allocation mStaticStarAllocation;
50     private Allocation mStaticStar2Allocation;
51     private Allocation mBgAllocation;
52 
init(int dpi, RenderScriptGL rs, Resources res, int width, int height)53     public void init(int dpi, RenderScriptGL rs, Resources res, int width, int height) {
54         if (!mInited) {
55             mDensityDPI = dpi;
56 
57             mRS = rs;
58             mRes = res;
59 
60             mWidth = width;
61             mHeight = height;
62 
63             mOptionsARGB.inScaled = false;
64             mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888;
65 
66             mSpaceClouds = new ScriptField_Particle(mRS, SPACE_CLOUDSTAR_COUNT);
67             Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS);
68             smb.addVertexAllocation(mSpaceClouds.getAllocation());
69             smb.addIndexSetType(Mesh.Primitive.POINT);
70             mSpaceCloudsMesh = smb.create();
71 
72             mBgStars = new ScriptField_Particle(mRS, BG_STAR_COUNT);
73             Mesh.AllocationBuilder smb2 = new Mesh.AllocationBuilder(mRS);
74             smb2.addVertexAllocation(mBgStars.getAllocation());
75             smb2.addIndexSetType(Mesh.Primitive.POINT);
76             mBgStarsMesh = smb2.create();
77 
78             mStaticStars = new ScriptField_Particle(mRS, STATIC_STAR_COUNT);
79             Mesh.AllocationBuilder smb3 = new Mesh.AllocationBuilder(mRS);
80             smb3.addVertexAllocation(mStaticStars.getAllocation());
81             smb3.addIndexSetType(Mesh.Primitive.POINT);
82             mStaticStarsMesh = smb3.create();
83 
84             mScript = new ScriptC_galaxy(mRS, mRes, R.raw.galaxy);
85             mScript.set_spaceCloudsMesh(mSpaceCloudsMesh);
86             mScript.bind_spaceClouds(mSpaceClouds);
87             mScript.set_bgStarsMesh(mBgStarsMesh);
88             mScript.bind_bgStars(mBgStars);
89             mScript.set_staticStarsMesh(mStaticStarsMesh);
90             mScript.bind_staticStars(mStaticStars);
91 
92             mPvConsts = new ScriptField_VpConsts(mRS, 1);
93 
94             createProgramVertex();
95             createProgramRaster();
96             createProgramFragmentStore();
97             createProgramFragment();
98 
99             loadTextures();
100 
101             mScript.set_densityDPI(mDensityDPI);
102             mRS.bindRootScript(mScript);
103             mScript.invoke_positionParticles();
104             mInited = true;
105         }
106     }
107 
loadTexture(int id)108     private Allocation loadTexture(int id) {
109         final Allocation allocation = Allocation.createFromBitmapResource(mRS, mRes, id,
110                                            Allocation.MipmapControl.MIPMAP_NONE,
111                                            Allocation.USAGE_GRAPHICS_TEXTURE);
112         return allocation;
113     }
114 
loadTextures()115     private void loadTextures() {
116         mStaticStarAllocation = loadTexture(R.drawable.staticstar);
117         mStaticStar2Allocation = loadTexture(R.drawable.staticstar2);
118         mCloudAllocation = loadTexture(R.drawable.cloud);
119         mBgAllocation = loadTexture(R.drawable.bg);
120         mScript.set_textureSpaceCloud(mCloudAllocation);
121         mScript.set_textureStaticStar(mStaticStarAllocation);
122         mScript.set_textureStaticStar2(mStaticStar2Allocation);
123         mScript.set_textureBg(mBgAllocation);
124     }
125 
getProjectionNormalized(int w, int h)126     private Matrix4f getProjectionNormalized(int w, int h) {
127         Matrix4f m1 = new Matrix4f();
128         Matrix4f m2 = new Matrix4f();
129 
130         if (w > h) {
131             float aspect = ((float) w) / h;
132             m1.loadFrustum(-aspect, aspect, -1, 1, 1, 100);
133         } else {
134             float aspect = ((float) h) / w;
135             m1.loadFrustum(-1, 1, -aspect, aspect, 1, 100);
136         }
137 
138         m2.loadRotate(180, 0, 1, 0);
139         m1.loadMultiply(m1, m2);
140         m2.loadScale(-1, 1, 1);
141         m1.loadMultiply(m1, m2);
142         m2.loadTranslate(0, 0, 1);
143         m1.loadMultiply(m1, m2);
144         return m1;
145     }
146 
updateProjectionMatrices(int w, int h)147     private void updateProjectionMatrices(int w, int h) {
148         mWidth = w;
149         mHeight = h;
150         Matrix4f proj = new Matrix4f();
151         proj.loadOrthoWindow(mWidth, mHeight);
152         Matrix4f projNorm = getProjectionNormalized(mWidth, mHeight);
153         ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item();
154         i.MVP = projNorm;
155         i.scaleSize = mDensityDPI / 120.0f;
156         mPvConsts.set(i, 0, true);
157         mScript.invoke_positionParticles();
158     }
159 
createProgramVertex()160     public void createProgramVertex() {
161         ProgramVertexFixedFunction.Constants mPvOrthoAlloc =
162             new ProgramVertexFixedFunction.Constants(mRS);
163         Matrix4f proj = new Matrix4f();
164         proj.loadOrthoWindow(mWidth, mHeight);
165         mPvOrthoAlloc.setProjection(proj);
166 
167         ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
168         ProgramVertex pv = pvb.create();
169         ((ProgramVertexFixedFunction) pv).bindConstants(mPvOrthoAlloc);
170         mScript.set_vertBg(pv);
171         updateProjectionMatrices(mWidth, mHeight);
172 
173         // cloud
174         ProgramVertex.Builder builder = new ProgramVertex.Builder(mRS);
175         builder.setShader(mRes, R.raw.spacecloud_vs);
176         builder.addConstant(mPvConsts.getType());
177         builder.addInput(mSpaceCloudsMesh.getVertexAllocation(0).getType().getElement());
178         ProgramVertex pvs = builder.create();
179         pvs.bindConstants(mPvConsts.getAllocation(), 0);
180         mRS.bindProgramVertex(pvs);
181 
182         mScript.set_vertSpaceClouds(pvs);
183 
184         // bg stars
185         builder = new ProgramVertex.Builder(mRS);
186         builder.setShader(mRes, R.raw.bgstar_vs);
187         builder.addConstant(mPvConsts.getType());
188         builder.addInput(mBgStarsMesh.getVertexAllocation(0).getType().getElement());
189         pvs = builder.create();
190         pvs.bindConstants(mPvConsts.getAllocation(), 0);
191         mRS.bindProgramVertex(pvs);
192         mScript.set_vertBgStars(pvs);
193 
194         // static stars
195         builder = new ProgramVertex.Builder(mRS);
196         builder.setShader(mRes, R.raw.staticstar_vs);
197         builder.addConstant(mPvConsts.getType());
198         builder.addInput(mBgStarsMesh.getVertexAllocation(0).getType().getElement());
199         pvs = builder.create();
200         pvs.bindConstants(mPvConsts.getAllocation(), 0);
201         mRS.bindProgramVertex(pvs);
202         mScript.set_vertStaticStars(pvs);
203     }
204 
createProgramFragment()205     private void createProgramFragment() {
206         // bg
207         Sampler.Builder samplerBuilder = new Sampler.Builder(mRS);
208         samplerBuilder.setMinification(LINEAR);
209         samplerBuilder.setMagnification(LINEAR);
210         samplerBuilder.setWrapS(WRAP);
211         samplerBuilder.setWrapT(WRAP);
212         Sampler sn = samplerBuilder.create();
213         ProgramFragmentFixedFunction.Builder builderff =
214                 new ProgramFragmentFixedFunction.Builder(mRS);
215         builderff = new ProgramFragmentFixedFunction.Builder(mRS);
216         builderff.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
217                 ProgramFragmentFixedFunction.Builder.Format.RGB, 0);
218         ProgramFragment pfff = builderff.create();
219         mScript.set_fragBg(pfff);
220         pfff.bindSampler(sn, 0);
221 
222         // cloud
223         ProgramFragment.Builder builder = new ProgramFragment.Builder(mRS);
224 
225         builder.setShader(mRes, R.raw.spacecloud_fs);
226         builder.addTexture(Program.TextureType.TEXTURE_2D);
227 
228         ProgramFragment pf = builder.create();
229         pf.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
230         mScript.set_fragSpaceClouds(pf);
231 
232         // bg stars
233         builder = new ProgramFragment.Builder(mRS);
234         builder.setShader(mRes, R.raw.bgstar_fs);
235         pf = builder.create();
236         mScript.set_fragBgStars(pf);
237 
238         // static stars
239         builder = new ProgramFragment.Builder(mRS);
240         builder.setShader(mRes, R.raw.staticstar_fs);
241         builder.addTexture(Program.TextureType.TEXTURE_2D);
242         builder.addTexture(Program.TextureType.TEXTURE_2D);
243         pf = builder.create();
244         mScript.set_fragStaticStars(pf);
245     }
246 
createProgramRaster()247     private void createProgramRaster() {
248         ProgramRaster.Builder builder = new ProgramRaster.Builder(mRS);
249         builder.setPointSpriteEnabled(true);
250         ProgramRaster pr = builder.create();
251         mRS.bindProgramRaster(pr);
252     }
253 
createProgramFragmentStore()254     private void createProgramFragmentStore() {
255         ProgramStore.Builder builder = new ProgramStore.Builder(mRS);
256         builder.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE);
257         mRS.bindProgramStore(builder.create());
258     }
259 
start()260     public void start() {
261         mRS.bindRootScript(mScript);
262     }
263 
stop()264     public void stop() {
265         mRS.bindRootScript(null);
266     }
267 
resize(int width, int height)268     public void resize(int width, int height) {
269         mWidth = width;
270         mHeight = height;
271         createProgramVertex();
272     }
273 }