/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#include "tetraedge/te/te_warp_bloc.h"
#include "tetraedge/te/te_renderer.h"
#include "tetraedge/tetraedge.h"
namespace Tetraedge {
TeWarpBloc::TeWarpBloc() : _cubeFace(FaceInvalid), _textureDataFileOffset(0) {
_mesh.reset(TeMesh::makeInstance());
}
TeWarpBloc::~TeWarpBloc() {
}
void TeWarpBloc::color(const TeColor &col) {
color(0, col);
color(1, col);
color(2, col);
color(3, col);
}
void TeWarpBloc::color(uint num, const TeColor &col) {
_mesh->setColor(num, col);
}
void TeWarpBloc::create(CubeFace face, uint x, uint y, const TeVector2s32 &offset) {
_cubeFace = face;
_offset = offset;
_mesh->setConf(4, 4, TeMesh::MeshMode_TriangleStrip, 0, 0);
float x1 = offset._x * (1000.0f / x) - 500.0f;
float x2 = 1000.0f / x + x1;
float y1 = offset._y * (1000.0f / y) - 500.0f;
float y2 = 1000.0f / y + y1;
switch (face) {
case Face0:
_mesh->setVertex(0, TeVector3f32(-x1, 500, -y1));
_mesh->setVertex(1, TeVector3f32(-x2, 500, -y1));
_mesh->setVertex(2, TeVector3f32(-x2, 500, -y2));
_mesh->setVertex(3, TeVector3f32(-x1, 500, -y2));
break;
case Face1:
_mesh->setVertex(0, TeVector3f32(-x1, -500, y1));
_mesh->setVertex(1, TeVector3f32(-x2, -500, y1));
_mesh->setVertex(2, TeVector3f32(-x2, -500, y2));
_mesh->setVertex(3, TeVector3f32(-x1, -500, y2));
break;
case Face2:
_mesh->setVertex(0, TeVector3f32(-x1, y1, 500));
_mesh->setVertex(1, TeVector3f32(-x2, y1, 500));
_mesh->setVertex(2, TeVector3f32(-x2, y2, 500));
_mesh->setVertex(3, TeVector3f32(-x1, y2, 500));
break;
case Face3:
_mesh->setVertex(0, TeVector3f32(x1, y1, -500));
_mesh->setVertex(1, TeVector3f32(x2, y1, -500));
_mesh->setVertex(2, TeVector3f32(x2, y2, -500));
_mesh->setVertex(3, TeVector3f32(x1, y2, -500));
break;
case Face4:
_mesh->setVertex(0, TeVector3f32(500, y1, x1));
_mesh->setVertex(1, TeVector3f32(500, y1, x2));
_mesh->setVertex(2, TeVector3f32(500, y2, x2));
_mesh->setVertex(3, TeVector3f32(500, y2, x1));
break;
case Face5:
_mesh->setVertex(0, TeVector3f32(-500, y1, -x1));
_mesh->setVertex(1, TeVector3f32(-500, y1, -x2));
_mesh->setVertex(2, TeVector3f32(-500, y2, -x2));
_mesh->setVertex(3, TeVector3f32(-500, y2, -x1));
break;
default:
break;
}
_mesh->setTextureUV(0, TeVector2f32(0, 0));
_mesh->setTextureUV(1, TeVector2f32(1, 0));
_mesh->setTextureUV(2, TeVector2f32(1, 1));
_mesh->setTextureUV(3, TeVector2f32(0, 1));
_mesh->setNormal(0, TeVector3f32(0, 0, 1));
_mesh->setNormal(1, TeVector3f32(0, 0, 1));
_mesh->setNormal(2, TeVector3f32(0, 0, 1));
_mesh->setNormal(3, TeVector3f32(0, 0, 1));
_mesh->setIndex(0, 0);
_mesh->setIndex(1, 1);
_mesh->setIndex(2, 3);
_mesh->setIndex(3, 2);
_mesh->setColor(TeColor(255, 255, 255, 255));
}
void TeWarpBloc::create() {
_mesh->materials().clear();
}
void TeWarpBloc::index(uint offset, uint val) {
assert(offset < 4);
_mesh->setIndex(offset, val);
}
bool TeWarpBloc::isLoaded() const {
return _mesh->materials().size() > 0 && _mesh->material(0)->_texture;
}
void TeWarpBloc::loadTexture(Common::SeekableReadStream &file, const Common::String &type) {
if (isLoaded())
return;
if (!file.seek(_textureDataFileOffset))
error("TeWarpBloc::LoadTexture: seek error");
TeImage img;
img.load(file, type);
TeIntrusivePtr tex = Te3DTexture::makeInstance();
tex->load(img);
_mesh->defaultMaterial(tex);
}
void TeWarpBloc::render() {
_mesh->draw();
}
void TeWarpBloc::texture(uint idx, float x, float y) {
assert(idx < 4);
_mesh->setTextureUV(idx, TeVector2f32(x, y));
}
void TeWarpBloc::unloadTexture() {
if (!isLoaded())
return;
_mesh->material(0)->_texture.release();
}
void TeWarpBloc::vertex(uint idx, float x, float y, float z) {
assert(idx < 4);
_mesh->setVertex(idx, TeVector3f32(x, y, z));
}
TeVector3f32 TeWarpBloc::vertex(uint idx) const {
assert(idx < 4);
return _mesh->vertex(idx);
}
} // end namespace Tetraedge