Ran dos2unix on lib3ds files
This commit is contained in:
@@ -1,253 +1,253 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
static void
|
||||
fog_read(Lib3dsAtmosphere *at, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_FOG, io);
|
||||
|
||||
at->fog_near_plane = lib3ds_io_read_float(io);
|
||||
at->fog_near_density = lib3ds_io_read_float(io);
|
||||
at->fog_far_plane = lib3ds_io_read_float(io);
|
||||
at->fog_far_density = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_LIN_COLOR_F: {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
at->fog_color[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case CHK_COLOR_F:
|
||||
break;
|
||||
|
||||
case CHK_FOG_BGND: {
|
||||
at->fog_background = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
layer_fog_read(Lib3dsAtmosphere *at, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int have_lin = FALSE;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_LAYER_FOG, io);
|
||||
|
||||
at->layer_fog_near_y = lib3ds_io_read_float(io);
|
||||
at->layer_fog_far_y = lib3ds_io_read_float(io);
|
||||
at->layer_fog_density = lib3ds_io_read_float(io);
|
||||
at->layer_fog_flags = lib3ds_io_read_dword(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_LIN_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, at->layer_fog_color);
|
||||
have_lin = TRUE;
|
||||
break;
|
||||
|
||||
case CHK_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, at->layer_fog_color);
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
distance_cue_read(Lib3dsAtmosphere *at, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_DISTANCE_CUE, io);
|
||||
|
||||
at->dist_cue_near_plane = lib3ds_io_read_float(io);
|
||||
at->dist_cue_near_dimming = lib3ds_io_read_float(io);
|
||||
at->dist_cue_far_plane = lib3ds_io_read_float(io);
|
||||
at->dist_cue_far_dimming = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_DCUE_BGND: {
|
||||
at->dist_cue_background = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
lib3ds_chunk_read(&c, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_FOG: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
fog_read(atmosphere, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_LAYER_FOG: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
layer_fog_read(atmosphere, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DISTANCE_CUE: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
distance_cue_read(atmosphere, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_FOG: {
|
||||
atmosphere->use_fog = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_LAYER_FOG: {
|
||||
atmosphere->use_layer_fog = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_DISTANCE_CUE: {
|
||||
atmosphere->use_dist_cue = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io) {
|
||||
if (atmosphere->use_fog) { /*---- LIB3DS_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_FOG;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_float(io, atmosphere->fog_near_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->fog_near_density);
|
||||
lib3ds_io_write_float(io, atmosphere->fog_far_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->fog_far_density);
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, atmosphere->fog_color);
|
||||
}
|
||||
if (atmosphere->fog_background) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_FOG_BGND;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_layer_fog) { /*---- LIB3DS_LAYER_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_LAYER_FOG;
|
||||
c.size = 40;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, atmosphere->layer_fog_near_y);
|
||||
lib3ds_io_write_float(io, atmosphere->layer_fog_far_y);
|
||||
lib3ds_io_write_float(io, atmosphere->layer_fog_near_y);
|
||||
lib3ds_io_write_dword(io, atmosphere->layer_fog_flags);
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, atmosphere->fog_color);
|
||||
}
|
||||
}
|
||||
|
||||
if (atmosphere->use_dist_cue) { /*---- LIB3DS_DISTANCE_CUE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DISTANCE_CUE;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_near_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_near_dimming);
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_far_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_far_dimming);
|
||||
if (atmosphere->dist_cue_background) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DCUE_BGND;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_fog) { /*---- LIB3DS_USE_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_FOG;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_layer_fog) { /*---- LIB3DS_USE_LAYER_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_LAYER_FOG;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_dist_cue) { /*---- LIB3DS_USE_DISTANCE_CUE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_V_GRADIENT;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
static void
|
||||
fog_read(Lib3dsAtmosphere *at, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_FOG, io);
|
||||
|
||||
at->fog_near_plane = lib3ds_io_read_float(io);
|
||||
at->fog_near_density = lib3ds_io_read_float(io);
|
||||
at->fog_far_plane = lib3ds_io_read_float(io);
|
||||
at->fog_far_density = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_LIN_COLOR_F: {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
at->fog_color[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case CHK_COLOR_F:
|
||||
break;
|
||||
|
||||
case CHK_FOG_BGND: {
|
||||
at->fog_background = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
layer_fog_read(Lib3dsAtmosphere *at, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int have_lin = FALSE;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_LAYER_FOG, io);
|
||||
|
||||
at->layer_fog_near_y = lib3ds_io_read_float(io);
|
||||
at->layer_fog_far_y = lib3ds_io_read_float(io);
|
||||
at->layer_fog_density = lib3ds_io_read_float(io);
|
||||
at->layer_fog_flags = lib3ds_io_read_dword(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_LIN_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, at->layer_fog_color);
|
||||
have_lin = TRUE;
|
||||
break;
|
||||
|
||||
case CHK_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, at->layer_fog_color);
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
distance_cue_read(Lib3dsAtmosphere *at, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_DISTANCE_CUE, io);
|
||||
|
||||
at->dist_cue_near_plane = lib3ds_io_read_float(io);
|
||||
at->dist_cue_near_dimming = lib3ds_io_read_float(io);
|
||||
at->dist_cue_far_plane = lib3ds_io_read_float(io);
|
||||
at->dist_cue_far_dimming = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_DCUE_BGND: {
|
||||
at->dist_cue_background = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_atmosphere_read(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
lib3ds_chunk_read(&c, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_FOG: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
fog_read(atmosphere, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_LAYER_FOG: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
layer_fog_read(atmosphere, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DISTANCE_CUE: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
distance_cue_read(atmosphere, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_FOG: {
|
||||
atmosphere->use_fog = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_LAYER_FOG: {
|
||||
atmosphere->use_layer_fog = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_DISTANCE_CUE: {
|
||||
atmosphere->use_dist_cue = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_atmosphere_write(Lib3dsAtmosphere *atmosphere, Lib3dsIo *io) {
|
||||
if (atmosphere->use_fog) { /*---- LIB3DS_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_FOG;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_float(io, atmosphere->fog_near_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->fog_near_density);
|
||||
lib3ds_io_write_float(io, atmosphere->fog_far_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->fog_far_density);
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, atmosphere->fog_color);
|
||||
}
|
||||
if (atmosphere->fog_background) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_FOG_BGND;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_layer_fog) { /*---- LIB3DS_LAYER_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_LAYER_FOG;
|
||||
c.size = 40;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, atmosphere->layer_fog_near_y);
|
||||
lib3ds_io_write_float(io, atmosphere->layer_fog_far_y);
|
||||
lib3ds_io_write_float(io, atmosphere->layer_fog_near_y);
|
||||
lib3ds_io_write_dword(io, atmosphere->layer_fog_flags);
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, atmosphere->fog_color);
|
||||
}
|
||||
}
|
||||
|
||||
if (atmosphere->use_dist_cue) { /*---- LIB3DS_DISTANCE_CUE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DISTANCE_CUE;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_near_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_near_dimming);
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_far_plane);
|
||||
lib3ds_io_write_float(io, atmosphere->dist_cue_far_dimming);
|
||||
if (atmosphere->dist_cue_background) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DCUE_BGND;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_fog) { /*---- LIB3DS_USE_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_FOG;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_layer_fog) { /*---- LIB3DS_USE_LAYER_FOG ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_LAYER_FOG;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (atmosphere->use_dist_cue) { /*---- LIB3DS_USE_DISTANCE_CUE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_V_GRADIENT;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,213 +1,213 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
static void
|
||||
solid_bgnd_read(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int have_lin = FALSE;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_SOLID_BGND, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_LIN_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, background->solid_color);
|
||||
have_lin = TRUE;
|
||||
break;
|
||||
|
||||
case CHK_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, background->solid_color);
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
v_gradient_read(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int index[2];
|
||||
float col[2][3][3];
|
||||
int have_lin = 0;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_V_GRADIENT, io);
|
||||
|
||||
background->gradient_percent = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
index[0] = index[1] = 0;
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, col[0][index[0]]);
|
||||
index[0]++;
|
||||
break;
|
||||
|
||||
case CHK_LIN_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, col[1][index[1]]);
|
||||
index[1]++;
|
||||
have_lin = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
background->gradient_top[i] = col[have_lin][0][i];
|
||||
background->gradient_middle[i] = col[have_lin][1][i];
|
||||
background->gradient_bottom[i] = col[have_lin][2][i];
|
||||
}
|
||||
}
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
lib3ds_chunk_read(&c, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_BIT_MAP: {
|
||||
lib3ds_io_read_string(io, background->bitmap_name, 64);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_SOLID_BGND: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
solid_bgnd_read(background, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_V_GRADIENT: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
v_gradient_read(background, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_BIT_MAP: {
|
||||
background->use_bitmap = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_SOLID_BGND: {
|
||||
background->use_solid = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_V_GRADIENT: {
|
||||
background->use_gradient = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
colorf_write(float rgb[3], Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, rgb);
|
||||
|
||||
c.chunk = CHK_LIN_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, rgb);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
colorf_defined(float rgb[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (fabs(rgb[i]) > LIB3DS_EPSILON) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(i < 3);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
if (strlen(background->bitmap_name)) { /*---- LIB3DS_BIT_MAP ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_BIT_MAP;
|
||||
c.size = 6 + 1 + (uint32_t)strlen(background->bitmap_name);
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_string(io, background->bitmap_name);
|
||||
}
|
||||
|
||||
if (colorf_defined(background->solid_color)) { /*---- LIB3DS_SOLID_BGND ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_SOLID_BGND;
|
||||
c.size = 42;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
colorf_write(background->solid_color, io);
|
||||
}
|
||||
|
||||
if (colorf_defined(background->gradient_top) ||
|
||||
colorf_defined(background->gradient_middle) ||
|
||||
colorf_defined(background->gradient_bottom)) { /*---- LIB3DS_V_GRADIENT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_V_GRADIENT;
|
||||
c.size = 118;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, background->gradient_percent);
|
||||
colorf_write(background->gradient_top, io);
|
||||
colorf_write(background->gradient_middle, io);
|
||||
colorf_write(background->gradient_bottom, io);
|
||||
}
|
||||
|
||||
if (background->use_bitmap) { /*---- LIB3DS_USE_BIT_MAP ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_BIT_MAP;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (background->use_solid) { /*---- LIB3DS_USE_SOLID_BGND ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_SOLID_BGND;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (background->use_gradient) { /*---- LIB3DS_USE_V_GRADIENT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_V_GRADIENT;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
static void
|
||||
solid_bgnd_read(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int have_lin = FALSE;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_SOLID_BGND, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_LIN_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, background->solid_color);
|
||||
have_lin = TRUE;
|
||||
break;
|
||||
|
||||
case CHK_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, background->solid_color);
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
v_gradient_read(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int index[2];
|
||||
float col[2][3][3];
|
||||
int have_lin = 0;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_V_GRADIENT, io);
|
||||
|
||||
background->gradient_percent = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
index[0] = index[1] = 0;
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, col[0][index[0]]);
|
||||
index[0]++;
|
||||
break;
|
||||
|
||||
case CHK_LIN_COLOR_F:
|
||||
lib3ds_io_read_rgb(io, col[1][index[1]]);
|
||||
index[1]++;
|
||||
have_lin = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
background->gradient_top[i] = col[have_lin][0][i];
|
||||
background->gradient_middle[i] = col[have_lin][1][i];
|
||||
background->gradient_bottom[i] = col[have_lin][2][i];
|
||||
}
|
||||
}
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_background_read(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
lib3ds_chunk_read(&c, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_BIT_MAP: {
|
||||
lib3ds_io_read_string(io, background->bitmap_name, 64);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_SOLID_BGND: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
solid_bgnd_read(background, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_V_GRADIENT: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
v_gradient_read(background, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_BIT_MAP: {
|
||||
background->use_bitmap = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_SOLID_BGND: {
|
||||
background->use_solid = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_USE_V_GRADIENT: {
|
||||
background->use_gradient = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
colorf_write(float rgb[3], Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, rgb);
|
||||
|
||||
c.chunk = CHK_LIN_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, rgb);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
colorf_defined(float rgb[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (fabs(rgb[i]) > LIB3DS_EPSILON) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return(i < 3);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_background_write(Lib3dsBackground *background, Lib3dsIo *io) {
|
||||
if (strlen(background->bitmap_name)) { /*---- LIB3DS_BIT_MAP ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_BIT_MAP;
|
||||
c.size = 6 + 1 + (uint32_t)strlen(background->bitmap_name);
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_string(io, background->bitmap_name);
|
||||
}
|
||||
|
||||
if (colorf_defined(background->solid_color)) { /*---- LIB3DS_SOLID_BGND ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_SOLID_BGND;
|
||||
c.size = 42;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
colorf_write(background->solid_color, io);
|
||||
}
|
||||
|
||||
if (colorf_defined(background->gradient_top) ||
|
||||
colorf_defined(background->gradient_middle) ||
|
||||
colorf_defined(background->gradient_bottom)) { /*---- LIB3DS_V_GRADIENT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_V_GRADIENT;
|
||||
c.size = 118;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, background->gradient_percent);
|
||||
colorf_write(background->gradient_top, io);
|
||||
colorf_write(background->gradient_middle, io);
|
||||
colorf_write(background->gradient_bottom, io);
|
||||
}
|
||||
|
||||
if (background->use_bitmap) { /*---- LIB3DS_USE_BIT_MAP ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_BIT_MAP;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (background->use_solid) { /*---- LIB3DS_USE_SOLID_BGND ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_SOLID_BGND;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (background->use_gradient) { /*---- LIB3DS_USE_V_GRADIENT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_USE_V_GRADIENT;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,165 +1,165 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*!
|
||||
* Return a new Lib3dsCamera object.
|
||||
*
|
||||
* Object is initialized with the given name and fov=45. All other
|
||||
* values are 0.
|
||||
*
|
||||
* \param name Name of this camera. Must not be NULL. Must be < 64 characters.
|
||||
*
|
||||
* \return Lib3dsCamera object or NULL on failure.
|
||||
*/
|
||||
Lib3dsCamera*
|
||||
lib3ds_camera_new(const char *name) {
|
||||
Lib3dsCamera *camera;
|
||||
|
||||
assert(name);
|
||||
assert(strlen(name) < 64);
|
||||
|
||||
camera = (Lib3dsCamera*)calloc(sizeof(Lib3dsCamera), 1);
|
||||
if (!camera) {
|
||||
return(0);
|
||||
}
|
||||
strcpy(camera->name, name);
|
||||
camera->fov = 45.0f;
|
||||
return(camera);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Free a Lib3dsCamera object and all of its resources.
|
||||
*
|
||||
* \param camera Lib3dsCamera object to be freed.
|
||||
*/
|
||||
void
|
||||
lib3ds_camera_free(Lib3dsCamera *camera) {
|
||||
memset(camera, 0, sizeof(Lib3dsCamera));
|
||||
free(camera);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Read a camera definition from a file.
|
||||
*
|
||||
* This function is called by lib3ds_file_read(), and you probably
|
||||
* don't want to call it directly.
|
||||
*
|
||||
* \param camera A Lib3dsCamera to be filled in.
|
||||
* \param io A Lib3dsIo object previously set up by the caller.
|
||||
*
|
||||
* \see lib3ds_file_read
|
||||
*/
|
||||
void
|
||||
lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_N_CAMERA, io);
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
camera->position[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
for (i = 0; i < 3; ++i) {
|
||||
camera->target[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
}
|
||||
camera->roll = lib3ds_io_read_float(io);
|
||||
{
|
||||
float s;
|
||||
s = lib3ds_io_read_float(io);
|
||||
if (fabs(s) < LIB3DS_EPSILON) {
|
||||
camera->fov = 45.0;
|
||||
} else {
|
||||
camera->fov = 2400.0f / s;
|
||||
}
|
||||
}
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_CAM_SEE_CONE: {
|
||||
camera->see_cone = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case CHK_CAM_RANGES: {
|
||||
camera->near_range = lib3ds_io_read_float(io);
|
||||
camera->far_range = lib3ds_io_read_float(io);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Write a camera definition to a file.
|
||||
*
|
||||
* This function is called by lib3ds_file_write(), and you probably
|
||||
* don't want to call it directly.
|
||||
*
|
||||
* \param camera A Lib3dsCamera to be written.
|
||||
* \param io A Lib3dsIo object previously set up by the caller.
|
||||
*
|
||||
* \see lib3ds_file_write
|
||||
*/
|
||||
void
|
||||
lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_N_CAMERA;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_vector(io, camera->position);
|
||||
lib3ds_io_write_vector(io, camera->target);
|
||||
lib3ds_io_write_float(io, camera->roll);
|
||||
if (fabs(camera->fov) < LIB3DS_EPSILON) {
|
||||
lib3ds_io_write_float(io, 2400.0f / 45.0f);
|
||||
} else {
|
||||
lib3ds_io_write_float(io, 2400.0f / camera->fov);
|
||||
}
|
||||
|
||||
if (camera->see_cone) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_CAM_SEE_CONE;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_CAM_RANGES;
|
||||
c.size = 14;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, camera->near_range);
|
||||
lib3ds_io_write_float(io, camera->far_range);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*!
|
||||
* Return a new Lib3dsCamera object.
|
||||
*
|
||||
* Object is initialized with the given name and fov=45. All other
|
||||
* values are 0.
|
||||
*
|
||||
* \param name Name of this camera. Must not be NULL. Must be < 64 characters.
|
||||
*
|
||||
* \return Lib3dsCamera object or NULL on failure.
|
||||
*/
|
||||
Lib3dsCamera*
|
||||
lib3ds_camera_new(const char *name) {
|
||||
Lib3dsCamera *camera;
|
||||
|
||||
assert(name);
|
||||
assert(strlen(name) < 64);
|
||||
|
||||
camera = (Lib3dsCamera*)calloc(sizeof(Lib3dsCamera), 1);
|
||||
if (!camera) {
|
||||
return(0);
|
||||
}
|
||||
strcpy(camera->name, name);
|
||||
camera->fov = 45.0f;
|
||||
return(camera);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Free a Lib3dsCamera object and all of its resources.
|
||||
*
|
||||
* \param camera Lib3dsCamera object to be freed.
|
||||
*/
|
||||
void
|
||||
lib3ds_camera_free(Lib3dsCamera *camera) {
|
||||
memset(camera, 0, sizeof(Lib3dsCamera));
|
||||
free(camera);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Read a camera definition from a file.
|
||||
*
|
||||
* This function is called by lib3ds_file_read(), and you probably
|
||||
* don't want to call it directly.
|
||||
*
|
||||
* \param camera A Lib3dsCamera to be filled in.
|
||||
* \param io A Lib3dsIo object previously set up by the caller.
|
||||
*
|
||||
* \see lib3ds_file_read
|
||||
*/
|
||||
void
|
||||
lib3ds_camera_read(Lib3dsCamera *camera, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_N_CAMERA, io);
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
camera->position[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
for (i = 0; i < 3; ++i) {
|
||||
camera->target[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
}
|
||||
camera->roll = lib3ds_io_read_float(io);
|
||||
{
|
||||
float s;
|
||||
s = lib3ds_io_read_float(io);
|
||||
if (fabs(s) < LIB3DS_EPSILON) {
|
||||
camera->fov = 45.0;
|
||||
} else {
|
||||
camera->fov = 2400.0f / s;
|
||||
}
|
||||
}
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_CAM_SEE_CONE: {
|
||||
camera->see_cone = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case CHK_CAM_RANGES: {
|
||||
camera->near_range = lib3ds_io_read_float(io);
|
||||
camera->far_range = lib3ds_io_read_float(io);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Write a camera definition to a file.
|
||||
*
|
||||
* This function is called by lib3ds_file_write(), and you probably
|
||||
* don't want to call it directly.
|
||||
*
|
||||
* \param camera A Lib3dsCamera to be written.
|
||||
* \param io A Lib3dsIo object previously set up by the caller.
|
||||
*
|
||||
* \see lib3ds_file_write
|
||||
*/
|
||||
void
|
||||
lib3ds_camera_write(Lib3dsCamera *camera, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_N_CAMERA;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_vector(io, camera->position);
|
||||
lib3ds_io_write_vector(io, camera->target);
|
||||
lib3ds_io_write_float(io, camera->roll);
|
||||
if (fabs(camera->fov) < LIB3DS_EPSILON) {
|
||||
lib3ds_io_write_float(io, 2400.0f / 45.0f);
|
||||
} else {
|
||||
lib3ds_io_write_float(io, 2400.0f / camera->fov);
|
||||
}
|
||||
|
||||
if (camera->see_cone) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_CAM_SEE_CONE;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_CAM_RANGES;
|
||||
c.size = 14;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, camera->near_range);
|
||||
lib3ds_io_write_float(io, camera->far_range);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,146 +1,146 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*#define LIB3DS_CHUNK_DEBUG*/
|
||||
/*#define LIB3DS_CHUNK_WARNING*/
|
||||
|
||||
|
||||
/*!
|
||||
* Reads a 3d-Studio chunk header from a little endian file stream.
|
||||
*
|
||||
* \param c The chunk to store the data.
|
||||
* \param io The file stream.
|
||||
*
|
||||
* \return True on success, False otherwise.
|
||||
*/
|
||||
void
|
||||
lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
assert(io);
|
||||
c->cur = lib3ds_io_tell(io);
|
||||
c->chunk = lib3ds_io_read_word(io);
|
||||
c->size = lib3ds_io_read_dword(io);
|
||||
c->end = c->cur + c->size;
|
||||
c->cur += 6;
|
||||
if (c->size < 6) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_ERROR, "Invalid chunk header.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
assert(io);
|
||||
lib3ds_chunk_read(c, io);
|
||||
if ((chunk != 0) && (c->chunk != chunk)) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_ERROR, "Unexpected chunk found.");
|
||||
}
|
||||
((Lib3dsIoImpl*)io->impl)->log_indent++;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
c->cur = lib3ds_io_tell(io);
|
||||
}
|
||||
|
||||
|
||||
uint16_t
|
||||
lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
Lib3dsChunk d;
|
||||
|
||||
if (c->cur >= c->end) {
|
||||
assert(c->cur == c->end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
lib3ds_io_seek(io, (long)c->cur, LIB3DS_SEEK_SET);
|
||||
d.chunk = lib3ds_io_read_word(io);
|
||||
d.size = lib3ds_io_read_dword(io);
|
||||
c->cur += d.size;
|
||||
|
||||
if (io->log_func) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_INFO, "%s (0x%X) size=%lu", lib3ds_chunk_name(d.chunk), d.chunk, d.size);
|
||||
}
|
||||
|
||||
return d.chunk;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
lib3ds_io_seek(io, -6, LIB3DS_SEEK_CUR);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
((Lib3dsIoImpl*)io->impl)->log_indent--;
|
||||
lib3ds_io_seek(io, c->end, LIB3DS_SEEK_SET);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Writes a 3d-Studio chunk header into a little endian file stream.
|
||||
*
|
||||
* \param c The chunk to be written.
|
||||
* \param io The file stream.
|
||||
*
|
||||
* \return True on success, False otherwise.
|
||||
*/
|
||||
void
|
||||
lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
lib3ds_io_write_word(io, c->chunk);
|
||||
lib3ds_io_write_dword(io, c->size);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
c->size = 0;
|
||||
c->cur = lib3ds_io_tell(io);
|
||||
lib3ds_io_write_word(io, c->chunk);
|
||||
lib3ds_io_write_dword(io, c->size);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
c->size = lib3ds_io_tell(io) - c->cur;
|
||||
lib3ds_io_seek(io, c->cur + 2, LIB3DS_SEEK_SET);
|
||||
lib3ds_io_write_dword(io, c->size);
|
||||
c->cur += c->size;
|
||||
lib3ds_io_seek(io, c->cur, LIB3DS_SEEK_SET);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io) {
|
||||
if (io->log_func) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_WARN, "Unknown Chunk: %s (0x%X)", lib3ds_chunk_name(chunk), chunk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*#define LIB3DS_CHUNK_DEBUG*/
|
||||
/*#define LIB3DS_CHUNK_WARNING*/
|
||||
|
||||
|
||||
/*!
|
||||
* Reads a 3d-Studio chunk header from a little endian file stream.
|
||||
*
|
||||
* \param c The chunk to store the data.
|
||||
* \param io The file stream.
|
||||
*
|
||||
* \return True on success, False otherwise.
|
||||
*/
|
||||
void
|
||||
lib3ds_chunk_read(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
assert(io);
|
||||
c->cur = lib3ds_io_tell(io);
|
||||
c->chunk = lib3ds_io_read_word(io);
|
||||
c->size = lib3ds_io_read_dword(io);
|
||||
c->end = c->cur + c->size;
|
||||
c->cur += 6;
|
||||
if (c->size < 6) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_ERROR, "Invalid chunk header.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_start(Lib3dsChunk *c, uint16_t chunk, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
assert(io);
|
||||
lib3ds_chunk_read(c, io);
|
||||
if ((chunk != 0) && (c->chunk != chunk)) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_ERROR, "Unexpected chunk found.");
|
||||
}
|
||||
((Lib3dsIoImpl*)io->impl)->log_indent++;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_tell(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
c->cur = lib3ds_io_tell(io);
|
||||
}
|
||||
|
||||
|
||||
uint16_t
|
||||
lib3ds_chunk_read_next(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
Lib3dsChunk d;
|
||||
|
||||
if (c->cur >= c->end) {
|
||||
assert(c->cur == c->end);
|
||||
return 0;
|
||||
}
|
||||
|
||||
lib3ds_io_seek(io, (long)c->cur, LIB3DS_SEEK_SET);
|
||||
d.chunk = lib3ds_io_read_word(io);
|
||||
d.size = lib3ds_io_read_dword(io);
|
||||
c->cur += d.size;
|
||||
|
||||
if (io->log_func) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_INFO, "%s (0x%X) size=%lu", lib3ds_chunk_name(d.chunk), d.chunk, d.size);
|
||||
}
|
||||
|
||||
return d.chunk;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_reset(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
lib3ds_io_seek(io, -6, LIB3DS_SEEK_CUR);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_read_end(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
((Lib3dsIoImpl*)io->impl)->log_indent--;
|
||||
lib3ds_io_seek(io, c->end, LIB3DS_SEEK_SET);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Writes a 3d-Studio chunk header into a little endian file stream.
|
||||
*
|
||||
* \param c The chunk to be written.
|
||||
* \param io The file stream.
|
||||
*
|
||||
* \return True on success, False otherwise.
|
||||
*/
|
||||
void
|
||||
lib3ds_chunk_write(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
lib3ds_io_write_word(io, c->chunk);
|
||||
lib3ds_io_write_dword(io, c->size);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_write_start(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
c->size = 0;
|
||||
c->cur = lib3ds_io_tell(io);
|
||||
lib3ds_io_write_word(io, c->chunk);
|
||||
lib3ds_io_write_dword(io, c->size);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_write_end(Lib3dsChunk *c, Lib3dsIo *io) {
|
||||
assert(c);
|
||||
c->size = lib3ds_io_tell(io) - c->cur;
|
||||
lib3ds_io_seek(io, c->cur + 2, LIB3DS_SEEK_SET);
|
||||
lib3ds_io_write_dword(io, c->size);
|
||||
c->cur += c->size;
|
||||
lib3ds_io_seek(io, c->cur, LIB3DS_SEEK_SET);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_chunk_unknown(uint16_t chunk, Lib3dsIo *io) {
|
||||
if (io->log_func) {
|
||||
lib3ds_io_log(io, LIB3DS_LOG_WARN, "Unknown Chunk: %s (0x%X)", lib3ds_chunk_name(chunk), chunk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,259 +1,259 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
typedef struct Lib3dsChunkTable {
|
||||
uint32_t chunk;
|
||||
const char* name;
|
||||
} Lib3dsChunkTable;
|
||||
|
||||
|
||||
static Lib3dsChunkTable lib3ds_chunk_table[] = {
|
||||
{CHK_NULL_CHUNK, "NULL_CHUNK"},
|
||||
{CHK_M3DMAGIC, "M3DMAGIC"},
|
||||
{CHK_SMAGIC, "SMAGIC"},
|
||||
{CHK_LMAGIC, "LMAGIC"},
|
||||
{CHK_MLIBMAGIC, "MLIBMAGIC"},
|
||||
{CHK_MATMAGIC, "MATMAGIC"},
|
||||
{CHK_CMAGIC, "CMAGIC"},
|
||||
{CHK_M3D_VERSION, "M3D_VERSION"},
|
||||
{CHK_M3D_KFVERSION, "M3D_KFVERSION"},
|
||||
{CHK_COLOR_F, "COLOR_F"},
|
||||
{CHK_COLOR_24, "COLOR_24"},
|
||||
{CHK_LIN_COLOR_24, "LIN_COLOR_24"},
|
||||
{CHK_LIN_COLOR_F, "LIN_COLOR_F"},
|
||||
{CHK_INT_PERCENTAGE, "INT_PERCENTAGE"},
|
||||
{CHK_FLOAT_PERCENTAGE, "FLOAT_PERCENTAGE"},
|
||||
{CHK_MDATA, "MDATA"},
|
||||
{CHK_MESH_VERSION, "MESH_VERSION"},
|
||||
{CHK_MASTER_SCALE, "MASTER_SCALE"},
|
||||
{CHK_LO_SHADOW_BIAS, "LO_SHADOW_BIAS"},
|
||||
{CHK_HI_SHADOW_BIAS, "HI_SHADOW_BIAS"},
|
||||
{CHK_SHADOW_MAP_SIZE, "SHADOW_MAP_SIZE"},
|
||||
{CHK_SHADOW_SAMPLES, "SHADOW_SAMPLES"},
|
||||
{CHK_SHADOW_RANGE, "SHADOW_RANGE"},
|
||||
{CHK_SHADOW_FILTER, "SHADOW_FILTER"},
|
||||
{CHK_RAY_BIAS, "RAY_BIAS"},
|
||||
{CHK_O_CONSTS, "O_CONSTS"},
|
||||
{CHK_AMBIENT_LIGHT, "AMBIENT_LIGHT"},
|
||||
{CHK_BIT_MAP, "BIT_MAP"},
|
||||
{CHK_SOLID_BGND, "SOLID_BGND"},
|
||||
{CHK_V_GRADIENT, "V_GRADIENT"},
|
||||
{CHK_USE_BIT_MAP, "USE_BIT_MAP"},
|
||||
{CHK_USE_SOLID_BGND, "USE_SOLID_BGND"},
|
||||
{CHK_USE_V_GRADIENT, "USE_V_GRADIENT"},
|
||||
{CHK_FOG, "FOG"},
|
||||
{CHK_FOG_BGND, "FOG_BGND"},
|
||||
{CHK_LAYER_FOG, "LAYER_FOG"},
|
||||
{CHK_DISTANCE_CUE, "DISTANCE_CUE"},
|
||||
{CHK_DCUE_BGND, "DCUE_BGND"},
|
||||
{CHK_USE_FOG, "USE_FOG"},
|
||||
{CHK_USE_LAYER_FOG, "USE_LAYER_FOG"},
|
||||
{CHK_USE_DISTANCE_CUE, "USE_DISTANCE_CUE"},
|
||||
{CHK_MAT_ENTRY, "MAT_ENTRY"},
|
||||
{CHK_MAT_NAME, "MAT_NAME"},
|
||||
{CHK_MAT_AMBIENT, "MAT_AMBIENT"},
|
||||
{CHK_MAT_DIFFUSE, "MAT_DIFFUSE"},
|
||||
{CHK_MAT_SPECULAR, "MAT_SPECULAR"},
|
||||
{CHK_MAT_SHININESS, "MAT_SHININESS"},
|
||||
{CHK_MAT_SHIN2PCT, "MAT_SHIN2PCT"},
|
||||
{CHK_MAT_TRANSPARENCY, "MAT_TRANSPARENCY"},
|
||||
{CHK_MAT_XPFALL, "MAT_XPFALL"},
|
||||
{CHK_MAT_USE_XPFALL, "MAT_USE_XPFALL"},
|
||||
{CHK_MAT_REFBLUR, "MAT_REFBLUR"},
|
||||
{CHK_MAT_SHADING, "MAT_SHADING"},
|
||||
{CHK_MAT_USE_REFBLUR, "MAT_USE_REFBLUR"},
|
||||
{CHK_MAT_SELF_ILLUM, "MAT_SELF_ILLUM"},
|
||||
{CHK_MAT_TWO_SIDE, "MAT_TWO_SIDE"},
|
||||
{CHK_MAT_DECAL, "MAT_DECAL"},
|
||||
{CHK_MAT_ADDITIVE, "MAT_ADDITIVE"},
|
||||
{CHK_MAT_SELF_ILPCT, "MAT_SELF_ILPCT"},
|
||||
{CHK_MAT_WIRE, "MAT_WIRE"},
|
||||
{CHK_MAT_FACEMAP, "MAT_FACEMAP"},
|
||||
{CHK_MAT_PHONGSOFT, "MAT_PHONGSOFT"},
|
||||
{CHK_MAT_WIREABS, "MAT_WIREABS"},
|
||||
{CHK_MAT_WIRE_SIZE, "MAT_WIRE_SIZE"},
|
||||
{CHK_MAT_TEXMAP, "MAT_TEXMAP"},
|
||||
{CHK_MAT_SXP_TEXT_DATA, "MAT_SXP_TEXT_DATA"},
|
||||
{CHK_MAT_TEXMASK, "MAT_TEXMASK"},
|
||||
{CHK_MAT_SXP_TEXTMASK_DATA, "MAT_SXP_TEXTMASK_DATA"},
|
||||
{CHK_MAT_TEX2MAP, "MAT_TEX2MAP"},
|
||||
{CHK_MAT_SXP_TEXT2_DATA, "MAT_SXP_TEXT2_DATA"},
|
||||
{CHK_MAT_TEX2MASK, "MAT_TEX2MASK"},
|
||||
{CHK_MAT_SXP_TEXT2MASK_DATA, "MAT_SXP_TEXT2MASK_DATA"},
|
||||
{CHK_MAT_OPACMAP, "MAT_OPACMAP"},
|
||||
{CHK_MAT_SXP_OPAC_DATA, "MAT_SXP_OPAC_DATA"},
|
||||
{CHK_MAT_OPACMASK, "MAT_OPACMASK"},
|
||||
{CHK_MAT_SXP_OPACMASK_DATA, "MAT_SXP_OPACMASK_DATA"},
|
||||
{CHK_MAT_BUMPMAP, "MAT_BUMPMAP"},
|
||||
{CHK_MAT_SXP_BUMP_DATA, "MAT_SXP_BUMP_DATA"},
|
||||
{CHK_MAT_BUMPMASK, "MAT_BUMPMASK"},
|
||||
{CHK_MAT_SXP_BUMPMASK_DATA, "MAT_SXP_BUMPMASK_DATA"},
|
||||
{CHK_MAT_SPECMAP, "MAT_SPECMAP"},
|
||||
{CHK_MAT_SXP_SPEC_DATA, "MAT_SXP_SPEC_DATA"},
|
||||
{CHK_MAT_SPECMASK, "MAT_SPECMASK"},
|
||||
{CHK_MAT_SXP_SPECMASK_DATA, "MAT_SXP_SPECMASK_DATA"},
|
||||
{CHK_MAT_SHINMAP, "MAT_SHINMAP"},
|
||||
{CHK_MAT_SXP_SHIN_DATA, "MAT_SXP_SHIN_DATA"},
|
||||
{CHK_MAT_SHINMASK, "MAT_SHINMASK"},
|
||||
{CHK_MAT_SXP_SHINMASK_DATA, "MAT_SXP_SHINMASK_DATA"},
|
||||
{CHK_MAT_SELFIMAP, "MAT_SELFIMAP"},
|
||||
{CHK_MAT_SXP_SELFI_DATA, "MAT_SXP_SELFI_DATA"},
|
||||
{CHK_MAT_SELFIMASK, "MAT_SELFIMASK"},
|
||||
{CHK_MAT_SXP_SELFIMASK_DATA, "MAT_SXP_SELFIMASK_DATA"},
|
||||
{CHK_MAT_REFLMAP, "MAT_REFLMAP"},
|
||||
{CHK_MAT_REFLMASK, "MAT_REFLMASK"},
|
||||
{CHK_MAT_SXP_REFLMASK_DATA, "MAT_SXP_REFLMASK_DATA"},
|
||||
{CHK_MAT_ACUBIC, "MAT_ACUBIC"},
|
||||
{CHK_MAT_MAPNAME, "MAT_MAPNAME"},
|
||||
{CHK_MAT_MAP_TILING, "MAT_MAP_TILING"},
|
||||
{CHK_MAT_MAP_TEXBLUR, "MAT_MAP_TEXBLUR"},
|
||||
{CHK_MAT_MAP_USCALE, "MAT_MAP_USCALE"},
|
||||
{CHK_MAT_MAP_VSCALE, "MAT_MAP_VSCALE"},
|
||||
{CHK_MAT_MAP_UOFFSET, "MAT_MAP_UOFFSET"},
|
||||
{CHK_MAT_MAP_VOFFSET, "MAT_MAP_VOFFSET"},
|
||||
{CHK_MAT_MAP_ANG, "MAT_MAP_ANG"},
|
||||
{CHK_MAT_MAP_COL1, "MAT_MAP_COL1"},
|
||||
{CHK_MAT_MAP_COL2, "MAT_MAP_COL2"},
|
||||
{CHK_MAT_MAP_RCOL, "MAT_MAP_RCOL"},
|
||||
{CHK_MAT_MAP_GCOL, "MAT_MAP_GCOL"},
|
||||
{CHK_MAT_MAP_BCOL, "MAT_MAP_BCOL"},
|
||||
{CHK_NAMED_OBJECT, "NAMED_OBJECT"},
|
||||
{CHK_N_DIRECT_LIGHT, "N_DIRECT_LIGHT"},
|
||||
{CHK_DL_OFF, "DL_OFF"},
|
||||
{CHK_DL_OUTER_RANGE, "DL_OUTER_RANGE"},
|
||||
{CHK_DL_INNER_RANGE, "DL_INNER_RANGE"},
|
||||
{CHK_DL_MULTIPLIER, "DL_MULTIPLIER"},
|
||||
{CHK_DL_EXCLUDE, "DL_EXCLUDE"},
|
||||
{CHK_DL_ATTENUATE, "DL_ATTENUATE"},
|
||||
{CHK_DL_SPOTLIGHT, "DL_SPOTLIGHT"},
|
||||
{CHK_DL_SPOT_ROLL, "DL_SPOT_ROLL"},
|
||||
{CHK_DL_SHADOWED, "DL_SHADOWED"},
|
||||
{CHK_DL_LOCAL_SHADOW2, "DL_LOCAL_SHADOW2"},
|
||||
{CHK_DL_SEE_CONE, "DL_SEE_CONE"},
|
||||
{CHK_DL_SPOT_RECTANGULAR, "DL_SPOT_RECTANGULAR"},
|
||||
{CHK_DL_SPOT_ASPECT, "DL_SPOT_ASPECT"},
|
||||
{CHK_DL_SPOT_PROJECTOR, "DL_SPOT_PROJECTOR"},
|
||||
{CHK_DL_SPOT_OVERSHOOT, "DL_SPOT_OVERSHOOT"},
|
||||
{CHK_DL_RAY_BIAS, "DL_RAY_BIAS"},
|
||||
{CHK_DL_RAYSHAD, "DL_RAYSHAD"},
|
||||
{CHK_N_CAMERA, "N_CAMERA"},
|
||||
{CHK_CAM_SEE_CONE, "CAM_SEE_CONE"},
|
||||
{CHK_CAM_RANGES, "CAM_RANGES"},
|
||||
{CHK_OBJ_HIDDEN, "OBJ_HIDDEN"},
|
||||
{CHK_OBJ_VIS_LOFTER, "OBJ_VIS_LOFTER"},
|
||||
{CHK_OBJ_DOESNT_CAST, "OBJ_DOESNT_CAST"},
|
||||
{CHK_OBJ_DONT_RCVSHADOW, "OBJ_DONT_RCVSHADOW"},
|
||||
{CHK_OBJ_MATTE, "OBJ_MATTE"},
|
||||
{CHK_OBJ_FAST, "OBJ_FAST"},
|
||||
{CHK_OBJ_PROCEDURAL, "OBJ_PROCEDURAL"},
|
||||
{CHK_OBJ_FROZEN, "OBJ_FROZEN"},
|
||||
{CHK_N_TRI_OBJECT, "N_TRI_OBJECT"},
|
||||
{CHK_POINT_ARRAY, "POINT_ARRAY"},
|
||||
{CHK_POINT_FLAG_ARRAY, "POINT_FLAG_ARRAY"},
|
||||
{CHK_FACE_ARRAY, "FACE_ARRAY"},
|
||||
{CHK_MSH_MAT_GROUP, "MSH_MAT_GROUP"},
|
||||
{CHK_SMOOTH_GROUP, "SMOOTH_GROUP"},
|
||||
{CHK_MSH_BOXMAP, "MSH_BOXMAP"},
|
||||
{CHK_TEX_VERTS, "TEX_VERTS"},
|
||||
{CHK_MESH_MATRIX, "MESH_MATRIX"},
|
||||
{CHK_MESH_COLOR, "MESH_COLOR"},
|
||||
{CHK_MESH_TEXTURE_INFO, "MESH_TEXTURE_INFO"},
|
||||
{CHK_KFDATA, "KFDATA"},
|
||||
{CHK_KFHDR, "KFHDR"},
|
||||
{CHK_KFSEG, "KFSEG"},
|
||||
{CHK_KFCURTIME, "KFCURTIME"},
|
||||
{CHK_AMBIENT_NODE_TAG, "AMBIENT_NODE_TAG"},
|
||||
{CHK_OBJECT_NODE_TAG, "OBJECT_NODE_TAG"},
|
||||
{CHK_CAMERA_NODE_TAG, "CAMERA_NODE_TAG"},
|
||||
{CHK_TARGET_NODE_TAG, "TARGET_NODE_TAG"},
|
||||
{CHK_LIGHT_NODE_TAG, "LIGHT_NODE_TAG"},
|
||||
{CHK_L_TARGET_NODE_TAG, "L_TARGET_NODE_TAG"},
|
||||
{CHK_SPOTLIGHT_NODE_TAG, "SPOTLIGHT_NODE_TAG"},
|
||||
{CHK_NODE_ID, "NODE_ID"},
|
||||
{CHK_NODE_HDR, "NODE_HDR"},
|
||||
{CHK_PIVOT, "PIVOT"},
|
||||
{CHK_INSTANCE_NAME, "INSTANCE_NAME"},
|
||||
{CHK_MORPH_SMOOTH, "MORPH_SMOOTH"},
|
||||
{CHK_BOUNDBOX, "BOUNDBOX"},
|
||||
{CHK_POS_TRACK_TAG, "POS_TRACK_TAG"},
|
||||
{CHK_COL_TRACK_TAG, "COL_TRACK_TAG"},
|
||||
{CHK_ROT_TRACK_TAG, "ROT_TRACK_TAG"},
|
||||
{CHK_SCL_TRACK_TAG, "SCL_TRACK_TAG"},
|
||||
{CHK_MORPH_TRACK_TAG, "MORPH_TRACK_TAG"},
|
||||
{CHK_FOV_TRACK_TAG, "FOV_TRACK_TAG"},
|
||||
{CHK_ROLL_TRACK_TAG, "ROLL_TRACK_TAG"},
|
||||
{CHK_HOT_TRACK_TAG, "HOT_TRACK_TAG"},
|
||||
{CHK_FALL_TRACK_TAG, "FALL_TRACK_TAG"},
|
||||
{CHK_HIDE_TRACK_TAG, "HIDE_TRACK_TAG"},
|
||||
{CHK_POLY_2D, "POLY_2D"},
|
||||
{CHK_SHAPE_OK, "SHAPE_OK"},
|
||||
{CHK_SHAPE_NOT_OK, "SHAPE_NOT_OK"},
|
||||
{CHK_SHAPE_HOOK, "SHAPE_HOOK"},
|
||||
{CHK_PATH_3D, "PATH_3D"},
|
||||
{CHK_PATH_MATRIX, "PATH_MATRIX"},
|
||||
{CHK_SHAPE_2D, "SHAPE_2D"},
|
||||
{CHK_M_SCALE, "M_SCALE"},
|
||||
{CHK_M_TWIST, "M_TWIST"},
|
||||
{CHK_M_TEETER, "M_TEETER"},
|
||||
{CHK_M_FIT, "M_FIT"},
|
||||
{CHK_M_BEVEL, "M_BEVEL"},
|
||||
{CHK_XZ_CURVE, "XZ_CURVE"},
|
||||
{CHK_YZ_CURVE, "YZ_CURVE"},
|
||||
{CHK_INTERPCT, "INTERPCT"},
|
||||
{CHK_DEFORM_LIMIT, "DEFORM_LIMIT"},
|
||||
{CHK_USE_CONTOUR, "USE_CONTOUR"},
|
||||
{CHK_USE_TWEEN, "USE_TWEEN"},
|
||||
{CHK_USE_SCALE, "USE_SCALE"},
|
||||
{CHK_USE_TWIST, "USE_TWIST"},
|
||||
{CHK_USE_TEETER, "USE_TEETER"},
|
||||
{CHK_USE_FIT, "USE_FIT"},
|
||||
{CHK_USE_BEVEL, "USE_BEVEL"},
|
||||
{CHK_DEFAULT_VIEW, "DEFAULT_VIEW"},
|
||||
{CHK_VIEW_TOP, "VIEW_TOP"},
|
||||
{CHK_VIEW_BOTTOM, "VIEW_BOTTOM"},
|
||||
{CHK_VIEW_LEFT, "VIEW_LEFT"},
|
||||
{CHK_VIEW_RIGHT, "VIEW_RIGHT"},
|
||||
{CHK_VIEW_FRONT, "VIEW_FRONT"},
|
||||
{CHK_VIEW_BACK, "VIEW_BACK"},
|
||||
{CHK_VIEW_USER, "VIEW_USER"},
|
||||
{CHK_VIEW_CAMERA, "VIEW_CAMERA"},
|
||||
{CHK_VIEW_WINDOW, "VIEW_WINDOW"},
|
||||
{CHK_VIEWPORT_LAYOUT_OLD, "VIEWPORT_LAYOUT_OLD"},
|
||||
{CHK_VIEWPORT_DATA_OLD, "VIEWPORT_DATA_OLD"},
|
||||
{CHK_VIEWPORT_LAYOUT, "VIEWPORT_LAYOUT"},
|
||||
{CHK_VIEWPORT_DATA, "VIEWPORT_DATA"},
|
||||
{CHK_VIEWPORT_DATA_3, "VIEWPORT_DATA_3"},
|
||||
{CHK_VIEWPORT_SIZE, "VIEWPORT_SIZE"},
|
||||
{CHK_NETWORK_VIEW, "NETWORK_VIEW"},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
|
||||
const char*
|
||||
lib3ds_chunk_name(uint16_t chunk) {
|
||||
Lib3dsChunkTable *p;
|
||||
|
||||
for (p = lib3ds_chunk_table; p->name != 0; ++p) {
|
||||
if (p->chunk == chunk) {
|
||||
return(p->name);
|
||||
}
|
||||
}
|
||||
return("***UNKNOWN***");
|
||||
}
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
typedef struct Lib3dsChunkTable {
|
||||
uint32_t chunk;
|
||||
const char* name;
|
||||
} Lib3dsChunkTable;
|
||||
|
||||
|
||||
static Lib3dsChunkTable lib3ds_chunk_table[] = {
|
||||
{CHK_NULL_CHUNK, "NULL_CHUNK"},
|
||||
{CHK_M3DMAGIC, "M3DMAGIC"},
|
||||
{CHK_SMAGIC, "SMAGIC"},
|
||||
{CHK_LMAGIC, "LMAGIC"},
|
||||
{CHK_MLIBMAGIC, "MLIBMAGIC"},
|
||||
{CHK_MATMAGIC, "MATMAGIC"},
|
||||
{CHK_CMAGIC, "CMAGIC"},
|
||||
{CHK_M3D_VERSION, "M3D_VERSION"},
|
||||
{CHK_M3D_KFVERSION, "M3D_KFVERSION"},
|
||||
{CHK_COLOR_F, "COLOR_F"},
|
||||
{CHK_COLOR_24, "COLOR_24"},
|
||||
{CHK_LIN_COLOR_24, "LIN_COLOR_24"},
|
||||
{CHK_LIN_COLOR_F, "LIN_COLOR_F"},
|
||||
{CHK_INT_PERCENTAGE, "INT_PERCENTAGE"},
|
||||
{CHK_FLOAT_PERCENTAGE, "FLOAT_PERCENTAGE"},
|
||||
{CHK_MDATA, "MDATA"},
|
||||
{CHK_MESH_VERSION, "MESH_VERSION"},
|
||||
{CHK_MASTER_SCALE, "MASTER_SCALE"},
|
||||
{CHK_LO_SHADOW_BIAS, "LO_SHADOW_BIAS"},
|
||||
{CHK_HI_SHADOW_BIAS, "HI_SHADOW_BIAS"},
|
||||
{CHK_SHADOW_MAP_SIZE, "SHADOW_MAP_SIZE"},
|
||||
{CHK_SHADOW_SAMPLES, "SHADOW_SAMPLES"},
|
||||
{CHK_SHADOW_RANGE, "SHADOW_RANGE"},
|
||||
{CHK_SHADOW_FILTER, "SHADOW_FILTER"},
|
||||
{CHK_RAY_BIAS, "RAY_BIAS"},
|
||||
{CHK_O_CONSTS, "O_CONSTS"},
|
||||
{CHK_AMBIENT_LIGHT, "AMBIENT_LIGHT"},
|
||||
{CHK_BIT_MAP, "BIT_MAP"},
|
||||
{CHK_SOLID_BGND, "SOLID_BGND"},
|
||||
{CHK_V_GRADIENT, "V_GRADIENT"},
|
||||
{CHK_USE_BIT_MAP, "USE_BIT_MAP"},
|
||||
{CHK_USE_SOLID_BGND, "USE_SOLID_BGND"},
|
||||
{CHK_USE_V_GRADIENT, "USE_V_GRADIENT"},
|
||||
{CHK_FOG, "FOG"},
|
||||
{CHK_FOG_BGND, "FOG_BGND"},
|
||||
{CHK_LAYER_FOG, "LAYER_FOG"},
|
||||
{CHK_DISTANCE_CUE, "DISTANCE_CUE"},
|
||||
{CHK_DCUE_BGND, "DCUE_BGND"},
|
||||
{CHK_USE_FOG, "USE_FOG"},
|
||||
{CHK_USE_LAYER_FOG, "USE_LAYER_FOG"},
|
||||
{CHK_USE_DISTANCE_CUE, "USE_DISTANCE_CUE"},
|
||||
{CHK_MAT_ENTRY, "MAT_ENTRY"},
|
||||
{CHK_MAT_NAME, "MAT_NAME"},
|
||||
{CHK_MAT_AMBIENT, "MAT_AMBIENT"},
|
||||
{CHK_MAT_DIFFUSE, "MAT_DIFFUSE"},
|
||||
{CHK_MAT_SPECULAR, "MAT_SPECULAR"},
|
||||
{CHK_MAT_SHININESS, "MAT_SHININESS"},
|
||||
{CHK_MAT_SHIN2PCT, "MAT_SHIN2PCT"},
|
||||
{CHK_MAT_TRANSPARENCY, "MAT_TRANSPARENCY"},
|
||||
{CHK_MAT_XPFALL, "MAT_XPFALL"},
|
||||
{CHK_MAT_USE_XPFALL, "MAT_USE_XPFALL"},
|
||||
{CHK_MAT_REFBLUR, "MAT_REFBLUR"},
|
||||
{CHK_MAT_SHADING, "MAT_SHADING"},
|
||||
{CHK_MAT_USE_REFBLUR, "MAT_USE_REFBLUR"},
|
||||
{CHK_MAT_SELF_ILLUM, "MAT_SELF_ILLUM"},
|
||||
{CHK_MAT_TWO_SIDE, "MAT_TWO_SIDE"},
|
||||
{CHK_MAT_DECAL, "MAT_DECAL"},
|
||||
{CHK_MAT_ADDITIVE, "MAT_ADDITIVE"},
|
||||
{CHK_MAT_SELF_ILPCT, "MAT_SELF_ILPCT"},
|
||||
{CHK_MAT_WIRE, "MAT_WIRE"},
|
||||
{CHK_MAT_FACEMAP, "MAT_FACEMAP"},
|
||||
{CHK_MAT_PHONGSOFT, "MAT_PHONGSOFT"},
|
||||
{CHK_MAT_WIREABS, "MAT_WIREABS"},
|
||||
{CHK_MAT_WIRE_SIZE, "MAT_WIRE_SIZE"},
|
||||
{CHK_MAT_TEXMAP, "MAT_TEXMAP"},
|
||||
{CHK_MAT_SXP_TEXT_DATA, "MAT_SXP_TEXT_DATA"},
|
||||
{CHK_MAT_TEXMASK, "MAT_TEXMASK"},
|
||||
{CHK_MAT_SXP_TEXTMASK_DATA, "MAT_SXP_TEXTMASK_DATA"},
|
||||
{CHK_MAT_TEX2MAP, "MAT_TEX2MAP"},
|
||||
{CHK_MAT_SXP_TEXT2_DATA, "MAT_SXP_TEXT2_DATA"},
|
||||
{CHK_MAT_TEX2MASK, "MAT_TEX2MASK"},
|
||||
{CHK_MAT_SXP_TEXT2MASK_DATA, "MAT_SXP_TEXT2MASK_DATA"},
|
||||
{CHK_MAT_OPACMAP, "MAT_OPACMAP"},
|
||||
{CHK_MAT_SXP_OPAC_DATA, "MAT_SXP_OPAC_DATA"},
|
||||
{CHK_MAT_OPACMASK, "MAT_OPACMASK"},
|
||||
{CHK_MAT_SXP_OPACMASK_DATA, "MAT_SXP_OPACMASK_DATA"},
|
||||
{CHK_MAT_BUMPMAP, "MAT_BUMPMAP"},
|
||||
{CHK_MAT_SXP_BUMP_DATA, "MAT_SXP_BUMP_DATA"},
|
||||
{CHK_MAT_BUMPMASK, "MAT_BUMPMASK"},
|
||||
{CHK_MAT_SXP_BUMPMASK_DATA, "MAT_SXP_BUMPMASK_DATA"},
|
||||
{CHK_MAT_SPECMAP, "MAT_SPECMAP"},
|
||||
{CHK_MAT_SXP_SPEC_DATA, "MAT_SXP_SPEC_DATA"},
|
||||
{CHK_MAT_SPECMASK, "MAT_SPECMASK"},
|
||||
{CHK_MAT_SXP_SPECMASK_DATA, "MAT_SXP_SPECMASK_DATA"},
|
||||
{CHK_MAT_SHINMAP, "MAT_SHINMAP"},
|
||||
{CHK_MAT_SXP_SHIN_DATA, "MAT_SXP_SHIN_DATA"},
|
||||
{CHK_MAT_SHINMASK, "MAT_SHINMASK"},
|
||||
{CHK_MAT_SXP_SHINMASK_DATA, "MAT_SXP_SHINMASK_DATA"},
|
||||
{CHK_MAT_SELFIMAP, "MAT_SELFIMAP"},
|
||||
{CHK_MAT_SXP_SELFI_DATA, "MAT_SXP_SELFI_DATA"},
|
||||
{CHK_MAT_SELFIMASK, "MAT_SELFIMASK"},
|
||||
{CHK_MAT_SXP_SELFIMASK_DATA, "MAT_SXP_SELFIMASK_DATA"},
|
||||
{CHK_MAT_REFLMAP, "MAT_REFLMAP"},
|
||||
{CHK_MAT_REFLMASK, "MAT_REFLMASK"},
|
||||
{CHK_MAT_SXP_REFLMASK_DATA, "MAT_SXP_REFLMASK_DATA"},
|
||||
{CHK_MAT_ACUBIC, "MAT_ACUBIC"},
|
||||
{CHK_MAT_MAPNAME, "MAT_MAPNAME"},
|
||||
{CHK_MAT_MAP_TILING, "MAT_MAP_TILING"},
|
||||
{CHK_MAT_MAP_TEXBLUR, "MAT_MAP_TEXBLUR"},
|
||||
{CHK_MAT_MAP_USCALE, "MAT_MAP_USCALE"},
|
||||
{CHK_MAT_MAP_VSCALE, "MAT_MAP_VSCALE"},
|
||||
{CHK_MAT_MAP_UOFFSET, "MAT_MAP_UOFFSET"},
|
||||
{CHK_MAT_MAP_VOFFSET, "MAT_MAP_VOFFSET"},
|
||||
{CHK_MAT_MAP_ANG, "MAT_MAP_ANG"},
|
||||
{CHK_MAT_MAP_COL1, "MAT_MAP_COL1"},
|
||||
{CHK_MAT_MAP_COL2, "MAT_MAP_COL2"},
|
||||
{CHK_MAT_MAP_RCOL, "MAT_MAP_RCOL"},
|
||||
{CHK_MAT_MAP_GCOL, "MAT_MAP_GCOL"},
|
||||
{CHK_MAT_MAP_BCOL, "MAT_MAP_BCOL"},
|
||||
{CHK_NAMED_OBJECT, "NAMED_OBJECT"},
|
||||
{CHK_N_DIRECT_LIGHT, "N_DIRECT_LIGHT"},
|
||||
{CHK_DL_OFF, "DL_OFF"},
|
||||
{CHK_DL_OUTER_RANGE, "DL_OUTER_RANGE"},
|
||||
{CHK_DL_INNER_RANGE, "DL_INNER_RANGE"},
|
||||
{CHK_DL_MULTIPLIER, "DL_MULTIPLIER"},
|
||||
{CHK_DL_EXCLUDE, "DL_EXCLUDE"},
|
||||
{CHK_DL_ATTENUATE, "DL_ATTENUATE"},
|
||||
{CHK_DL_SPOTLIGHT, "DL_SPOTLIGHT"},
|
||||
{CHK_DL_SPOT_ROLL, "DL_SPOT_ROLL"},
|
||||
{CHK_DL_SHADOWED, "DL_SHADOWED"},
|
||||
{CHK_DL_LOCAL_SHADOW2, "DL_LOCAL_SHADOW2"},
|
||||
{CHK_DL_SEE_CONE, "DL_SEE_CONE"},
|
||||
{CHK_DL_SPOT_RECTANGULAR, "DL_SPOT_RECTANGULAR"},
|
||||
{CHK_DL_SPOT_ASPECT, "DL_SPOT_ASPECT"},
|
||||
{CHK_DL_SPOT_PROJECTOR, "DL_SPOT_PROJECTOR"},
|
||||
{CHK_DL_SPOT_OVERSHOOT, "DL_SPOT_OVERSHOOT"},
|
||||
{CHK_DL_RAY_BIAS, "DL_RAY_BIAS"},
|
||||
{CHK_DL_RAYSHAD, "DL_RAYSHAD"},
|
||||
{CHK_N_CAMERA, "N_CAMERA"},
|
||||
{CHK_CAM_SEE_CONE, "CAM_SEE_CONE"},
|
||||
{CHK_CAM_RANGES, "CAM_RANGES"},
|
||||
{CHK_OBJ_HIDDEN, "OBJ_HIDDEN"},
|
||||
{CHK_OBJ_VIS_LOFTER, "OBJ_VIS_LOFTER"},
|
||||
{CHK_OBJ_DOESNT_CAST, "OBJ_DOESNT_CAST"},
|
||||
{CHK_OBJ_DONT_RCVSHADOW, "OBJ_DONT_RCVSHADOW"},
|
||||
{CHK_OBJ_MATTE, "OBJ_MATTE"},
|
||||
{CHK_OBJ_FAST, "OBJ_FAST"},
|
||||
{CHK_OBJ_PROCEDURAL, "OBJ_PROCEDURAL"},
|
||||
{CHK_OBJ_FROZEN, "OBJ_FROZEN"},
|
||||
{CHK_N_TRI_OBJECT, "N_TRI_OBJECT"},
|
||||
{CHK_POINT_ARRAY, "POINT_ARRAY"},
|
||||
{CHK_POINT_FLAG_ARRAY, "POINT_FLAG_ARRAY"},
|
||||
{CHK_FACE_ARRAY, "FACE_ARRAY"},
|
||||
{CHK_MSH_MAT_GROUP, "MSH_MAT_GROUP"},
|
||||
{CHK_SMOOTH_GROUP, "SMOOTH_GROUP"},
|
||||
{CHK_MSH_BOXMAP, "MSH_BOXMAP"},
|
||||
{CHK_TEX_VERTS, "TEX_VERTS"},
|
||||
{CHK_MESH_MATRIX, "MESH_MATRIX"},
|
||||
{CHK_MESH_COLOR, "MESH_COLOR"},
|
||||
{CHK_MESH_TEXTURE_INFO, "MESH_TEXTURE_INFO"},
|
||||
{CHK_KFDATA, "KFDATA"},
|
||||
{CHK_KFHDR, "KFHDR"},
|
||||
{CHK_KFSEG, "KFSEG"},
|
||||
{CHK_KFCURTIME, "KFCURTIME"},
|
||||
{CHK_AMBIENT_NODE_TAG, "AMBIENT_NODE_TAG"},
|
||||
{CHK_OBJECT_NODE_TAG, "OBJECT_NODE_TAG"},
|
||||
{CHK_CAMERA_NODE_TAG, "CAMERA_NODE_TAG"},
|
||||
{CHK_TARGET_NODE_TAG, "TARGET_NODE_TAG"},
|
||||
{CHK_LIGHT_NODE_TAG, "LIGHT_NODE_TAG"},
|
||||
{CHK_L_TARGET_NODE_TAG, "L_TARGET_NODE_TAG"},
|
||||
{CHK_SPOTLIGHT_NODE_TAG, "SPOTLIGHT_NODE_TAG"},
|
||||
{CHK_NODE_ID, "NODE_ID"},
|
||||
{CHK_NODE_HDR, "NODE_HDR"},
|
||||
{CHK_PIVOT, "PIVOT"},
|
||||
{CHK_INSTANCE_NAME, "INSTANCE_NAME"},
|
||||
{CHK_MORPH_SMOOTH, "MORPH_SMOOTH"},
|
||||
{CHK_BOUNDBOX, "BOUNDBOX"},
|
||||
{CHK_POS_TRACK_TAG, "POS_TRACK_TAG"},
|
||||
{CHK_COL_TRACK_TAG, "COL_TRACK_TAG"},
|
||||
{CHK_ROT_TRACK_TAG, "ROT_TRACK_TAG"},
|
||||
{CHK_SCL_TRACK_TAG, "SCL_TRACK_TAG"},
|
||||
{CHK_MORPH_TRACK_TAG, "MORPH_TRACK_TAG"},
|
||||
{CHK_FOV_TRACK_TAG, "FOV_TRACK_TAG"},
|
||||
{CHK_ROLL_TRACK_TAG, "ROLL_TRACK_TAG"},
|
||||
{CHK_HOT_TRACK_TAG, "HOT_TRACK_TAG"},
|
||||
{CHK_FALL_TRACK_TAG, "FALL_TRACK_TAG"},
|
||||
{CHK_HIDE_TRACK_TAG, "HIDE_TRACK_TAG"},
|
||||
{CHK_POLY_2D, "POLY_2D"},
|
||||
{CHK_SHAPE_OK, "SHAPE_OK"},
|
||||
{CHK_SHAPE_NOT_OK, "SHAPE_NOT_OK"},
|
||||
{CHK_SHAPE_HOOK, "SHAPE_HOOK"},
|
||||
{CHK_PATH_3D, "PATH_3D"},
|
||||
{CHK_PATH_MATRIX, "PATH_MATRIX"},
|
||||
{CHK_SHAPE_2D, "SHAPE_2D"},
|
||||
{CHK_M_SCALE, "M_SCALE"},
|
||||
{CHK_M_TWIST, "M_TWIST"},
|
||||
{CHK_M_TEETER, "M_TEETER"},
|
||||
{CHK_M_FIT, "M_FIT"},
|
||||
{CHK_M_BEVEL, "M_BEVEL"},
|
||||
{CHK_XZ_CURVE, "XZ_CURVE"},
|
||||
{CHK_YZ_CURVE, "YZ_CURVE"},
|
||||
{CHK_INTERPCT, "INTERPCT"},
|
||||
{CHK_DEFORM_LIMIT, "DEFORM_LIMIT"},
|
||||
{CHK_USE_CONTOUR, "USE_CONTOUR"},
|
||||
{CHK_USE_TWEEN, "USE_TWEEN"},
|
||||
{CHK_USE_SCALE, "USE_SCALE"},
|
||||
{CHK_USE_TWIST, "USE_TWIST"},
|
||||
{CHK_USE_TEETER, "USE_TEETER"},
|
||||
{CHK_USE_FIT, "USE_FIT"},
|
||||
{CHK_USE_BEVEL, "USE_BEVEL"},
|
||||
{CHK_DEFAULT_VIEW, "DEFAULT_VIEW"},
|
||||
{CHK_VIEW_TOP, "VIEW_TOP"},
|
||||
{CHK_VIEW_BOTTOM, "VIEW_BOTTOM"},
|
||||
{CHK_VIEW_LEFT, "VIEW_LEFT"},
|
||||
{CHK_VIEW_RIGHT, "VIEW_RIGHT"},
|
||||
{CHK_VIEW_FRONT, "VIEW_FRONT"},
|
||||
{CHK_VIEW_BACK, "VIEW_BACK"},
|
||||
{CHK_VIEW_USER, "VIEW_USER"},
|
||||
{CHK_VIEW_CAMERA, "VIEW_CAMERA"},
|
||||
{CHK_VIEW_WINDOW, "VIEW_WINDOW"},
|
||||
{CHK_VIEWPORT_LAYOUT_OLD, "VIEWPORT_LAYOUT_OLD"},
|
||||
{CHK_VIEWPORT_DATA_OLD, "VIEWPORT_DATA_OLD"},
|
||||
{CHK_VIEWPORT_LAYOUT, "VIEWPORT_LAYOUT"},
|
||||
{CHK_VIEWPORT_DATA, "VIEWPORT_DATA"},
|
||||
{CHK_VIEWPORT_DATA_3, "VIEWPORT_DATA_3"},
|
||||
{CHK_VIEWPORT_SIZE, "VIEWPORT_SIZE"},
|
||||
{CHK_NETWORK_VIEW, "NETWORK_VIEW"},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
|
||||
const char*
|
||||
lib3ds_chunk_name(uint16_t chunk) {
|
||||
Lib3dsChunkTable *p;
|
||||
|
||||
for (p = lib3ds_chunk_table; p->name != 0; ++p) {
|
||||
if (p->chunk == chunk) {
|
||||
return(p->name);
|
||||
}
|
||||
}
|
||||
return("***UNKNOWN***");
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,323 +1,323 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
Lib3dsLight*
|
||||
lib3ds_light_new(const char *name) {
|
||||
Lib3dsLight *light;
|
||||
|
||||
assert(name);
|
||||
assert(strlen(name) < 64);
|
||||
|
||||
light = (Lib3dsLight*)calloc(sizeof(Lib3dsLight), 1);
|
||||
if (!light) {
|
||||
return(0);
|
||||
}
|
||||
strcpy(light->name, name);
|
||||
return(light);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_light_free(Lib3dsLight *light) {
|
||||
memset(light, 0, sizeof(Lib3dsLight));
|
||||
free(light);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
spotlight_read(Lib3dsLight *light, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int i;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_DL_SPOTLIGHT, io);
|
||||
|
||||
light->spot_light = TRUE;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
light->target[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
light->hotspot = lib3ds_io_read_float(io);
|
||||
light->falloff = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_DL_SPOT_ROLL:
|
||||
light->roll = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_SHADOWED: {
|
||||
light->shadowed = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_LOCAL_SHADOW2: {
|
||||
light->shadow_bias = lib3ds_io_read_float(io);
|
||||
light->shadow_filter = lib3ds_io_read_float(io);
|
||||
light->shadow_size = lib3ds_io_read_intw(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SEE_CONE: {
|
||||
light->see_cone = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_RECTANGULAR: {
|
||||
light->rectangular_spot = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_ASPECT: {
|
||||
light->spot_aspect = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_PROJECTOR: {
|
||||
light->use_projector = TRUE;
|
||||
lib3ds_io_read_string(io, light->projector, 64);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_OVERSHOOT: {
|
||||
light->spot_overshoot = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_RAY_BIAS: {
|
||||
light->ray_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_RAYSHAD: {
|
||||
light->ray_shadows = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_N_DIRECT_LIGHT, io);
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
light->position[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
}
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_COLOR_F: {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
light->color[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_OFF:
|
||||
light->off = TRUE;
|
||||
break;
|
||||
|
||||
case CHK_DL_OUTER_RANGE:
|
||||
light->outer_range = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_INNER_RANGE:
|
||||
light->inner_range = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_MULTIPLIER:
|
||||
light->multiplier = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_EXCLUDE: {
|
||||
/* FIXME: */
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_ATTENUATE:
|
||||
light->attenuation = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_SPOTLIGHT: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
spotlight_read(light, io);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_N_DIRECT_LIGHT;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_vector(io, light->position);
|
||||
{ /*---- LIB3DS_COLOR_F ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, light->color);
|
||||
}
|
||||
if (light->off) { /*---- LIB3DS_DL_OFF ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_OFF;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
{ /*---- LIB3DS_DL_OUTER_RANGE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_OUTER_RANGE;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->outer_range);
|
||||
}
|
||||
{ /*---- LIB3DS_DL_INNER_RANGE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_INNER_RANGE;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->inner_range);
|
||||
}
|
||||
{ /*---- LIB3DS_DL_MULTIPLIER ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_MULTIPLIER;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->multiplier);
|
||||
}
|
||||
if (light->attenuation) { /*---- LIB3DS_DL_ATTENUATE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_ATTENUATE;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (light->spot_light) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_DL_SPOTLIGHT;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_vector(io, light->target);
|
||||
lib3ds_io_write_float(io, light->hotspot);
|
||||
lib3ds_io_write_float(io, light->falloff);
|
||||
|
||||
{ /*---- LIB3DS_DL_SPOT_ROLL ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_ROLL;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->roll);
|
||||
}
|
||||
if (light->shadowed) { /*---- LIB3DS_DL_SHADOWED ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SHADOWED;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if ((fabs(light->shadow_bias) > LIB3DS_EPSILON) ||
|
||||
(fabs(light->shadow_filter) > LIB3DS_EPSILON) ||
|
||||
(light->shadow_size != 0)) { /*---- LIB3DS_DL_LOCAL_SHADOW2 ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_LOCAL_SHADOW2;
|
||||
c.size = 16;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->shadow_bias);
|
||||
lib3ds_io_write_float(io, light->shadow_filter);
|
||||
lib3ds_io_write_intw(io, (int16_t)light->shadow_size);
|
||||
}
|
||||
if (light->see_cone) { /*---- LIB3DS_DL_SEE_CONE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SEE_CONE;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if (light->rectangular_spot) { /*---- LIB3DS_DL_SPOT_RECTANGULAR ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_RECTANGULAR;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if (fabs(light->spot_aspect) > LIB3DS_EPSILON) { /*---- LIB3DS_DL_SPOT_ASPECT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_ASPECT;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->spot_aspect);
|
||||
}
|
||||
if (light->use_projector) { /*---- LIB3DS_DL_SPOT_PROJECTOR ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_PROJECTOR;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_string(io, light->projector);
|
||||
}
|
||||
if (light->spot_overshoot) { /*---- LIB3DS_DL_SPOT_OVERSHOOT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_OVERSHOOT;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if (fabs(light->ray_bias) > LIB3DS_EPSILON) { /*---- LIB3DS_DL_RAY_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_RAY_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->ray_bias);
|
||||
}
|
||||
if (light->ray_shadows) { /*---- LIB3DS_DL_RAYSHAD ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_RAYSHAD;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
Lib3dsLight*
|
||||
lib3ds_light_new(const char *name) {
|
||||
Lib3dsLight *light;
|
||||
|
||||
assert(name);
|
||||
assert(strlen(name) < 64);
|
||||
|
||||
light = (Lib3dsLight*)calloc(sizeof(Lib3dsLight), 1);
|
||||
if (!light) {
|
||||
return(0);
|
||||
}
|
||||
strcpy(light->name, name);
|
||||
return(light);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_light_free(Lib3dsLight *light) {
|
||||
memset(light, 0, sizeof(Lib3dsLight));
|
||||
free(light);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
spotlight_read(Lib3dsLight *light, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
int i;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_DL_SPOTLIGHT, io);
|
||||
|
||||
light->spot_light = TRUE;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
light->target[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
light->hotspot = lib3ds_io_read_float(io);
|
||||
light->falloff = lib3ds_io_read_float(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_DL_SPOT_ROLL:
|
||||
light->roll = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_SHADOWED: {
|
||||
light->shadowed = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_LOCAL_SHADOW2: {
|
||||
light->shadow_bias = lib3ds_io_read_float(io);
|
||||
light->shadow_filter = lib3ds_io_read_float(io);
|
||||
light->shadow_size = lib3ds_io_read_intw(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SEE_CONE: {
|
||||
light->see_cone = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_RECTANGULAR: {
|
||||
light->rectangular_spot = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_ASPECT: {
|
||||
light->spot_aspect = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_PROJECTOR: {
|
||||
light->use_projector = TRUE;
|
||||
lib3ds_io_read_string(io, light->projector, 64);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_SPOT_OVERSHOOT: {
|
||||
light->spot_overshoot = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_RAY_BIAS: {
|
||||
light->ray_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_RAYSHAD: {
|
||||
light->ray_shadows = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_light_read(Lib3dsLight *light, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
lib3ds_chunk_read_start(&c, CHK_N_DIRECT_LIGHT, io);
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
light->position[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
}
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_COLOR_F: {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
light->color[i] = lib3ds_io_read_float(io);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_OFF:
|
||||
light->off = TRUE;
|
||||
break;
|
||||
|
||||
case CHK_DL_OUTER_RANGE:
|
||||
light->outer_range = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_INNER_RANGE:
|
||||
light->inner_range = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_MULTIPLIER:
|
||||
light->multiplier = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_EXCLUDE: {
|
||||
/* FIXME: */
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DL_ATTENUATE:
|
||||
light->attenuation = lib3ds_io_read_float(io);
|
||||
break;
|
||||
|
||||
case CHK_DL_SPOTLIGHT: {
|
||||
lib3ds_chunk_read_reset(&c, io);
|
||||
spotlight_read(light, io);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_light_write(Lib3dsLight *light, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_N_DIRECT_LIGHT;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_vector(io, light->position);
|
||||
{ /*---- LIB3DS_COLOR_F ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_COLOR_F;
|
||||
c.size = 18;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_rgb(io, light->color);
|
||||
}
|
||||
if (light->off) { /*---- LIB3DS_DL_OFF ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_OFF;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
{ /*---- LIB3DS_DL_OUTER_RANGE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_OUTER_RANGE;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->outer_range);
|
||||
}
|
||||
{ /*---- LIB3DS_DL_INNER_RANGE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_INNER_RANGE;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->inner_range);
|
||||
}
|
||||
{ /*---- LIB3DS_DL_MULTIPLIER ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_MULTIPLIER;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->multiplier);
|
||||
}
|
||||
if (light->attenuation) { /*---- LIB3DS_DL_ATTENUATE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_ATTENUATE;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
|
||||
if (light->spot_light) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_DL_SPOTLIGHT;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_vector(io, light->target);
|
||||
lib3ds_io_write_float(io, light->hotspot);
|
||||
lib3ds_io_write_float(io, light->falloff);
|
||||
|
||||
{ /*---- LIB3DS_DL_SPOT_ROLL ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_ROLL;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->roll);
|
||||
}
|
||||
if (light->shadowed) { /*---- LIB3DS_DL_SHADOWED ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SHADOWED;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if ((fabs(light->shadow_bias) > LIB3DS_EPSILON) ||
|
||||
(fabs(light->shadow_filter) > LIB3DS_EPSILON) ||
|
||||
(light->shadow_size != 0)) { /*---- LIB3DS_DL_LOCAL_SHADOW2 ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_LOCAL_SHADOW2;
|
||||
c.size = 16;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->shadow_bias);
|
||||
lib3ds_io_write_float(io, light->shadow_filter);
|
||||
lib3ds_io_write_intw(io, (int16_t)light->shadow_size);
|
||||
}
|
||||
if (light->see_cone) { /*---- LIB3DS_DL_SEE_CONE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SEE_CONE;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if (light->rectangular_spot) { /*---- LIB3DS_DL_SPOT_RECTANGULAR ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_RECTANGULAR;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if (fabs(light->spot_aspect) > LIB3DS_EPSILON) { /*---- LIB3DS_DL_SPOT_ASPECT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_ASPECT;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->spot_aspect);
|
||||
}
|
||||
if (light->use_projector) { /*---- LIB3DS_DL_SPOT_PROJECTOR ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_PROJECTOR;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_string(io, light->projector);
|
||||
}
|
||||
if (light->spot_overshoot) { /*---- LIB3DS_DL_SPOT_OVERSHOOT ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_SPOT_OVERSHOOT;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
if (fabs(light->ray_bias) > LIB3DS_EPSILON) { /*---- LIB3DS_DL_RAY_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_RAY_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, light->ray_bias);
|
||||
}
|
||||
if (light->ray_shadows) { /*---- LIB3DS_DL_RAYSHAD ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_DL_RAYSHAD;
|
||||
c.size = 6;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
}
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,62 +1,62 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
float
|
||||
lib3ds_math_ease(float fp, float fc, float fn, float ease_from, float ease_to) {
|
||||
double s, step;
|
||||
double tofrom;
|
||||
double a;
|
||||
|
||||
s = step = (float)(fc - fp) / (fn - fp);
|
||||
tofrom = ease_to + ease_from;
|
||||
if (tofrom != 0.0) {
|
||||
if (tofrom > 1.0) {
|
||||
ease_to = (float)(ease_to / tofrom);
|
||||
ease_from = (float)(ease_from / tofrom);
|
||||
}
|
||||
a = 1.0 / (2.0 - (ease_to + ease_from));
|
||||
|
||||
if (step < ease_from) s = a / ease_from * step * step;
|
||||
else {
|
||||
if ((1.0 - ease_to) <= step) {
|
||||
step = 1.0 - step;
|
||||
s = 1.0 - a / ease_to * step * step;
|
||||
} else {
|
||||
s = ((2.0 * step) - ease_from) * a;
|
||||
}
|
||||
}
|
||||
}
|
||||
return((float)s);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_math_cubic_interp(float *v, float *a, float *p, float *q, float *b, int n, float t) {
|
||||
float x, y, z, w;
|
||||
int i;
|
||||
|
||||
x = 2 * t * t * t - 3 * t * t + 1;
|
||||
y = -2 * t * t * t + 3 * t * t;
|
||||
z = t * t * t - 2 * t * t + t;
|
||||
w = t * t * t - t * t;
|
||||
for (i = 0; i < n; ++i) {
|
||||
v[i] = x * a[i] + y * b[i] + z * p[i] + w * q[i];
|
||||
}
|
||||
}
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
float
|
||||
lib3ds_math_ease(float fp, float fc, float fn, float ease_from, float ease_to) {
|
||||
double s, step;
|
||||
double tofrom;
|
||||
double a;
|
||||
|
||||
s = step = (float)(fc - fp) / (fn - fp);
|
||||
tofrom = ease_to + ease_from;
|
||||
if (tofrom != 0.0) {
|
||||
if (tofrom > 1.0) {
|
||||
ease_to = (float)(ease_to / tofrom);
|
||||
ease_from = (float)(ease_from / tofrom);
|
||||
}
|
||||
a = 1.0 / (2.0 - (ease_to + ease_from));
|
||||
|
||||
if (step < ease_from) s = a / ease_from * step * step;
|
||||
else {
|
||||
if ((1.0 - ease_to) <= step) {
|
||||
step = 1.0 - step;
|
||||
s = 1.0 - a / ease_to * step * step;
|
||||
} else {
|
||||
s = ((2.0 * step) - ease_from) * a;
|
||||
}
|
||||
}
|
||||
}
|
||||
return((float)s);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_math_cubic_interp(float *v, float *a, float *p, float *q, float *b, int n, float t) {
|
||||
float x, y, z, w;
|
||||
int i;
|
||||
|
||||
x = 2 * t * t * t - 3 * t * t + 1;
|
||||
y = -2 * t * t * t + 3 * t * t;
|
||||
z = t * t * t - 2 * t * t + t;
|
||||
w = t * t * t - t * t;
|
||||
for (i = 0; i < n; ++i) {
|
||||
v[i] = x * a[i] + y * b[i] + z * p[i] + w * q[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,466 +1,466 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*!
|
||||
* Clear a matrix to all zeros.
|
||||
*
|
||||
* \param m Matrix to be cleared.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_zero(float m[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) m[i][j] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Set a matrix to identity.
|
||||
*
|
||||
* \param m Matrix to be set.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_identity(float m[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) m[i][j] = 0.0;
|
||||
}
|
||||
for (i = 0; i < 4; i++) m[i][i] = 1.0;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Copy a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_copy(float dest[4][4], float src[4][4]) {
|
||||
memcpy(dest, src, 16 * sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Negate a matrix -- all elements negated.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_neg(float m[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] = -m[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Transpose a matrix in place.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_transpose(float m[4][4]) {
|
||||
int i, j;
|
||||
float swp;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = j + 1; i < 4; i++) {
|
||||
swp = m[j][i];
|
||||
m[j][i] = m[i][j];
|
||||
m[i][j] = swp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Add two matrices.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_add(float m[4][4], float a[4][4], float b[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] = a[j][i] + b[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Subtract two matrices.
|
||||
*
|
||||
* \param m Result.
|
||||
* \param a Addend.
|
||||
* \param b Minuend.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_sub(float m[4][4], float a[4][4], float b[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] = a[j][i] - b[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiplies a matrix by a second one (m = m * n).
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_mult(float m[4][4], float a[4][4], float b[4][4]) {
|
||||
float tmp[4][4];
|
||||
int i, j, k;
|
||||
float ab;
|
||||
|
||||
memcpy(tmp, a, 16 * sizeof(float));
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
ab = 0.0f;
|
||||
for (k = 0; k < 4; k++) ab += tmp[k][i] * b[j][k];
|
||||
m[j][i] = ab;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a matrix by a scalar.
|
||||
*
|
||||
* \param m Matrix to be set.
|
||||
* \param k Scalar.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_scalar(float m[4][4], float k) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] *= k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static float
|
||||
det2x2(
|
||||
float a, float b,
|
||||
float c, float d) {
|
||||
return((a)*(d) - (b)*(c));
|
||||
}
|
||||
|
||||
|
||||
static float
|
||||
det3x3(
|
||||
float a1, float a2, float a3,
|
||||
float b1, float b2, float b3,
|
||||
float c1, float c2, float c3) {
|
||||
return(
|
||||
a1*det2x2(b2, b3, c2, c3) -
|
||||
b1*det2x2(a2, a3, c2, c3) +
|
||||
c1*det2x2(a2, a3, b2, b3)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Find determinant of a matrix.
|
||||
*/
|
||||
float
|
||||
lib3ds_matrix_det(float m[4][4]) {
|
||||
float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
|
||||
|
||||
a1 = m[0][0];
|
||||
b1 = m[1][0];
|
||||
c1 = m[2][0];
|
||||
d1 = m[3][0];
|
||||
a2 = m[0][1];
|
||||
b2 = m[1][1];
|
||||
c2 = m[2][1];
|
||||
d2 = m[3][1];
|
||||
a3 = m[0][2];
|
||||
b3 = m[1][2];
|
||||
c3 = m[2][2];
|
||||
d3 = m[3][2];
|
||||
a4 = m[0][3];
|
||||
b4 = m[1][3];
|
||||
c4 = m[2][3];
|
||||
d4 = m[3][3];
|
||||
return(
|
||||
a1 * det3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) -
|
||||
b1 * det3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) +
|
||||
c1 * det3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) -
|
||||
d1 * det3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Invert a matrix in place.
|
||||
*
|
||||
* \param m Matrix to invert.
|
||||
*
|
||||
* \return LIB3DS_TRUE on success, LIB3DS_FALSE on failure.
|
||||
*
|
||||
* GGemsII, K.Wu, Fast Matrix Inversion
|
||||
*/
|
||||
int
|
||||
lib3ds_matrix_inv(float m[4][4]) {
|
||||
int i, j, k;
|
||||
int pvt_i[4], pvt_j[4]; /* Locations of pivot elements */
|
||||
float pvt_val; /* Value of current pivot element */
|
||||
float hold; /* Temporary storage */
|
||||
float determinat;
|
||||
|
||||
determinat = 1.0f;
|
||||
for (k = 0; k < 4; k++) {
|
||||
/* Locate k'th pivot element */
|
||||
pvt_val = m[k][k]; /* Initialize for search */
|
||||
pvt_i[k] = k;
|
||||
pvt_j[k] = k;
|
||||
for (i = k; i < 4; i++) {
|
||||
for (j = k; j < 4; j++) {
|
||||
if (fabs(m[i][j]) > fabs(pvt_val)) {
|
||||
pvt_i[k] = i;
|
||||
pvt_j[k] = j;
|
||||
pvt_val = m[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Product of pivots, gives determinant when finished */
|
||||
determinat *= pvt_val;
|
||||
if (fabs(determinat) < LIB3DS_EPSILON) {
|
||||
return(FALSE); /* Matrix is singular (zero determinant) */
|
||||
}
|
||||
|
||||
/* "Interchange" rows (with sign change stuff) */
|
||||
i = pvt_i[k];
|
||||
if (i != k) { /* If rows are different */
|
||||
for (j = 0; j < 4; j++) {
|
||||
hold = -m[k][j];
|
||||
m[k][j] = m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
|
||||
/* "Interchange" columns */
|
||||
j = pvt_j[k];
|
||||
if (j != k) { /* If columns are different */
|
||||
for (i = 0; i < 4; i++) {
|
||||
hold = -m[i][k];
|
||||
m[i][k] = m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
|
||||
/* Divide column by minus pivot value */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (i != k) m[i][k] /= (-pvt_val) ;
|
||||
}
|
||||
|
||||
/* Reduce the matrix */
|
||||
for (i = 0; i < 4; i++) {
|
||||
hold = m[i][k];
|
||||
for (j = 0; j < 4; j++) {
|
||||
if (i != k && j != k) m[i][j] += hold * m[k][j];
|
||||
}
|
||||
}
|
||||
|
||||
/* Divide row by pivot */
|
||||
for (j = 0; j < 4; j++) {
|
||||
if (j != k) m[k][j] /= pvt_val;
|
||||
}
|
||||
|
||||
/* Replace pivot by reciprocal (at last we can touch it). */
|
||||
m[k][k] = 1.0f / pvt_val;
|
||||
}
|
||||
|
||||
/* That was most of the work, one final pass of row/column interchange */
|
||||
/* to finish */
|
||||
for (k = 4 - 2; k >= 0; k--) { /* Don't need to work with 1 by 1 corner*/
|
||||
i = pvt_j[k]; /* Rows to swap correspond to pivot COLUMN */
|
||||
if (i != k) { /* If rows are different */
|
||||
for (j = 0; j < 4; j++) {
|
||||
hold = m[k][j];
|
||||
m[k][j] = -m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
|
||||
j = pvt_i[k]; /* Columns to swap correspond to pivot ROW */
|
||||
if (j != k) /* If columns are different */
|
||||
for (i = 0; i < 4; i++) {
|
||||
hold = m[i][k];
|
||||
m[i][k] = -m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply a translation to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_translate(float m[4][4], float x, float y, float z) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
m[3][i] += m[0][i] * x + m[1][i] * y + m[2][i] * z;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply scale factors to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_scale(float m[4][4], float x, float y, float z) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[0][i] *= x;
|
||||
m[1][i] *= y;
|
||||
m[2][i] *= z;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply a rotation about an arbitrary axis to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_rotate_quat(float m[4][4], float q[4]) {
|
||||
float s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz, l;
|
||||
float R[4][4];
|
||||
|
||||
l = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3];
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
s = 1.0f;
|
||||
} else {
|
||||
s = 2.0f / l;
|
||||
}
|
||||
|
||||
xs = q[0] * s;
|
||||
ys = q[1] * s;
|
||||
zs = q[2] * s;
|
||||
wx = q[3] * xs;
|
||||
wy = q[3] * ys;
|
||||
wz = q[3] * zs;
|
||||
xx = q[0] * xs;
|
||||
xy = q[0] * ys;
|
||||
xz = q[0] * zs;
|
||||
yy = q[1] * ys;
|
||||
yz = q[1] * zs;
|
||||
zz = q[2] * zs;
|
||||
|
||||
R[0][0] = 1.0f - (yy + zz);
|
||||
R[1][0] = xy - wz;
|
||||
R[2][0] = xz + wy;
|
||||
R[0][1] = xy + wz;
|
||||
R[1][1] = 1.0f - (xx + zz);
|
||||
R[2][1] = yz - wx;
|
||||
R[0][2] = xz - wy;
|
||||
R[1][2] = yz + wx;
|
||||
R[2][2] = 1.0f - (xx + yy);
|
||||
R[3][0] = R[3][1] = R[3][2] = R[0][3] = R[1][3] = R[2][3] = 0.0f;
|
||||
R[3][3] = 1.0f;
|
||||
|
||||
lib3ds_matrix_mult(m, m, R);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply a rotation about an arbitrary axis to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_rotate(float m[4][4], float angle, float ax, float ay, float az) {
|
||||
float q[4];
|
||||
float axis[3];
|
||||
|
||||
lib3ds_vector_make(axis, ax, ay, az);
|
||||
lib3ds_quat_axis_angle(q, axis, angle);
|
||||
lib3ds_matrix_rotate_quat(m, q);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute a camera matrix based on position, target and roll.
|
||||
*
|
||||
* Generates a translate/rotate matrix that maps world coordinates
|
||||
* to camera coordinates. Resulting matrix does not include perspective
|
||||
* transform.
|
||||
*
|
||||
* \param matrix Destination matrix.
|
||||
* \param pos Camera position
|
||||
* \param tgt Camera target
|
||||
* \param roll Roll angle
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_camera(float matrix[4][4], float pos[3], float tgt[3], float roll) {
|
||||
float M[4][4];
|
||||
float x[3], y[3], z[3];
|
||||
|
||||
lib3ds_vector_sub(y, tgt, pos);
|
||||
lib3ds_vector_normalize(y);
|
||||
|
||||
if (y[0] != 0. || y[1] != 0) {
|
||||
z[0] = 0;
|
||||
z[1] = 0;
|
||||
z[2] = 1.0;
|
||||
} else { /* Special case: looking straight up or down z axis */
|
||||
z[0] = -1.0;
|
||||
z[1] = 0;
|
||||
z[2] = 0;
|
||||
}
|
||||
|
||||
lib3ds_vector_cross(x, y, z);
|
||||
lib3ds_vector_cross(z, x, y);
|
||||
lib3ds_vector_normalize(x);
|
||||
lib3ds_vector_normalize(z);
|
||||
|
||||
lib3ds_matrix_identity(M);
|
||||
M[0][0] = x[0];
|
||||
M[1][0] = x[1];
|
||||
M[2][0] = x[2];
|
||||
M[0][1] = y[0];
|
||||
M[1][1] = y[1];
|
||||
M[2][1] = y[2];
|
||||
M[0][2] = z[0];
|
||||
M[1][2] = z[1];
|
||||
M[2][2] = z[2];
|
||||
|
||||
lib3ds_matrix_identity(matrix);
|
||||
lib3ds_matrix_rotate(matrix, roll, 0, 1, 0);
|
||||
lib3ds_matrix_mult(matrix, matrix, M);
|
||||
lib3ds_matrix_translate(matrix, -pos[0], -pos[1], -pos[2]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*!
|
||||
* Clear a matrix to all zeros.
|
||||
*
|
||||
* \param m Matrix to be cleared.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_zero(float m[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) m[i][j] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Set a matrix to identity.
|
||||
*
|
||||
* \param m Matrix to be set.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_identity(float m[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) m[i][j] = 0.0;
|
||||
}
|
||||
for (i = 0; i < 4; i++) m[i][i] = 1.0;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Copy a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_copy(float dest[4][4], float src[4][4]) {
|
||||
memcpy(dest, src, 16 * sizeof(float));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Negate a matrix -- all elements negated.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_neg(float m[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] = -m[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Transpose a matrix in place.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_transpose(float m[4][4]) {
|
||||
int i, j;
|
||||
float swp;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = j + 1; i < 4; i++) {
|
||||
swp = m[j][i];
|
||||
m[j][i] = m[i][j];
|
||||
m[i][j] = swp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Add two matrices.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_add(float m[4][4], float a[4][4], float b[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] = a[j][i] + b[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Subtract two matrices.
|
||||
*
|
||||
* \param m Result.
|
||||
* \param a Addend.
|
||||
* \param b Minuend.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_sub(float m[4][4], float a[4][4], float b[4][4]) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] = a[j][i] - b[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiplies a matrix by a second one (m = m * n).
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_mult(float m[4][4], float a[4][4], float b[4][4]) {
|
||||
float tmp[4][4];
|
||||
int i, j, k;
|
||||
float ab;
|
||||
|
||||
memcpy(tmp, a, 16 * sizeof(float));
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
ab = 0.0f;
|
||||
for (k = 0; k < 4; k++) ab += tmp[k][i] * b[j][k];
|
||||
m[j][i] = ab;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a matrix by a scalar.
|
||||
*
|
||||
* \param m Matrix to be set.
|
||||
* \param k Scalar.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_scalar(float m[4][4], float k) {
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[j][i] *= k;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static float
|
||||
det2x2(
|
||||
float a, float b,
|
||||
float c, float d) {
|
||||
return((a)*(d) - (b)*(c));
|
||||
}
|
||||
|
||||
|
||||
static float
|
||||
det3x3(
|
||||
float a1, float a2, float a3,
|
||||
float b1, float b2, float b3,
|
||||
float c1, float c2, float c3) {
|
||||
return(
|
||||
a1*det2x2(b2, b3, c2, c3) -
|
||||
b1*det2x2(a2, a3, c2, c3) +
|
||||
c1*det2x2(a2, a3, b2, b3)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Find determinant of a matrix.
|
||||
*/
|
||||
float
|
||||
lib3ds_matrix_det(float m[4][4]) {
|
||||
float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
|
||||
|
||||
a1 = m[0][0];
|
||||
b1 = m[1][0];
|
||||
c1 = m[2][0];
|
||||
d1 = m[3][0];
|
||||
a2 = m[0][1];
|
||||
b2 = m[1][1];
|
||||
c2 = m[2][1];
|
||||
d2 = m[3][1];
|
||||
a3 = m[0][2];
|
||||
b3 = m[1][2];
|
||||
c3 = m[2][2];
|
||||
d3 = m[3][2];
|
||||
a4 = m[0][3];
|
||||
b4 = m[1][3];
|
||||
c4 = m[2][3];
|
||||
d4 = m[3][3];
|
||||
return(
|
||||
a1 * det3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) -
|
||||
b1 * det3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) +
|
||||
c1 * det3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) -
|
||||
d1 * det3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Invert a matrix in place.
|
||||
*
|
||||
* \param m Matrix to invert.
|
||||
*
|
||||
* \return LIB3DS_TRUE on success, LIB3DS_FALSE on failure.
|
||||
*
|
||||
* GGemsII, K.Wu, Fast Matrix Inversion
|
||||
*/
|
||||
int
|
||||
lib3ds_matrix_inv(float m[4][4]) {
|
||||
int i, j, k;
|
||||
int pvt_i[4], pvt_j[4]; /* Locations of pivot elements */
|
||||
float pvt_val; /* Value of current pivot element */
|
||||
float hold; /* Temporary storage */
|
||||
float determinat;
|
||||
|
||||
determinat = 1.0f;
|
||||
for (k = 0; k < 4; k++) {
|
||||
/* Locate k'th pivot element */
|
||||
pvt_val = m[k][k]; /* Initialize for search */
|
||||
pvt_i[k] = k;
|
||||
pvt_j[k] = k;
|
||||
for (i = k; i < 4; i++) {
|
||||
for (j = k; j < 4; j++) {
|
||||
if (fabs(m[i][j]) > fabs(pvt_val)) {
|
||||
pvt_i[k] = i;
|
||||
pvt_j[k] = j;
|
||||
pvt_val = m[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Product of pivots, gives determinant when finished */
|
||||
determinat *= pvt_val;
|
||||
if (fabs(determinat) < LIB3DS_EPSILON) {
|
||||
return(FALSE); /* Matrix is singular (zero determinant) */
|
||||
}
|
||||
|
||||
/* "Interchange" rows (with sign change stuff) */
|
||||
i = pvt_i[k];
|
||||
if (i != k) { /* If rows are different */
|
||||
for (j = 0; j < 4; j++) {
|
||||
hold = -m[k][j];
|
||||
m[k][j] = m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
|
||||
/* "Interchange" columns */
|
||||
j = pvt_j[k];
|
||||
if (j != k) { /* If columns are different */
|
||||
for (i = 0; i < 4; i++) {
|
||||
hold = -m[i][k];
|
||||
m[i][k] = m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
|
||||
/* Divide column by minus pivot value */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (i != k) m[i][k] /= (-pvt_val) ;
|
||||
}
|
||||
|
||||
/* Reduce the matrix */
|
||||
for (i = 0; i < 4; i++) {
|
||||
hold = m[i][k];
|
||||
for (j = 0; j < 4; j++) {
|
||||
if (i != k && j != k) m[i][j] += hold * m[k][j];
|
||||
}
|
||||
}
|
||||
|
||||
/* Divide row by pivot */
|
||||
for (j = 0; j < 4; j++) {
|
||||
if (j != k) m[k][j] /= pvt_val;
|
||||
}
|
||||
|
||||
/* Replace pivot by reciprocal (at last we can touch it). */
|
||||
m[k][k] = 1.0f / pvt_val;
|
||||
}
|
||||
|
||||
/* That was most of the work, one final pass of row/column interchange */
|
||||
/* to finish */
|
||||
for (k = 4 - 2; k >= 0; k--) { /* Don't need to work with 1 by 1 corner*/
|
||||
i = pvt_j[k]; /* Rows to swap correspond to pivot COLUMN */
|
||||
if (i != k) { /* If rows are different */
|
||||
for (j = 0; j < 4; j++) {
|
||||
hold = m[k][j];
|
||||
m[k][j] = -m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
|
||||
j = pvt_i[k]; /* Columns to swap correspond to pivot ROW */
|
||||
if (j != k) /* If columns are different */
|
||||
for (i = 0; i < 4; i++) {
|
||||
hold = m[i][k];
|
||||
m[i][k] = -m[i][j];
|
||||
m[i][j] = hold;
|
||||
}
|
||||
}
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply a translation to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_translate(float m[4][4], float x, float y, float z) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
m[3][i] += m[0][i] * x + m[1][i] * y + m[2][i] * z;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply scale factors to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_scale(float m[4][4], float x, float y, float z) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
m[0][i] *= x;
|
||||
m[1][i] *= y;
|
||||
m[2][i] *= z;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply a rotation about an arbitrary axis to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_rotate_quat(float m[4][4], float q[4]) {
|
||||
float s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz, l;
|
||||
float R[4][4];
|
||||
|
||||
l = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3];
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
s = 1.0f;
|
||||
} else {
|
||||
s = 2.0f / l;
|
||||
}
|
||||
|
||||
xs = q[0] * s;
|
||||
ys = q[1] * s;
|
||||
zs = q[2] * s;
|
||||
wx = q[3] * xs;
|
||||
wy = q[3] * ys;
|
||||
wz = q[3] * zs;
|
||||
xx = q[0] * xs;
|
||||
xy = q[0] * ys;
|
||||
xz = q[0] * zs;
|
||||
yy = q[1] * ys;
|
||||
yz = q[1] * zs;
|
||||
zz = q[2] * zs;
|
||||
|
||||
R[0][0] = 1.0f - (yy + zz);
|
||||
R[1][0] = xy - wz;
|
||||
R[2][0] = xz + wy;
|
||||
R[0][1] = xy + wz;
|
||||
R[1][1] = 1.0f - (xx + zz);
|
||||
R[2][1] = yz - wx;
|
||||
R[0][2] = xz - wy;
|
||||
R[1][2] = yz + wx;
|
||||
R[2][2] = 1.0f - (xx + yy);
|
||||
R[3][0] = R[3][1] = R[3][2] = R[0][3] = R[1][3] = R[2][3] = 0.0f;
|
||||
R[3][3] = 1.0f;
|
||||
|
||||
lib3ds_matrix_mult(m, m, R);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Apply a rotation about an arbitrary axis to a matrix.
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_rotate(float m[4][4], float angle, float ax, float ay, float az) {
|
||||
float q[4];
|
||||
float axis[3];
|
||||
|
||||
lib3ds_vector_make(axis, ax, ay, az);
|
||||
lib3ds_quat_axis_angle(q, axis, angle);
|
||||
lib3ds_matrix_rotate_quat(m, q);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute a camera matrix based on position, target and roll.
|
||||
*
|
||||
* Generates a translate/rotate matrix that maps world coordinates
|
||||
* to camera coordinates. Resulting matrix does not include perspective
|
||||
* transform.
|
||||
*
|
||||
* \param matrix Destination matrix.
|
||||
* \param pos Camera position
|
||||
* \param tgt Camera target
|
||||
* \param roll Roll angle
|
||||
*/
|
||||
void
|
||||
lib3ds_matrix_camera(float matrix[4][4], float pos[3], float tgt[3], float roll) {
|
||||
float M[4][4];
|
||||
float x[3], y[3], z[3];
|
||||
|
||||
lib3ds_vector_sub(y, tgt, pos);
|
||||
lib3ds_vector_normalize(y);
|
||||
|
||||
if (y[0] != 0. || y[1] != 0) {
|
||||
z[0] = 0;
|
||||
z[1] = 0;
|
||||
z[2] = 1.0;
|
||||
} else { /* Special case: looking straight up or down z axis */
|
||||
z[0] = -1.0;
|
||||
z[1] = 0;
|
||||
z[2] = 0;
|
||||
}
|
||||
|
||||
lib3ds_vector_cross(x, y, z);
|
||||
lib3ds_vector_cross(z, x, y);
|
||||
lib3ds_vector_normalize(x);
|
||||
lib3ds_vector_normalize(z);
|
||||
|
||||
lib3ds_matrix_identity(M);
|
||||
M[0][0] = x[0];
|
||||
M[1][0] = x[1];
|
||||
M[2][0] = x[2];
|
||||
M[0][1] = y[0];
|
||||
M[1][1] = y[1];
|
||||
M[2][1] = y[2];
|
||||
M[0][2] = z[0];
|
||||
M[1][2] = z[1];
|
||||
M[2][2] = z[2];
|
||||
|
||||
lib3ds_matrix_identity(matrix);
|
||||
lib3ds_matrix_rotate(matrix, roll, 0, 1, 0);
|
||||
lib3ds_matrix_mult(matrix, matrix, M);
|
||||
lib3ds_matrix_translate(matrix, -pos[0], -pos[1], -pos[2]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,294 +1,294 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*!
|
||||
* Set a quaternion to Identity
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_identity(float c[4]) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Copy a quaternion.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_copy(float dest[4], float src[4]) {
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
dest[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute a quaternion from axis and angle.
|
||||
*
|
||||
* \param c Computed quaternion
|
||||
* \param axis Rotation axis
|
||||
* \param angle Angle of rotation, radians.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_axis_angle(float c[4], float axis[3], float angle) {
|
||||
double omega, s;
|
||||
double l;
|
||||
|
||||
l = sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
|
||||
if (l < LIB3DS_EPSILON) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
} else {
|
||||
omega = -0.5 * angle;
|
||||
s = sin(omega) / l;
|
||||
c[0] = (float)s * axis[0];
|
||||
c[1] = (float)s * axis[1];
|
||||
c[2] = (float)s * axis[2];
|
||||
c[3] = (float)cos(omega);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Negate a quaternion
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_neg(float c[4]) {
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] = -c[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute the conjugate of a quaternion
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_cnj(float c[4]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = -c[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply two quaternions.
|
||||
*
|
||||
* \param c Result
|
||||
* \param a,b Inputs
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_mul(float c[4], float a[4], float b[4]) {
|
||||
float qa[4], qb[4];
|
||||
lib3ds_quat_copy(qa, a);
|
||||
lib3ds_quat_copy(qb, b);
|
||||
c[0] = qa[3] * qb[0] + qa[0] * qb[3] + qa[1] * qb[2] - qa[2] * qb[1];
|
||||
c[1] = qa[3] * qb[1] + qa[1] * qb[3] + qa[2] * qb[0] - qa[0] * qb[2];
|
||||
c[2] = qa[3] * qb[2] + qa[2] * qb[3] + qa[0] * qb[1] - qa[1] * qb[0];
|
||||
c[3] = qa[3] * qb[3] - qa[0] * qb[0] - qa[1] * qb[1] - qa[2] * qb[2];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a quaternion by a scalar.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_scalar(float c[4], float k) {
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] *= k;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Normalize a quaternion.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_normalize(float c[4]) {
|
||||
double l, m;
|
||||
|
||||
l = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2] + c[3] * c[3]);
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
} else {
|
||||
int i;
|
||||
m = 1.0f / l;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] = (float)(c[i] * m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute the inverse of a quaternion.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_inv(float c[4]) {
|
||||
double l, m;
|
||||
|
||||
l = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2] + c[3] * c[3]);
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
} else {
|
||||
m = 1.0f / l;
|
||||
c[0] = (float)(-c[0] * m);
|
||||
c[1] = (float)(-c[1] * m);
|
||||
c[2] = (float)(-c[2] * m);
|
||||
c[3] = (float)(c[3] * m);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute the dot-product of a quaternion.
|
||||
*/
|
||||
float
|
||||
lib3ds_quat_dot(float a[4], float b[4]) {
|
||||
return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3]);
|
||||
}
|
||||
|
||||
|
||||
float
|
||||
lib3ds_quat_norm(float c[4]) {
|
||||
return(c[0]*c[0] + c[1]*c[1] + c[2]*c[2] + c[3]*c[3]);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_ln(float c[4]) {
|
||||
double om, s, t;
|
||||
|
||||
s = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
|
||||
om = atan2(s, (double)c[3]);
|
||||
if (fabs(s) < LIB3DS_EPSILON) {
|
||||
t = 0.0f;
|
||||
} else {
|
||||
t = om / s;
|
||||
}
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = (float)(c[i] * t);
|
||||
}
|
||||
c[3] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_ln_dif(float c[4], float a[4], float b[4]) {
|
||||
float invp[4];
|
||||
|
||||
lib3ds_quat_copy(invp, a);
|
||||
lib3ds_quat_inv(invp);
|
||||
lib3ds_quat_mul(c, invp, b);
|
||||
lib3ds_quat_ln(c);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_exp(float c[4]) {
|
||||
double om, sinom;
|
||||
|
||||
om = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
|
||||
if (fabs(om) < LIB3DS_EPSILON) {
|
||||
sinom = 1.0f;
|
||||
} else {
|
||||
sinom = sin(om) / om;
|
||||
}
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = (float)(c[i] * sinom);
|
||||
}
|
||||
c[3] = (float)cos(om);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t) {
|
||||
double l;
|
||||
double om, sinom;
|
||||
double sp, sq;
|
||||
float flip = 1.0f;
|
||||
int i;
|
||||
|
||||
l = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
||||
if (l < 0) {
|
||||
flip = -1.0f;
|
||||
l = -l;
|
||||
}
|
||||
|
||||
om = acos(l);
|
||||
sinom = sin(om);
|
||||
if (fabs(sinom) > LIB3DS_EPSILON) {
|
||||
sp = sin((1.0f - t) * om) / sinom;
|
||||
sq = sin(t * om) / sinom;
|
||||
} else {
|
||||
sp = 1.0f - t;
|
||||
sq = t;
|
||||
}
|
||||
sq *= flip;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] = (float)(sp * a[i] + sq * b[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t) {
|
||||
float ab[4];
|
||||
float pq[4];
|
||||
|
||||
lib3ds_quat_slerp(ab, a, b, t);
|
||||
lib3ds_quat_slerp(pq, p, q, t);
|
||||
lib3ds_quat_slerp(c, ab, pq, 2*t*(1 - t));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_tangent(float c[4], float p[4], float q[4], float n[4]) {
|
||||
float dn[4], dp[4], x[4];
|
||||
int i;
|
||||
|
||||
lib3ds_quat_ln_dif(dn, q, n);
|
||||
lib3ds_quat_ln_dif(dp, q, p);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
x[i] = -1.0f / 4.0f * (dn[i] + dp[i]);
|
||||
}
|
||||
lib3ds_quat_exp(x);
|
||||
lib3ds_quat_mul(c, q, x);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_dump(float q[4]) {
|
||||
printf("%f %f %f %f\n", q[0], q[1], q[2], q[3]);
|
||||
}
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
/*!
|
||||
* Set a quaternion to Identity
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_identity(float c[4]) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Copy a quaternion.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_copy(float dest[4], float src[4]) {
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
dest[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute a quaternion from axis and angle.
|
||||
*
|
||||
* \param c Computed quaternion
|
||||
* \param axis Rotation axis
|
||||
* \param angle Angle of rotation, radians.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_axis_angle(float c[4], float axis[3], float angle) {
|
||||
double omega, s;
|
||||
double l;
|
||||
|
||||
l = sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
|
||||
if (l < LIB3DS_EPSILON) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
} else {
|
||||
omega = -0.5 * angle;
|
||||
s = sin(omega) / l;
|
||||
c[0] = (float)s * axis[0];
|
||||
c[1] = (float)s * axis[1];
|
||||
c[2] = (float)s * axis[2];
|
||||
c[3] = (float)cos(omega);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Negate a quaternion
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_neg(float c[4]) {
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] = -c[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute the conjugate of a quaternion
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_cnj(float c[4]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = -c[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply two quaternions.
|
||||
*
|
||||
* \param c Result
|
||||
* \param a,b Inputs
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_mul(float c[4], float a[4], float b[4]) {
|
||||
float qa[4], qb[4];
|
||||
lib3ds_quat_copy(qa, a);
|
||||
lib3ds_quat_copy(qb, b);
|
||||
c[0] = qa[3] * qb[0] + qa[0] * qb[3] + qa[1] * qb[2] - qa[2] * qb[1];
|
||||
c[1] = qa[3] * qb[1] + qa[1] * qb[3] + qa[2] * qb[0] - qa[0] * qb[2];
|
||||
c[2] = qa[3] * qb[2] + qa[2] * qb[3] + qa[0] * qb[1] - qa[1] * qb[0];
|
||||
c[3] = qa[3] * qb[3] - qa[0] * qb[0] - qa[1] * qb[1] - qa[2] * qb[2];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a quaternion by a scalar.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_scalar(float c[4], float k) {
|
||||
int i;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] *= k;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Normalize a quaternion.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_normalize(float c[4]) {
|
||||
double l, m;
|
||||
|
||||
l = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2] + c[3] * c[3]);
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
} else {
|
||||
int i;
|
||||
m = 1.0f / l;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] = (float)(c[i] * m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute the inverse of a quaternion.
|
||||
*/
|
||||
void
|
||||
lib3ds_quat_inv(float c[4]) {
|
||||
double l, m;
|
||||
|
||||
l = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2] + c[3] * c[3]);
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
c[0] = c[1] = c[2] = 0.0f;
|
||||
c[3] = 1.0f;
|
||||
} else {
|
||||
m = 1.0f / l;
|
||||
c[0] = (float)(-c[0] * m);
|
||||
c[1] = (float)(-c[1] * m);
|
||||
c[2] = (float)(-c[2] * m);
|
||||
c[3] = (float)(c[3] * m);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute the dot-product of a quaternion.
|
||||
*/
|
||||
float
|
||||
lib3ds_quat_dot(float a[4], float b[4]) {
|
||||
return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3]);
|
||||
}
|
||||
|
||||
|
||||
float
|
||||
lib3ds_quat_norm(float c[4]) {
|
||||
return(c[0]*c[0] + c[1]*c[1] + c[2]*c[2] + c[3]*c[3]);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_ln(float c[4]) {
|
||||
double om, s, t;
|
||||
|
||||
s = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
|
||||
om = atan2(s, (double)c[3]);
|
||||
if (fabs(s) < LIB3DS_EPSILON) {
|
||||
t = 0.0f;
|
||||
} else {
|
||||
t = om / s;
|
||||
}
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = (float)(c[i] * t);
|
||||
}
|
||||
c[3] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_ln_dif(float c[4], float a[4], float b[4]) {
|
||||
float invp[4];
|
||||
|
||||
lib3ds_quat_copy(invp, a);
|
||||
lib3ds_quat_inv(invp);
|
||||
lib3ds_quat_mul(c, invp, b);
|
||||
lib3ds_quat_ln(c);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_exp(float c[4]) {
|
||||
double om, sinom;
|
||||
|
||||
om = sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
|
||||
if (fabs(om) < LIB3DS_EPSILON) {
|
||||
sinom = 1.0f;
|
||||
} else {
|
||||
sinom = sin(om) / om;
|
||||
}
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = (float)(c[i] * sinom);
|
||||
}
|
||||
c[3] = (float)cos(om);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t) {
|
||||
double l;
|
||||
double om, sinom;
|
||||
double sp, sq;
|
||||
float flip = 1.0f;
|
||||
int i;
|
||||
|
||||
l = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
||||
if (l < 0) {
|
||||
flip = -1.0f;
|
||||
l = -l;
|
||||
}
|
||||
|
||||
om = acos(l);
|
||||
sinom = sin(om);
|
||||
if (fabs(sinom) > LIB3DS_EPSILON) {
|
||||
sp = sin((1.0f - t) * om) / sinom;
|
||||
sq = sin(t * om) / sinom;
|
||||
} else {
|
||||
sp = 1.0f - t;
|
||||
sq = t;
|
||||
}
|
||||
sq *= flip;
|
||||
for (i = 0; i < 4; ++i) {
|
||||
c[i] = (float)(sp * a[i] + sq * b[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t) {
|
||||
float ab[4];
|
||||
float pq[4];
|
||||
|
||||
lib3ds_quat_slerp(ab, a, b, t);
|
||||
lib3ds_quat_slerp(pq, p, q, t);
|
||||
lib3ds_quat_slerp(c, ab, pq, 2*t*(1 - t));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_tangent(float c[4], float p[4], float q[4], float n[4]) {
|
||||
float dn[4], dp[4], x[4];
|
||||
int i;
|
||||
|
||||
lib3ds_quat_ln_dif(dn, q, n);
|
||||
lib3ds_quat_ln_dif(dp, q, p);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
x[i] = -1.0f / 4.0f * (dn[i] + dp[i]);
|
||||
}
|
||||
lib3ds_quat_exp(x);
|
||||
lib3ds_quat_mul(c, q, x);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_quat_dump(float q[4]) {
|
||||
printf("%f %f %f %f\n", q[0], q[1], q[2], q[3]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,96 +1,96 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void
|
||||
lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
lib3ds_chunk_read(&c, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_SHADOW_MAP_SIZE: {
|
||||
shadow->map_size = lib3ds_io_read_intw(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_LO_SHADOW_BIAS: {
|
||||
shadow->low_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_HI_SHADOW_BIAS: {
|
||||
shadow->hi_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_SHADOW_FILTER: {
|
||||
shadow->filter = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_RAY_BIAS: {
|
||||
shadow->ray_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io) {
|
||||
if (fabs(shadow->low_bias) > LIB3DS_EPSILON) { /*---- CHK_LO_SHADOW_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_LO_SHADOW_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->low_bias);
|
||||
}
|
||||
|
||||
if (fabs(shadow->hi_bias) > LIB3DS_EPSILON) { /*---- CHK_HI_SHADOW_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_HI_SHADOW_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->hi_bias);
|
||||
}
|
||||
|
||||
if (shadow->map_size) { /*---- CHK_SHADOW_MAP_SIZE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_SHADOW_MAP_SIZE;
|
||||
c.size = 8;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_intw(io, shadow->map_size);
|
||||
}
|
||||
|
||||
if (fabs(shadow->filter) > LIB3DS_EPSILON) { /*---- CHK_SHADOW_FILTER ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_SHADOW_FILTER;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->filter);
|
||||
}
|
||||
if (fabs(shadow->ray_bias) > LIB3DS_EPSILON) { /*---- CHK_RAY_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_RAY_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->ray_bias);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void
|
||||
lib3ds_shadow_read(Lib3dsShadow *shadow, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
lib3ds_chunk_read(&c, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_SHADOW_MAP_SIZE: {
|
||||
shadow->map_size = lib3ds_io_read_intw(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_LO_SHADOW_BIAS: {
|
||||
shadow->low_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_HI_SHADOW_BIAS: {
|
||||
shadow->hi_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_SHADOW_FILTER: {
|
||||
shadow->filter = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_RAY_BIAS: {
|
||||
shadow->ray_bias = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_shadow_write(Lib3dsShadow *shadow, Lib3dsIo *io) {
|
||||
if (fabs(shadow->low_bias) > LIB3DS_EPSILON) { /*---- CHK_LO_SHADOW_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_LO_SHADOW_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->low_bias);
|
||||
}
|
||||
|
||||
if (fabs(shadow->hi_bias) > LIB3DS_EPSILON) { /*---- CHK_HI_SHADOW_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_HI_SHADOW_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->hi_bias);
|
||||
}
|
||||
|
||||
if (shadow->map_size) { /*---- CHK_SHADOW_MAP_SIZE ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_SHADOW_MAP_SIZE;
|
||||
c.size = 8;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_intw(io, shadow->map_size);
|
||||
}
|
||||
|
||||
if (fabs(shadow->filter) > LIB3DS_EPSILON) { /*---- CHK_SHADOW_FILTER ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_SHADOW_FILTER;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->filter);
|
||||
}
|
||||
if (fabs(shadow->ray_bias) > LIB3DS_EPSILON) { /*---- CHK_RAY_BIAS ----*/
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_RAY_BIAS;
|
||||
c.size = 10;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_float(io, shadow->ray_bias);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,89 +1,89 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size) {
|
||||
if (!ptr)
|
||||
old_size = 0;
|
||||
if (old_size != new_size) {
|
||||
ptr = realloc(ptr, element_size * new_size);
|
||||
if (old_size < new_size) {
|
||||
memset((char*)ptr + element_size * old_size, 0, element_size * (new_size - old_size));
|
||||
}
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func) {
|
||||
assert(ptr && n && size);
|
||||
if ((*size < new_size) || force) {
|
||||
if (force && free_func) {
|
||||
int i;
|
||||
for (i = new_size; i < *n; ++i) {
|
||||
free_func((*ptr)[i]);
|
||||
(*ptr)[i] = 0;
|
||||
}
|
||||
}
|
||||
*ptr = (void**)realloc(*ptr, sizeof(void*) * new_size);
|
||||
*size = new_size;
|
||||
if (*n > new_size) {
|
||||
*n = new_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index) {
|
||||
int i;
|
||||
assert(ptr && n && size && element);
|
||||
i = ((index >= 0) && (index < *n)) ? index : *n;
|
||||
if (i >= *size) {
|
||||
int new_size = 2 * (*size);
|
||||
#ifdef _DEBUG
|
||||
if (new_size < 1) {
|
||||
new_size = 1;
|
||||
}
|
||||
#else
|
||||
if (new_size < 32) {
|
||||
new_size = 32;
|
||||
}
|
||||
#endif
|
||||
lib3ds_util_reserve_array(ptr, n, size, new_size, FALSE, NULL);
|
||||
}
|
||||
assert(*ptr);
|
||||
if (i < *n) {
|
||||
memmove(&(*ptr)[i+1], &(*ptr)[i], sizeof(void*) * (*n - i));
|
||||
}
|
||||
(*ptr)[i] = element;
|
||||
*n = *n + 1;
|
||||
}
|
||||
|
||||
|
||||
void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func) {
|
||||
assert(ptr && n);
|
||||
if ((index >= 0) && (index < *n)) {
|
||||
assert(*ptr);
|
||||
free_func((*ptr)[index]);
|
||||
if (index < *n - 1) {
|
||||
memmove(&(*ptr)[index], &(*ptr)[index+1], sizeof(void*) * (*n - index - 1));
|
||||
}
|
||||
*n = *n - 1;
|
||||
}
|
||||
}
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void* lib3ds_util_realloc_array(void *ptr, int old_size, int new_size, int element_size) {
|
||||
if (!ptr)
|
||||
old_size = 0;
|
||||
if (old_size != new_size) {
|
||||
ptr = realloc(ptr, element_size * new_size);
|
||||
if (old_size < new_size) {
|
||||
memset((char*)ptr + element_size * old_size, 0, element_size * (new_size - old_size));
|
||||
}
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
void lib3ds_util_reserve_array(void ***ptr, int *n, int *size, int new_size, int force, Lib3dsFreeFunc free_func) {
|
||||
assert(ptr && n && size);
|
||||
if ((*size < new_size) || force) {
|
||||
if (force && free_func) {
|
||||
int i;
|
||||
for (i = new_size; i < *n; ++i) {
|
||||
free_func((*ptr)[i]);
|
||||
(*ptr)[i] = 0;
|
||||
}
|
||||
}
|
||||
*ptr = (void**)realloc(*ptr, sizeof(void*) * new_size);
|
||||
*size = new_size;
|
||||
if (*n > new_size) {
|
||||
*n = new_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void lib3ds_util_insert_array(void ***ptr, int *n, int *size, void *element, int index) {
|
||||
int i;
|
||||
assert(ptr && n && size && element);
|
||||
i = ((index >= 0) && (index < *n)) ? index : *n;
|
||||
if (i >= *size) {
|
||||
int new_size = 2 * (*size);
|
||||
#ifdef _DEBUG
|
||||
if (new_size < 1) {
|
||||
new_size = 1;
|
||||
}
|
||||
#else
|
||||
if (new_size < 32) {
|
||||
new_size = 32;
|
||||
}
|
||||
#endif
|
||||
lib3ds_util_reserve_array(ptr, n, size, new_size, FALSE, NULL);
|
||||
}
|
||||
assert(*ptr);
|
||||
if (i < *n) {
|
||||
memmove(&(*ptr)[i+1], &(*ptr)[i], sizeof(void*) * (*n - i));
|
||||
}
|
||||
(*ptr)[i] = element;
|
||||
*n = *n + 1;
|
||||
}
|
||||
|
||||
|
||||
void lib3ds_util_remove_array(void ***ptr, int *n, int index, Lib3dsFreeFunc free_func) {
|
||||
assert(ptr && n);
|
||||
if ((index >= 0) && (index < *n)) {
|
||||
assert(*ptr);
|
||||
free_func((*ptr)[index]);
|
||||
if (index < *n - 1) {
|
||||
memmove(&(*ptr)[index], &(*ptr)[index+1], sizeof(void*) * (*n - index - 1));
|
||||
}
|
||||
*n = *n - 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,246 +1,246 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_make(float c[3], float x, float y, float z) {
|
||||
c[0] = x;
|
||||
c[1] = y;
|
||||
c[2] = z;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_zero(float c[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_copy(float dst[3], float src[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
dst[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Add two vectors.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param a First addend.
|
||||
* \param b Second addend.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_add(float c[3], float a[3], float b[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = a[i] + b[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Subtract two vectors.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param a Addend.
|
||||
* \param b Minuend.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_sub(float c[3], float a[3], float b[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = a[i] - b[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a vector by a scalar.
|
||||
*
|
||||
* \param c Vector to be multiplied.
|
||||
* \param k Scalar.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_scalar_mul(float c[3], float a[3], float k) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = a[i] * k;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute cross product.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param a First vector.
|
||||
* \param b Second vector.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_cross(float c[3], float a[3], float b[3]) {
|
||||
c[0] = a[1] * b[2] - a[2] * b[1];
|
||||
c[1] = a[2] * b[0] - a[0] * b[2];
|
||||
c[2] = a[0] * b[1] - a[1] * b[0];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute dot product.
|
||||
*
|
||||
* \param a First vector.
|
||||
* \param b Second vector.
|
||||
*
|
||||
* \return Dot product.
|
||||
*/
|
||||
float
|
||||
lib3ds_vector_dot(float a[3], float b[3]) {
|
||||
return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2]);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute length of vector.
|
||||
*
|
||||
* Computes |c| = sqrt(x*x + y*y + z*z)
|
||||
*
|
||||
* \param c Vector to compute.
|
||||
*
|
||||
* \return Length of vector.
|
||||
*/
|
||||
float
|
||||
lib3ds_vector_length(float c[3]) {
|
||||
return((float)sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Normalize a vector.
|
||||
*
|
||||
* Scales a vector so that its length is 1.0.
|
||||
*
|
||||
* \param c Vector to normalize.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_normalize(float c[3]) {
|
||||
float l, m;
|
||||
|
||||
l = (float)sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
if ((c[0] >= c[1]) && (c[0] >= c[2])) {
|
||||
c[0] = 1.0f;
|
||||
c[1] = c[2] = 0.0f;
|
||||
} else
|
||||
if (c[1] >= c[2]) {
|
||||
c[1] = 1.0f;
|
||||
c[0] = c[2] = 0.0f;
|
||||
} else {
|
||||
c[2] = 1.0f;
|
||||
c[0] = c[1] = 0.0f;
|
||||
}
|
||||
} else {
|
||||
m = 1.0f / l;
|
||||
c[0] *= m;
|
||||
c[1] *= m;
|
||||
c[2] *= m;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute a vector normal to two line segments.
|
||||
*
|
||||
* Computes the normal vector to the lines b-a and b-c.
|
||||
*
|
||||
* \param n Returned normal vector.
|
||||
* \param a Endpoint of first line.
|
||||
* \param b Base point of both lines.
|
||||
* \param c Endpoint of second line.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_normal(float n[3], float a[3], float b[3], float c[3]) {
|
||||
float p[3], q[3];
|
||||
|
||||
lib3ds_vector_sub(p, c, b);
|
||||
lib3ds_vector_sub(q, a, b);
|
||||
lib3ds_vector_cross(n, p, q);
|
||||
lib3ds_vector_normalize(n);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a point by a transformation matrix.
|
||||
*
|
||||
* Applies the given transformation matrix to the given point. With some
|
||||
* transformation matrices, a vector may also be transformed.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param m Transformation matrix.
|
||||
* \param a Input point.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_transform(float c[3], float m[4][4], float a[3]) {
|
||||
c[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0];
|
||||
c[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1];
|
||||
c[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* c[i] = min(c[i], a[i]);
|
||||
*
|
||||
* Computes minimum values of x,y,z independently.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_min(float c[3], float a[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (a[i] < c[i]) {
|
||||
c[i] = a[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* c[i] = max(c[i], a[i]);
|
||||
*
|
||||
* Computes maximum values of x,y,z independently.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_max(float c[3], float a[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (a[i] > c[i]) {
|
||||
c[i] = a[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_dump(float c[3]) {
|
||||
fprintf(stderr, "%f %f %f\n", c[0], c[1], c[2]);
|
||||
}
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_make(float c[3], float x, float y, float z) {
|
||||
c[0] = x;
|
||||
c[1] = y;
|
||||
c[2] = z;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_zero(float c[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_copy(float dst[3], float src[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
dst[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Add two vectors.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param a First addend.
|
||||
* \param b Second addend.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_add(float c[3], float a[3], float b[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = a[i] + b[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Subtract two vectors.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param a Addend.
|
||||
* \param b Minuend.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_sub(float c[3], float a[3], float b[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = a[i] - b[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a vector by a scalar.
|
||||
*
|
||||
* \param c Vector to be multiplied.
|
||||
* \param k Scalar.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_scalar_mul(float c[3], float a[3], float k) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
c[i] = a[i] * k;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute cross product.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param a First vector.
|
||||
* \param b Second vector.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_cross(float c[3], float a[3], float b[3]) {
|
||||
c[0] = a[1] * b[2] - a[2] * b[1];
|
||||
c[1] = a[2] * b[0] - a[0] * b[2];
|
||||
c[2] = a[0] * b[1] - a[1] * b[0];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute dot product.
|
||||
*
|
||||
* \param a First vector.
|
||||
* \param b Second vector.
|
||||
*
|
||||
* \return Dot product.
|
||||
*/
|
||||
float
|
||||
lib3ds_vector_dot(float a[3], float b[3]) {
|
||||
return(a[0]*b[0] + a[1]*b[1] + a[2]*b[2]);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute length of vector.
|
||||
*
|
||||
* Computes |c| = sqrt(x*x + y*y + z*z)
|
||||
*
|
||||
* \param c Vector to compute.
|
||||
*
|
||||
* \return Length of vector.
|
||||
*/
|
||||
float
|
||||
lib3ds_vector_length(float c[3]) {
|
||||
return((float)sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]));
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Normalize a vector.
|
||||
*
|
||||
* Scales a vector so that its length is 1.0.
|
||||
*
|
||||
* \param c Vector to normalize.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_normalize(float c[3]) {
|
||||
float l, m;
|
||||
|
||||
l = (float)sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]);
|
||||
if (fabs(l) < LIB3DS_EPSILON) {
|
||||
if ((c[0] >= c[1]) && (c[0] >= c[2])) {
|
||||
c[0] = 1.0f;
|
||||
c[1] = c[2] = 0.0f;
|
||||
} else
|
||||
if (c[1] >= c[2]) {
|
||||
c[1] = 1.0f;
|
||||
c[0] = c[2] = 0.0f;
|
||||
} else {
|
||||
c[2] = 1.0f;
|
||||
c[0] = c[1] = 0.0f;
|
||||
}
|
||||
} else {
|
||||
m = 1.0f / l;
|
||||
c[0] *= m;
|
||||
c[1] *= m;
|
||||
c[2] *= m;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Compute a vector normal to two line segments.
|
||||
*
|
||||
* Computes the normal vector to the lines b-a and b-c.
|
||||
*
|
||||
* \param n Returned normal vector.
|
||||
* \param a Endpoint of first line.
|
||||
* \param b Base point of both lines.
|
||||
* \param c Endpoint of second line.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_normal(float n[3], float a[3], float b[3], float c[3]) {
|
||||
float p[3], q[3];
|
||||
|
||||
lib3ds_vector_sub(p, c, b);
|
||||
lib3ds_vector_sub(q, a, b);
|
||||
lib3ds_vector_cross(n, p, q);
|
||||
lib3ds_vector_normalize(n);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* Multiply a point by a transformation matrix.
|
||||
*
|
||||
* Applies the given transformation matrix to the given point. With some
|
||||
* transformation matrices, a vector may also be transformed.
|
||||
*
|
||||
* \param c Result.
|
||||
* \param m Transformation matrix.
|
||||
* \param a Input point.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_transform(float c[3], float m[4][4], float a[3]) {
|
||||
c[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0];
|
||||
c[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1];
|
||||
c[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2];
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* c[i] = min(c[i], a[i]);
|
||||
*
|
||||
* Computes minimum values of x,y,z independently.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_min(float c[3], float a[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (a[i] < c[i]) {
|
||||
c[i] = a[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* c[i] = max(c[i], a[i]);
|
||||
*
|
||||
* Computes maximum values of x,y,z independently.
|
||||
*/
|
||||
void
|
||||
lib3ds_vector_max(float c[3], float a[3]) {
|
||||
int i;
|
||||
for (i = 0; i < 3; ++i) {
|
||||
if (a[i] > c[i]) {
|
||||
c[i] = a[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_vector_dump(float c[3]) {
|
||||
fprintf(stderr, "%f %f %f\n", c[0], c[1], c[2]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,296 +1,296 @@
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void
|
||||
lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
memset(viewport, 0, sizeof(*viewport));
|
||||
lib3ds_chunk_read_start(&c, 0, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_VIEWPORT_LAYOUT: {
|
||||
int cur = 0;
|
||||
viewport->layout_style = lib3ds_io_read_word(io);
|
||||
viewport->layout_active = lib3ds_io_read_intw(io);
|
||||
lib3ds_io_read_intw(io);
|
||||
viewport->layout_swap = lib3ds_io_read_intw(io);
|
||||
lib3ds_io_read_intw(io);
|
||||
viewport->layout_swap_prior = lib3ds_io_read_intw(io);
|
||||
viewport->layout_swap_view = lib3ds_io_read_intw(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_VIEWPORT_SIZE: {
|
||||
viewport->layout_position[0] = lib3ds_io_read_word(io);
|
||||
viewport->layout_position[1] = lib3ds_io_read_word(io);
|
||||
viewport->layout_size[0] = lib3ds_io_read_word(io);
|
||||
viewport->layout_size[1] = lib3ds_io_read_word(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEWPORT_DATA_3: {
|
||||
if (cur < LIB3DS_LAYOUT_MAX_VIEWS) {
|
||||
lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].axis_lock = lib3ds_io_read_word(io);
|
||||
viewport->layout_views[cur].position[0] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].position[1] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].size[0] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].size[1] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].type = lib3ds_io_read_word(io);
|
||||
viewport->layout_views[cur].zoom = lib3ds_io_read_float(io);
|
||||
lib3ds_io_read_vector(io, viewport->layout_views[cur].center);
|
||||
viewport->layout_views[cur].horiz_angle = lib3ds_io_read_float(io);
|
||||
viewport->layout_views[cur].vert_angle = lib3ds_io_read_float(io);
|
||||
lib3ds_io_read(io, viewport->layout_views[cur].camera, 11);
|
||||
++cur;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEWPORT_DATA:
|
||||
/* 3DS R2 & R3 chunk unsupported */
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DEFAULT_VIEW: {
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_VIEW_TOP: {
|
||||
viewport->default_type = LIB3DS_VIEW_TOP;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_BOTTOM: {
|
||||
viewport->default_type = LIB3DS_VIEW_BOTTOM;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_LEFT: {
|
||||
viewport->default_type = LIB3DS_VIEW_LEFT;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_RIGHT: {
|
||||
viewport->default_type = LIB3DS_VIEW_RIGHT;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_FRONT: {
|
||||
viewport->default_type = LIB3DS_VIEW_FRONT;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_BACK: {
|
||||
viewport->default_type = LIB3DS_VIEW_BACK;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_USER: {
|
||||
viewport->default_type = LIB3DS_VIEW_USER;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
viewport->default_horiz_angle = lib3ds_io_read_float(io);
|
||||
viewport->default_vert_angle = lib3ds_io_read_float(io);
|
||||
viewport->default_roll_angle = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_CAMERA: {
|
||||
viewport->default_type = LIB3DS_VIEW_CAMERA;
|
||||
lib3ds_io_read(io, viewport->default_camera, 11);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io) {
|
||||
if (viewport->layout_nviews) {
|
||||
Lib3dsChunk c;
|
||||
int i;
|
||||
|
||||
c.chunk = CHK_VIEWPORT_LAYOUT;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_word(io, (uint16_t)viewport->layout_style);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_active);
|
||||
lib3ds_io_write_intw(io, (int16_t)0);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_swap);
|
||||
lib3ds_io_write_intw(io, (int16_t)0);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_swap_prior);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_swap_view);
|
||||
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEWPORT_SIZE;
|
||||
c.size = 14;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_intw(io, viewport->layout_position[0]);
|
||||
lib3ds_io_write_intw(io, viewport->layout_position[1]);
|
||||
lib3ds_io_write_intw(io, viewport->layout_size[0]);
|
||||
lib3ds_io_write_intw(io, viewport->layout_size[1]);
|
||||
}
|
||||
|
||||
for (i = 0; i < viewport->layout_nviews; ++i) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEWPORT_DATA_3;
|
||||
c.size = 55;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
|
||||
lib3ds_io_write_intw(io, 0);
|
||||
lib3ds_io_write_word(io, (uint16_t)viewport->layout_views[i].axis_lock);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].position[0]);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].position[1]);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].size[0]);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].size[1]);
|
||||
lib3ds_io_write_word(io, (int16_t)viewport->layout_views[i].type);
|
||||
lib3ds_io_write_float(io, viewport->layout_views[i].zoom);
|
||||
lib3ds_io_write_vector(io, viewport->layout_views[i].center);
|
||||
lib3ds_io_write_float(io, viewport->layout_views[i].horiz_angle);
|
||||
lib3ds_io_write_float(io, viewport->layout_views[i].vert_angle);
|
||||
lib3ds_io_write(io, viewport->layout_views[i].camera, 11);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
if (viewport->default_type) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_DEFAULT_VIEW;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
switch (viewport->default_type) {
|
||||
case LIB3DS_VIEW_TOP: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_TOP;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_BOTTOM: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_BOTTOM;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_LEFT: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_LEFT;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_RIGHT: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_RIGHT;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_FRONT: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_FRONT;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_BACK: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_BACK;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_USER: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_USER;
|
||||
c.size = 34;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
lib3ds_io_write_float(io, viewport->default_horiz_angle);
|
||||
lib3ds_io_write_float(io, viewport->default_vert_angle);
|
||||
lib3ds_io_write_float(io, viewport->default_roll_angle);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_CAMERA: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_CAMERA;
|
||||
c.size = 17;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write(io, viewport->default_camera, 11);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
|
||||
All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation, either version 2.1 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Thisprogram 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "lib3ds_impl.h"
|
||||
|
||||
|
||||
void
|
||||
lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io) {
|
||||
Lib3dsChunk c;
|
||||
uint16_t chunk;
|
||||
|
||||
memset(viewport, 0, sizeof(*viewport));
|
||||
lib3ds_chunk_read_start(&c, 0, io);
|
||||
switch (c.chunk) {
|
||||
case CHK_VIEWPORT_LAYOUT: {
|
||||
int cur = 0;
|
||||
viewport->layout_style = lib3ds_io_read_word(io);
|
||||
viewport->layout_active = lib3ds_io_read_intw(io);
|
||||
lib3ds_io_read_intw(io);
|
||||
viewport->layout_swap = lib3ds_io_read_intw(io);
|
||||
lib3ds_io_read_intw(io);
|
||||
viewport->layout_swap_prior = lib3ds_io_read_intw(io);
|
||||
viewport->layout_swap_view = lib3ds_io_read_intw(io);
|
||||
lib3ds_chunk_read_tell(&c, io);
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_VIEWPORT_SIZE: {
|
||||
viewport->layout_position[0] = lib3ds_io_read_word(io);
|
||||
viewport->layout_position[1] = lib3ds_io_read_word(io);
|
||||
viewport->layout_size[0] = lib3ds_io_read_word(io);
|
||||
viewport->layout_size[1] = lib3ds_io_read_word(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEWPORT_DATA_3: {
|
||||
if (cur < LIB3DS_LAYOUT_MAX_VIEWS) {
|
||||
lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].axis_lock = lib3ds_io_read_word(io);
|
||||
viewport->layout_views[cur].position[0] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].position[1] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].size[0] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].size[1] = lib3ds_io_read_intw(io);
|
||||
viewport->layout_views[cur].type = lib3ds_io_read_word(io);
|
||||
viewport->layout_views[cur].zoom = lib3ds_io_read_float(io);
|
||||
lib3ds_io_read_vector(io, viewport->layout_views[cur].center);
|
||||
viewport->layout_views[cur].horiz_angle = lib3ds_io_read_float(io);
|
||||
viewport->layout_views[cur].vert_angle = lib3ds_io_read_float(io);
|
||||
lib3ds_io_read(io, viewport->layout_views[cur].camera, 11);
|
||||
++cur;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEWPORT_DATA:
|
||||
/* 3DS R2 & R3 chunk unsupported */
|
||||
break;
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_DEFAULT_VIEW: {
|
||||
while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
|
||||
switch (chunk) {
|
||||
case CHK_VIEW_TOP: {
|
||||
viewport->default_type = LIB3DS_VIEW_TOP;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_BOTTOM: {
|
||||
viewport->default_type = LIB3DS_VIEW_BOTTOM;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_LEFT: {
|
||||
viewport->default_type = LIB3DS_VIEW_LEFT;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_RIGHT: {
|
||||
viewport->default_type = LIB3DS_VIEW_RIGHT;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_FRONT: {
|
||||
viewport->default_type = LIB3DS_VIEW_FRONT;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_BACK: {
|
||||
viewport->default_type = LIB3DS_VIEW_BACK;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_USER: {
|
||||
viewport->default_type = LIB3DS_VIEW_USER;
|
||||
lib3ds_io_read_vector(io, viewport->default_position);
|
||||
viewport->default_width = lib3ds_io_read_float(io);
|
||||
viewport->default_horiz_angle = lib3ds_io_read_float(io);
|
||||
viewport->default_vert_angle = lib3ds_io_read_float(io);
|
||||
viewport->default_roll_angle = lib3ds_io_read_float(io);
|
||||
break;
|
||||
}
|
||||
|
||||
case CHK_VIEW_CAMERA: {
|
||||
viewport->default_type = LIB3DS_VIEW_CAMERA;
|
||||
lib3ds_io_read(io, viewport->default_camera, 11);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
lib3ds_chunk_unknown(chunk, io);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_read_end(&c, io);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io) {
|
||||
if (viewport->layout_nviews) {
|
||||
Lib3dsChunk c;
|
||||
int i;
|
||||
|
||||
c.chunk = CHK_VIEWPORT_LAYOUT;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
lib3ds_io_write_word(io, (uint16_t)viewport->layout_style);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_active);
|
||||
lib3ds_io_write_intw(io, (int16_t)0);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_swap);
|
||||
lib3ds_io_write_intw(io, (int16_t)0);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_swap_prior);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_swap_view);
|
||||
|
||||
{
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEWPORT_SIZE;
|
||||
c.size = 14;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_intw(io, viewport->layout_position[0]);
|
||||
lib3ds_io_write_intw(io, viewport->layout_position[1]);
|
||||
lib3ds_io_write_intw(io, viewport->layout_size[0]);
|
||||
lib3ds_io_write_intw(io, viewport->layout_size[1]);
|
||||
}
|
||||
|
||||
for (i = 0; i < viewport->layout_nviews; ++i) {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEWPORT_DATA_3;
|
||||
c.size = 55;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
|
||||
lib3ds_io_write_intw(io, 0);
|
||||
lib3ds_io_write_word(io, (uint16_t)viewport->layout_views[i].axis_lock);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].position[0]);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].position[1]);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].size[0]);
|
||||
lib3ds_io_write_intw(io, (int16_t)viewport->layout_views[i].size[1]);
|
||||
lib3ds_io_write_word(io, (int16_t)viewport->layout_views[i].type);
|
||||
lib3ds_io_write_float(io, viewport->layout_views[i].zoom);
|
||||
lib3ds_io_write_vector(io, viewport->layout_views[i].center);
|
||||
lib3ds_io_write_float(io, viewport->layout_views[i].horiz_angle);
|
||||
lib3ds_io_write_float(io, viewport->layout_views[i].vert_angle);
|
||||
lib3ds_io_write(io, viewport->layout_views[i].camera, 11);
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
|
||||
if (viewport->default_type) {
|
||||
Lib3dsChunk c;
|
||||
|
||||
c.chunk = CHK_DEFAULT_VIEW;
|
||||
lib3ds_chunk_write_start(&c, io);
|
||||
|
||||
switch (viewport->default_type) {
|
||||
case LIB3DS_VIEW_TOP: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_TOP;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_BOTTOM: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_BOTTOM;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_LEFT: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_LEFT;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_RIGHT: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_RIGHT;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_FRONT: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_FRONT;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_BACK: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_BACK;
|
||||
c.size = 22;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_USER: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_USER;
|
||||
c.size = 34;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write_vector(io, viewport->default_position);
|
||||
lib3ds_io_write_float(io, viewport->default_width);
|
||||
lib3ds_io_write_float(io, viewport->default_horiz_angle);
|
||||
lib3ds_io_write_float(io, viewport->default_vert_angle);
|
||||
lib3ds_io_write_float(io, viewport->default_roll_angle);
|
||||
break;
|
||||
}
|
||||
|
||||
case LIB3DS_VIEW_CAMERA: {
|
||||
Lib3dsChunk c;
|
||||
c.chunk = CHK_VIEW_CAMERA;
|
||||
c.size = 17;
|
||||
lib3ds_chunk_write(&c, io);
|
||||
lib3ds_io_write(io, viewport->default_camera, 11);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lib3ds_chunk_write_end(&c, io);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user