/*
 * Copyright (C) 2009 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.
 */

#ifndef ANDROID_RS_BUILD_FOR_HOST
#include "rsContext.h"
#include <GLES/gl.h>
#else
#include "rsContextHostStub.h"
#include <OpenGL/gl.h>
#endif //ANDROID_RS_BUILD_FOR_HOST

using namespace android;
using namespace android::renderscript;


Light::Light(Context *rsc, bool isLocal, bool isMono) : ObjectBase(rsc)
{
    mAllocFile = __FILE__;
    mAllocLine = __LINE__;
    mIsLocal = isLocal;
    mIsMono = isMono;

    mPosition[0] = 0;
    mPosition[1] = 0;
    mPosition[2] = 1;
    mPosition[3] = 0;

    mColor[0] = 1.f;
    mColor[1] = 1.f;
    mColor[2] = 1.f;
    mColor[3] = 1.f;
}

Light::~Light()
{
}

void Light::setPosition(float x, float y, float z)
{
    mPosition[0] = x;
    mPosition[1] = y;
    mPosition[2] = z;
}

void Light::setColor(float r, float g, float b)
{
    mColor[0] = r;
    mColor[1] = g;
    mColor[2] = b;
}

void Light::setupGL(uint32_t num) const
{
    glLightfv(GL_LIGHT0 + num, GL_DIFFUSE, mColor);
    glLightfv(GL_LIGHT0 + num, GL_SPECULAR, mColor);
    glLightfv(GL_LIGHT0 + num, GL_POSITION, mPosition);
}

void Light::serialize(OStream *stream) const
{
    
}

Light *Light::createFromStream(Context *rsc, IStream *stream)
{
    return NULL;
}

////////////////////////////////////////////

LightState::LightState()
{
    clear();
}

LightState::~LightState()
{
}

void LightState::clear()
{
    mIsLocal = false;
    mIsMono = false;
}


////////////////////////////////////////////////////
//

namespace android {
namespace renderscript {

void rsi_LightBegin(Context *rsc)
{
    rsc->mStateLight.clear();
}

void rsi_LightSetLocal(Context *rsc, bool isLocal)
{
    rsc->mStateLight.mIsLocal = isLocal;
}

void rsi_LightSetMonochromatic(Context *rsc, bool isMono)
{
    rsc->mStateLight.mIsMono = isMono;
}

RsLight rsi_LightCreate(Context *rsc)
{
    Light *l = new Light(rsc, rsc->mStateLight.mIsLocal,
                         rsc->mStateLight.mIsMono);
    l->incUserRef();
    return l;
}

void rsi_LightSetColor(Context *rsc, RsLight vl, float r, float g, float b)
{
    Light *l = static_cast<Light *>(vl);
    l->setColor(r, g, b);
}

void rsi_LightSetPosition(Context *rsc, RsLight vl, float x, float y, float z)
{
    Light *l = static_cast<Light *>(vl);
    l->setPosition(x, y, z);
}



}
}
