m3g/m3gcore11/inc/m3g_vertexbuffer.h
author MattD <mattd@symbian.org>
Wed, 10 Feb 2010 20:59:36 +0000
branchNewGraphicsArchitecture
changeset 8 6c0e9409e175
parent 0 5d03bc08d59c
permissions -rw-r--r--
patch for Bug 1863 - CEikCba::SetBoundingRect() calls deprecated RWindowBase::SetShape()

/*
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: VertexBuffer interface
*
*/

#ifndef __M3G_VERTEXBUFFER_H__
#define __M3G_VERTEXBUFFER_H__

/*!
 * \internal
 * \file
 * \brief VertexBuffer interface
 */

#include "m3g_object.h"
#include "m3g_vertexarray.h"

/*!
 * \internal
 * \brief \c VertexBuffer object instance
 */
struct M3GVertexBufferImpl
{
    Object object;

    /*@dependent@*/
    VertexArray *colors;
    /*@dependent@*/
    VertexArray *normals;
    VertexArray *texCoords[M3G_NUM_TEXTURE_UNITS];
    /*@dependent@*/
    VertexArray *vertices;

    GLfloat texCoordScale[M3G_NUM_TEXTURE_UNITS];
    GLfloat texCoordBias[M3G_NUM_TEXTURE_UNITS][3];

    GLfloat vertexScale;
    GLfloat vertexBias[3];

    /*! \internal \brief Default vertex color */
    struct { GLubyte r, g, b, a; } defaultColor;
    
    M3Gbool locked;
    M3Gint vertexCount;
    M3Gint arrayCount;
    M3Gbitmask arrayMask;
    M3Gint timestamp;
    M3Gint verticesTimestamp;
    
    AABB bbox;
};

/*! \brief vertex component mask bits */
#define M3G_POSITION_BIT        0x01u
#define M3G_COLOR_BIT           0x02u
#define M3G_NORMAL_BIT          0x04u

#define M3G_TEXCOORD0_BIT       0x10u
#define M3G_TEXCOORD1_BIT       0x20u
#define M3G_TEXCOORD2_BIT       0x40u
#define M3G_TEXCOORD3_BIT       0x80u

/*----------------------------------------------------------------------
 * Internal functions
 *--------------------------------------------------------------------*/

static void m3gApplyScaleAndBias(const VertexBuffer *buffer);
static void m3gLockVertexBuffer(const VertexBuffer *buffer, M3Gint alphaFactor);
static void m3gReleaseVertexBuffer(const VertexBuffer *buffer);

static M3Gbool m3gGetVertex(const VertexBuffer *buffer, M3Gint idx, Vec3 *v);
static M3Gbool m3gGetNormal(const VertexBuffer *buffer, M3Gint idx, Vec3 *v);
static M3Gbool m3gGetTexCoord(const VertexBuffer *buffer, M3Gint idx, int unit, Vec3 *v);

static M3Gint m3gGetTimestamp(const VertexBuffer *buffer);
static M3Gint m3gGetNumVertices(const VertexBuffer *buffer);
static M3Gbitmask m3gGetArrayMask(const VertexBuffer *buffer);

static M3Gbool m3gValidateVertexBuffer(const VertexBuffer *vb,
                                       const Appearance *app,
                                       M3Gsizei maxIndex);
static void m3gGetBoundingBox(VertexBuffer *buffer, AABB *boundingBox);

static M3Gbool m3gMakeModifiedVertexBuffer(VertexBuffer *buffer,
                                           const VertexBuffer *srcBuffer,
                                           M3Gbitmask arrayMask,
                                           M3Gbool createArrays);


/* -------- Inline functions -------- */

/*!
 * \internal
 * \brief Queries whether a vertex buffer can be (safely) bound with
 * memory locking in effect
 */
static M3G_INLINE M3Gbool m3gValidateAlphaCache(const VertexBuffer *buffer) 
{
    const VertexArray *colArray = buffer->colors;
    return colArray ? (colArray->cachedColors != 0) : M3G_TRUE;
}

/*!
 * \internal
 * \brief Type-safe helper function
 */
static M3G_INLINE void m3gDeleteVertexBuffer(VertexBuffer *buffer)
{
    m3gDeleteObject((Object *) buffer);
}

/*!
 * \internal
 * \brief Gets number of vertices in this buffer.
 */
static M3G_INLINE M3Gint m3gGetNumVertices(const VertexBuffer *buffer)
{
    return buffer->vertexCount;
}

/*!
 * \internal
 * \brief Returns the current array mask for this buffer
 */
static M3G_INLINE M3Gbitmask m3gGetArrayMask(const VertexBuffer *buffer)
{
    return buffer->arrayMask;
}

#endif /*__M3G_VERTEXBUFFER_H__*/