Chunk3DS.java

/*
 * Copyright (C) 2012 Alberto Irurueta Carro (alberto@irurueta.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.irurueta.geometry.io;

import java.io.IOException;

public class Chunk3DS {
    public static final int NULL_CHUNK = 0x0000;
    public static final int M3DMAGIC = 0x4D4D;
    public static final int SMAGIC = 0x2D2D;
    public static final int LMAGIC = 0x2D3D;
    public static final int MLIBMAGIC = 0x3DAA;
    public static final int MATMAGIC = 0x3DFF;
    public static final int CMAGIC = 0xC23D;
    public static final int M3D_VERSION = 0x0002;
    public static final int M3D_KFVERSION = 0x0005;

    public static final int COLOR_F = 0x0010;
    public static final int COLOR_24 = 0x0011;
    public static final int LIN_COLOR_24 = 0x0012;
    public static final int LIN_COLOR_F = 0x0013;
    public static final int INT_PERCENTAGE = 0x0030;
    public static final int FLOAT_PERCENTAGE = 0x0031;

    public static final int MDATA = 0x3D3D;
    public static final int MESH_VERSION = 0x3D3E;
    public static final int MASTER_SCALE = 0x0100;
    public static final int LO_SHADOW_BIAS = 0x1400;
    public static final int HI_SHADOW_BIAS = 0x1410;
    public static final int SHADOW_MAP_SIZE = 0x1420;
    public static final int SHADOW_SAMPLES = 0x1430;
    public static final int SHADOW_RANGE = 0x1440;
    public static final int SHADOW_FILTER = 0x1450;
    public static final int RAY_BIAS = 0x1460;
    public static final int O_CONSTS = 0x1500;
    public static final int AMBIENT_LIGHT = 0x2100;
    public static final int BIT_MAP = 0x1100;
    public static final int SOLID_BGND = 0x1200;
    public static final int V_GRADIENT = 0x1300;
    public static final int USE_BIT_MAP = 0x1101;
    public static final int USE_SOLID_BGND = 0x1201;
    public static final int USE_V_GRADIENT = 0x1301;
    public static final int FOG = 0x2200;
    public static final int FOG_BGND = 0x2210;
    public static final int LAYER_FOG = 0x2302;
    public static final int DISTANCE_CUE = 0x2300;
    public static final int DCUE_BGND = 0x2310;
    public static final int USE_FOG = 0x2201;
    public static final int USE_LAYER_FOG = 0x2303;
    public static final int USE_DISTANCE_CUE = 0x2301;

    public static final int MAT_ENTRY = 0xAFFF;
    public static final int MAT_NAME = 0xA000;
    public static final int MAT_AMBIENT = 0xA010;
    public static final int MAT_DIFFUSE = 0xA020;
    public static final int MAT_SPECULAR = 0xA030;
    public static final int MAT_SHININESS = 0xA040;
    public static final int MAT_SHIN2PCT = 0xA041;
    public static final int MAT_TRANSPARENCY = 0xA050;
    public static final int MAT_XPFALL = 0xA052;
    public static final int MAT_USE_XPFALL = 0xA240;
    public static final int MAT_REFBLUR = 0xA053;
    public static final int MAT_SHADING = 0xA100;
    public static final int MAT_USE_REFBLUR = 0xA250;
    public static final int MAT_SELF_ILLUM = 0xA080;
    public static final int MAT_TWO_SIDE = 0xA081;
    public static final int MAT_DECAL = 0xA082;
    public static final int MAT_ADDITIVE = 0xA083;
    public static final int MAT_SELF_ILPCT = 0xA084;
    public static final int MAT_WIRE = 0xA085;
    public static final int MAT_FACEMAP = 0xA088;
    public static final int MAT_PHONGSOFT = 0xA08C;
    public static final int MAT_WIREABS = 0xA08E;
    public static final int MAT_WIRE_SIZE = 0xA087;
    public static final int MAT_TEXMAP = 0xA200;
    public static final int MAT_SXP_TEXT_DATA = 0xA320;
    public static final int MAT_TEXMASK = 0xA33E;
    public static final int MAT_SXP_TEXTMASK_DATA = 0xA32A;
    public static final int MAT_TEX2MAP = 0xA33A;
    public static final int MAT_SXP_TEXT2_DATA = 0xA321;
    public static final int MAT_TEX2MASK = 0xA340;
    public static final int MAT_SXP_TEXT2MASK_DATA = 0xA32C;
    public static final int MAT_OPACMAP = 0xA210;
    public static final int MAT_SXP_OPAC_DATA = 0xA322;
    public static final int MAT_OPACMASK = 0xA342;
    public static final int MAT_SXP_OPACMASK_DATA = 0xA32E;
    public static final int MAT_BUMPMAP = 0xA230;
    public static final int MAT_SXP_BUMP_DATA = 0xA324;
    public static final int MAT_BUMPMASK = 0xA344;
    public static final int MAT_SXP_BUMPMASK_DATA = 0xA330;
    public static final int MAT_SPECMAP = 0xA204;
    public static final int MAT_SXP_SPEC_DATA = 0xA325;
    public static final int MAT_SPECMASK = 0xA348;
    public static final int MAT_SXP_SPECMASK_DATA = 0xA332;
    public static final int MAT_SHINMAP = 0xA33C;
    public static final int MAT_SXP_SHIN_DATA = 0xA326;
    public static final int MAT_SHINMASK = 0xA346;
    public static final int MAT_SXP_SHINMASK_DATA = 0xA334;
    public static final int MAT_SELFIMAP = 0xA33D;
    public static final int MAT_SXP_SELFI_DATA = 0xA328;
    public static final int MAT_SELFIMASK = 0xA34A;
    public static final int MAT_SXP_SELFIMASK_DATA = 0xA336;
    public static final int MAT_REFLMAP = 0xA220;
    public static final int MAT_REFLMASK = 0xA34C;
    public static final int MAT_SXP_REFLMASK_DATA = 0xA338;
    public static final int MAT_ACUBIC = 0xA310;
    public static final int MAT_MAPNAME = 0xA300;
    public static final int MAT_MAP_TILING = 0xA351;
    public static final int MAT_MAP_TEXBLUR = 0xA353;
    public static final int MAT_MAP_USCALE = 0xA354;
    public static final int MAT_MAP_VSCALE = 0xA356;
    public static final int MAT_MAP_UOFFSET = 0xA358;
    public static final int MAT_MAP_VOFFSET = 0xA35A;
    public static final int MAT_MAP_ANG = 0xA35C;
    public static final int MAT_MAP_COL1 = 0xA360;
    public static final int MAT_MAP_COL2 = 0xA362;
    public static final int MAT_MAP_RCOL = 0xA364;
    public static final int MAT_MAP_GCOL = 0xA366;
    public static final int MAT_MAP_BCOL = 0xA368;

    public static final int NAMED_OBJECT = 0x4000;
    public static final int N_DIRECT_LIGHT = 0x4600;
    public static final int DL_OFF = 0x4620;
    public static final int DL_OUTER_RANGE = 0x465A;
    public static final int DL_INNER_RANGE = 0x4659;
    public static final int DL_MULTIPLIER = 0x465B;
    public static final int DL_EXCLUDE = 0x4654;
    public static final int DL_ATTENUATE = 0x4625;
    public static final int DL_SPOTLIGHT = 0x4610;
    public static final int DL_SPOT_ROLL = 0x4656;
    public static final int DL_SHADOWED = 0x4630;
    public static final int DL_LOCAL_SHADOW2 = 0x4641;
    public static final int DL_SEE_CONE = 0x4650;
    public static final int DL_SPOT_RECTANGULAR = 0x4651;
    public static final int DL_SPOT_ASPECT = 0x4657;
    public static final int DL_SPOT_PROJECTOR = 0x4653;
    public static final int DL_SPOT_OVERSHOOT = 0x4652;
    public static final int DL_RAY_BIAS = 0x4658;
    public static final int DL_RAYSHAD = 0x4627;
    public static final int N_CAMERA = 0x4700;
    public static final int CAM_SEE_CONE = 0x4710;
    public static final int CAM_RANGES = 0x4720;
    public static final int OBJ_HIDDEN = 0x4010;
    public static final int OBJ_VIS_LOFTER = 0x4011;
    public static final int OBJ_DOESNT_CAST = 0x4012;
    public static final int OBJ_DONT_RCVSHADOW = 0x4017;
    public static final int OBJ_MATTE = 0x4013;
    public static final int OBJ_FAST = 0x4014;
    public static final int OBJ_PROCEDURAL = 0x4015;
    public static final int OBJ_FROZEN = 0x4016;
    public static final int N_TRI_OBJECT = 0x4100;
    public static final int POINT_ARRAY = 0x4110;
    public static final int POINT_FLAG_ARRAY = 0x4111;
    public static final int FACE_ARRAY = 0x4120;
    public static final int MSH_MAT_GROUP = 0x4130;
    public static final int SMOOTH_GROUP = 0x4150;
    public static final int MSH_BOXMAP = 0x4190;
    public static final int TEX_VERTS = 0x4140;
    public static final int MESH_MATRIX = 0x4160;
    public static final int MESH_COLOR = 0x4165;
    public static final int MESH_TEXTURE_INFO = 0x4170;

    public static final int KFDATA = 0xB000;
    public static final int KFHDR = 0xB00A;
    public static final int KFSEG = 0xB008;
    public static final int KFCURTIME = 0xB009;
    public static final int AMBIENT_NODE_TAG = 0xB001;
    public static final int OBJECT_NODE_TAG = 0xB002;
    public static final int CAMERA_NODE_TAG = 0xB003;
    public static final int TARGET_NODE_TAG = 0xB004;
    public static final int LIGHT_NODE_TAG = 0xB005;
    public static final int L_TARGET_NODE_TAG = 0xB006;
    public static final int SPOTLIGHT_NODE_TAG = 0xB007;
    public static final int NODE_ID = 0xB030;
    public static final int NODE_HDR = 0xB010;
    public static final int PIVOT = 0xB013;
    public static final int INSTANCE_NAME = 0xB011;
    public static final int MORPH_SMOOTH = 0xB015;
    public static final int BOUNDBOX = 0xB014;
    public static final int POS_TRACK_TAG = 0xB020;
    public static final int COL_TRACK_TAG = 0xB025;
    public static final int ROT_TRACK_TAG = 0xB021;
    public static final int SCL_TRACK_TAG = 0xB022;
    public static final int MORPH_TRACK_TAG = 0xB026;
    public static final int FOV_TRACK_TAG = 0xB023;
    public static final int ROLL_TRACK_TAG = 0xB024;
    public static final int HOT_TRACK_TAG = 0xB027;
    public static final int FALL_TRACK_TAG = 0xB028;
    public static final int HIDE_TRACK_TAG = 0xB029;

    public static final int POLY_2D = 0x5000;
    public static final int SHAPE_OK = 0x5010;
    public static final int SHAPE_NOT_OK = 0x5011;
    public static final int SHAPE_HOOK = 0x5020;
    public static final int PATH_3D = 0x6000;
    public static final int PATH_MATRIX = 0x6005;
    public static final int SHAPE_2D = 0x6010;
    public static final int M_SCALE = 0x6020;
    public static final int M_TWIST = 0x6030;
    public static final int M_TEETER = 0x6040;
    public static final int M_FIT = 0x6050;
    public static final int M_BEVEL = 0x6060;
    public static final int XZ_CURVE = 0x6070;
    public static final int YZ_CURVE = 0x6080;
    public static final int INTERPCT = 0x6090;
    public static final int DEFORM_LIMIT = 0x60A0;

    public static final int USE_CONTOUR = 0x6100;
    public static final int USE_TWEEN = 0x6110;
    public static final int USE_SCALE = 0x6120;
    public static final int USE_TWIST = 0x6130;
    public static final int USE_TEETER = 0x6140;
    public static final int USE_FIT = 0x6150;
    public static final int USE_BEVEL = 0x6160;

    public static final int DEFAULT_VIEW = 0x3000;
    public static final int VIEW_TOP = 0x3010;
    public static final int VIEW_BOTTOM = 0x3020;
    public static final int VIEW_LEFT = 0x3030;
    public static final int VIEW_RIGHT = 0x3040;
    public static final int VIEW_FRONT = 0x3050;
    public static final int VIEW_BACK = 0x3060;
    public static final int VIEW_USER = 0x3070;
    public static final int VIEW_CAMERA = 0x3080;
    public static final int VIEW_WINDOW = 0x3090;

    public static final int VIEWPORT_LAYOUT_OLD = 0x7000;
    public static final int VIEWPORT_DATA_OLD = 0x7010;
    public static final int VIEWPORT_LAYOUT = 0x7001;
    public static final int VIEWPORT_DATA = 0x7011;
    public static final int VIEWPORT_DATA_3 = 0x7012;
    public static final int VIEWPORT_SIZE = 0x7020;
    public static final int NETWORK_VIEW = 0x7030;

    // uint16
    private int chunkId;

    // uint32
    private long size;

    private long startStreamPosition;
    private long endStreamPosition;

    public Chunk3DS() {
        chunkId = -1;
        size = startStreamPosition = endStreamPosition = -1;
    }

    public int getChunkId() {
        return chunkId;
    }

    public void setChunkId(final int chunkId) {
        this.chunkId = chunkId;
    }

    public boolean isChunkIdAvailable() {
        return chunkId >= 0;
    }

    public long getSize() {
        return size;
    }

    public void setSize(final long size) {
        this.size = size;
    }

    public boolean isSizeAvailable() {
        return size >= 0;
    }

    public long getStartStreamPosition() {
        return startStreamPosition;
    }

    public void setStartStreamPosition(final long startStreamPosition) {
        this.startStreamPosition = startStreamPosition;
    }

    public boolean isStartStreamPositionAvailable() {
        return startStreamPosition >= 0;
    }

    public long getEndStreamPosition() {
        return endStreamPosition;
    }

    public void setEndStreamPosition(final long endStreamPosition) {
        this.endStreamPosition = endStreamPosition;
    }

    public boolean isEndStreamPositionAvailable() {
        return endStreamPosition >= 0;
    }

    public static Chunk3DS load(final AbstractFileReaderAndWriter reader) throws IOException {
        final var chunk = new Chunk3DS();
        chunk.startStreamPosition = reader.getPosition();
        chunk.chunkId = reader.readUnsignedShort(EndianType.LITTLE_ENDIAN_TYPE);
        chunk.size = reader.readUnsignedInt(EndianType.LITTLE_ENDIAN_TYPE);
        chunk.endStreamPosition = chunk.startStreamPosition + chunk.size;

        return chunk;
    }
}