17c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams/*
24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
37c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams *
47c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
57c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * you may not use this file except in compliance with the License.
67c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * You may obtain a copy of the License at
77c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams *
87c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
97c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams *
107c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * Unless required by applicable law or agreed to in writing, software
117c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
127c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * See the License for the specific language governing permissions and
147c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams * limitations under the License.
157c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams */
167c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
177c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams#ifndef ANDROID_RS_MESH_H
187c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams#define ANDROID_RS_MESH_H
197c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
207c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
217c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams#include "RenderScript.h"
227c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
237c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams// ---------------------------------------------------------------------------
247c878f3a8379daf21dca6de7aa722ff75328afbeJason Samsnamespace android {
257c878f3a8379daf21dca6de7aa722ff75328afbeJason Samsnamespace renderscript {
267c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
277c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
287c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams// An element is a group of Components that occupies one cell in a structure.
29ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukclass Mesh : public ObjectBase {
307c878f3a8379daf21dca6de7aa722ff75328afbeJason Samspublic:
31a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    Mesh(Context *);
324a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
337c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams    ~Mesh();
347c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
35a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    virtual void serialize(OStream *stream) const;
36a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
37a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    static Mesh *createFromStream(Context *rsc, IStream *stream);
384a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void init();
394a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
404a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    struct Hal {
414a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk        mutable void *drv;
424a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
434a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk        struct State {
444a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk            // Contains vertex data
454a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk            // Position, normal, texcoord, etc could either be strided in one allocation
464a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk            // of provided separetely in multiple ones
475ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk            Allocation **vertexBuffers;
484a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk            uint32_t vertexBuffersCount;
494a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
505ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk            // indexBuffers[i] could be NULL, in which case only primitives[i] is used
515ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk            Allocation **indexBuffers;
525ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk            uint32_t indexBuffersCount;
535ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk            RsPrimitive *primitives;
544a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk            uint32_t primitivesCount;
554a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk        };
564a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk        State state;
574a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    };
584a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    Hal mHal;
594a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
604a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void setVertexBuffer(Allocation *vb, uint32_t index) {
615ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk        mVertexBuffers[index].set(vb);
625ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk        mHal.state.vertexBuffers[index] = vb;
634a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    }
644a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk
654a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    void setPrimitive(Allocation *idx, RsPrimitive prim, uint32_t index) {
665ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk        mIndexBuffers[index].set(idx);
675ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk        mHal.state.indexBuffers[index] = idx;
685ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk        mHal.state.primitives[index] = prim;
694a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    }
70a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk
71164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    void render(Context *) const;
72164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    void renderPrimitive(Context *, uint32_t primIndex) const;
73164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    void renderPrimitiveRange(Context *, uint32_t primIndex, uint32_t start, uint32_t len) const;
74164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk    void uploadAll(Context *);
75aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
76a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk    // Bounding volumes
77a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk    float mBBoxMin[3];
78a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk    float mBBoxMax[3];
79a80145de0014aff9bdafe14601046ca511a2f90cAlex Sakhartchouk    void computeBBox();
807c878f3a8379daf21dca6de7aa722ff75328afbeJason Samsprotected:
815ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk    ObjectBaseRef<Allocation> *mVertexBuffers;
825ef2f53a00f64b7e156978d9de2e097394e4036aAlex Sakhartchouk    ObjectBaseRef<Allocation> *mIndexBuffers;
834a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk    bool mInitialized;
847c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams};
857c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
86ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukclass MeshContext {
877c878f3a8379daf21dca6de7aa722ff75328afbeJason Samspublic:
88a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    MeshContext() {
89a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    }
90a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    ~MeshContext() {
91a3b5960f6f28a81cd63abd69adcdfb5dcc05aa30Alex Sakhartchouk    }
927c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams};
937c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
947c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams}
957c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams}
964a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#endif //ANDROID_RS_MESH_H
977c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
987c878f3a8379daf21dca6de7aa722ff75328afbeJason Sams
99164aaedf7f24827c3da84acc733325ae985930d6Alex Sakhartchouk
100