/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.fountain; import android.content.res.Resources; import android.renderscript.*; import android.util.Log; public class FountainRS { public static final int PART_COUNT = 20000; static class SomeData { public int x; public int y; public int rate; public int count; public float r; public float g; public float b; } public FountainRS() { } public void init(RenderScriptGL rs, Resources res, int width, int height) { mRS = rs; mRes = res; initRS(); } public void newTouchPosition(int x, int y, int rate) { if (mSD.rate == 0) { mSD.r = ((x & 0x1) != 0) ? 0.f : 1.f; mSD.g = ((x & 0x2) != 0) ? 0.f : 1.f; mSD.b = ((x & 0x4) != 0) ? 0.f : 1.f; if ((mSD.r + mSD.g + mSD.b) < 0.9f) { mSD.r = 0.8f; mSD.g = 0.5f; mSD.b = 1.f; } } mSD.rate = rate; mSD.x = x; mSD.y = y; mIntAlloc.data(mSD); } ///////////////////////////////////////// private Resources mRes; private RenderScriptGL mRS; private Allocation mIntAlloc; private SimpleMesh mSM; private SomeData mSD; private Type mSDType; private void initRS() { mSD = new SomeData(); mSDType = Type.createFromClass(mRS, SomeData.class, 1, "SomeData"); mIntAlloc = Allocation.createTyped(mRS, mSDType); mSD.count = PART_COUNT; mIntAlloc.data(mSD); Element.Builder eb = new Element.Builder(mRS); eb.add(Element.createVector(mRS, Element.DataType.FLOAT_32, 2), "delta"); eb.add(Element.createAttrib(mRS, Element.DataType.FLOAT_32, Element.DataKind.POSITION, 2), "position"); eb.add(Element.createAttrib(mRS, Element.DataType.UNSIGNED_8, Element.DataKind.COLOR, 4), "color"); Element primElement = eb.create(); SimpleMesh.Builder smb = new SimpleMesh.Builder(mRS); int vtxSlot = smb.addVertexType(primElement, PART_COUNT); smb.setPrimitive(Primitive.POINT); mSM = smb.create(); mSM.setName("PartMesh"); Allocation partAlloc = mSM.createVertexAllocation(vtxSlot); partAlloc.setName("PartBuffer"); mSM.bindVertexAllocation(partAlloc, 0); // All setup of named objects should be done by this point // because we are about to compile the script. ScriptC.Builder sb = new ScriptC.Builder(mRS); sb.setScript(mRes, R.raw.fountain); sb.setRoot(true); sb.setType(mSDType, "Control", 0); sb.setType(mSM.getVertexType(0), "point", 1); Script script = sb.create(); script.setClearColor(0.0f, 0.0f, 0.0f, 1.0f); script.bindAllocation(mIntAlloc, 0); script.bindAllocation(partAlloc, 1); mRS.contextBindRootScript(script); } }