/*#### 	$Id: m_olib.h,v 1.1 2003/06/06 00:15:12 tong Exp $
 |###   --- 補足ライブラリ集 ---
 |##
 |#         CameraやView等で使用
 |
 *
 */

#ifndef __OLIB_H_
#define __OLIB_H_

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include "string.h"
#include "m_types.h"
#include "math64.h"		/* 浮動小数演算関係 */

/*###
 |##  メモリー操作
 |#
 */

#ifndef _LANGUAGE_C_PLUS_PLUS
#define new(type)   (type *)malloc(sizeof(type))
#define delete(obj) free(obj)
#endif
#define g_new(g, type)   (type *)zelda_malloc(sizeof(type))
#define g_new_allay(g, type, n)   (type *)zelda_malloc(sizeof(type) * (n))
#define g_delete(g, obj)  zelda_free(obj)

/*#define memset(a, b, c) Memset(a, b, c)*/

/*###
 |##  コントロール
 |#
 */

#define checkButton(btn)  (Key_T[0].button & (btn))

/*###
 |##  タイプ
 |#
 */
/* シザリングの上下右左 */
typedef struct rectangle_type_0 {
    int top, bottom, left, right;
} irect;

typedef short  sangle_t;

typedef struct r_and_two_sangle {
    float  r;
    sangle_t v;      /* vartical angle */
    sangle_t h;      /* horizontal angle */
} rsvsh_t;

typedef rsvsh_t  spolar_t;
typedef rsvsh_t  sglobe_t;

typedef struct mesh_zx_type_0 {
    int  z, x;
} izix;

typedef struct mesh_zx_type_1 {
    char  z, x;
} czcx;

/*###
 |##  数学系
 |#
 */

/*#define fabs(ff)        fabsf(ff)*/
#ifdef USE_ABS
#define sabs(ss)        ABS(ss)
#else
#define sabs(ss)        ((ss) >= 0 ? (ss) : -(ss))
#endif
#define ROOT2  (1.4142135f)
#define ROOT3  (1.7320508f)

#define SANGLE1D     (182.041667f)              /* =(65535 / 360) */
#define DIVSANGLE1D  (.00549325f)               /* =1 / (65535 / 360) */
#define degree2sangle(dd)  ((short)((dd) * SANGLE1D + 0.5f))
#define sangle2degree(ss)  ((float)(ss) * DIVSANGLE1D)
#define degree2radian(dd)  DEG2RAD(dd)
#define radian2degree(rr)  RAD2DEG(rr)
#define sangle2radian(ss)  degree2radian(sangle2degree(ss))
#define radian2sangle(rr)  degree2sangle(radian2degree(rr))

#define ssin(ss)  sin_s(ss)
#define scos(ss)  cos_s(ss)

#define cos2sin(cc)  (sqrtf(1.0f - (cc) * (cc)))
/*###
 |##  関数宣言
 |#
 */
#ifdef __OLIB_C_
#define _GLOBAL
#else
#define _GLOBAL extern
#endif

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif
_GLOBAL float  distance_between(xyz_t *, xyz_t *);
_GLOBAL float  distance_between2(xyz_t *, xyz_t *, xyz_t *);
_GLOBAL float  distance_2d(xyz_t *, xyz_t *);
_GLOBAL float  never_zero(float, float);
_GLOBAL float  limiter(float, float);
_GLOBAL xyz_t  unitvector_by_2pos(xyz_t *, xyz_t *);
_GLOBAL xyz_t  spolar2world(spolar_t *);
_GLOBAL xyz_t  sglobe2world(sglobe_t *);
_GLOBAL spolar_t  world2spolar(xyz_t *);
_GLOBAL sglobe_t  world2sglobe(xyz_t *);
_GLOBAL spolar_t  spolar_by_2pos(xyz_t *, xyz_t *);
_GLOBAL sglobe_t  sglobe_by_2pos(xyz_t *, xyz_t *);
_GLOBAL xyz_t  radianxy_by_2pos(xyz_t *, xyz_t *);
_GLOBAL xyz_t  degreexy_by_2pos(xyz_t *, xyz_t *);
_GLOBAL s_xyz  sanglexy_by_2pos(xyz_t *, xyz_t *);
#ifdef _LANGUAGE_C_PLUS_PLUS
}
#endif
#undef _GLOBAL

#define pr_sangle_t(aho)  PRINTF("%s(%d): sangle_t: %s %d (%f)\n", \
                          __FILE__, __LINE__, #aho, (short)(aho),     \
			  sangle2degree(aho)) 
#define pr_xyz_t(aho)     PRINTF("%s(%d): xyz_t: %s (%f %f %f)\n", \
                          __FILE__, __LINE__, #aho, (aho)->x,      \
		          (aho)->y, (aho)->z) 
#define pr_s_xyz(aho)     PRINTF("%s(%d): s_xyz: %s (%d %d %d)\n", \
                          __FILE__, __LINE__, #aho, (aho)->sx,      \
		          (aho)->sy, (aho)->sz) 
#define pr_sglobe_t(aho)  PRINTF("%s(%d): sglobe_t: %s (%f %f %f)\n", \
                          __FILE__, __LINE__, #aho, (aho)->r,         \
		          sangle2degree((aho)->v),sangle2degree((aho)->h)) 
#define pass()  PRINTF("-----  pass %d in %s\n", __LINE__, __FILE__)

#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif /* __OLIB_H_ */
