/*	
 *	clipspr2.c
 *
 *	簡易スプライトドライバを定義します。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2008 Naoyuki Sawa
 *
 *	* Mon Aug  2 06:00:00 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 *	  拡縮回転スプライト描画(sprite_draw2)を使うと、3D描画モジュール(clipren3.o,framds??.o)がリンクされます。
 *	  拡縮回転スプライト描画の使用頻度は低いので、常に3D描画モジュールがリンクされてしまうのを避けるために、
 *	  拡縮回転スプライト描画だけは、通常のスプライト機能(sprite_draw等)とは別のモジュールに分離しました。
 *	* Tue Jan 01 22:30:05 JST 2008 Naoyuki Sawa
 *	- sprite_draw2()で1bit/1bitmaskテクスチャを描くときに、DRW_CLR()パラメータ指定が正しく反映されるよう修正しました。
 *	  これまでは、1bit/1bitmaskテクスチャはカラー=0固定で描いてしまい、DRW_CLR()パラメータが反映されていませんでした。
 *	- sprite_draw2()へのDRW_CLR()のパラメータ指定に、COLOR_MASK(透明色)は対応していません。
 *	  DRW_CLR()のパラメータは、C1(前景色)、C2(背景色)共に、0〜3のカラーで指定してください。
 */
#include "clip.h"

/*****************************************************************************
 *	
 *****************************************************************************/

void
sprite_draw2(int x, int y, int sprno, int param, fixed scale_x, fixed scale_y, fixed rot)
{
	SPRITE_DRIVER* driver = &sprite_driver;
	RENDER* render = driver->render;
	//
	const SPRITE* sprite;
	TEXTURE* texture_save;
	fixed cos_rot;
	fixed sin_rot;
	fixed a00;
	fixed a01;
	fixed a10;
	fixed a11;
	fixed x03;
	fixed x12;
	fixed y01;
	fixed y23;
	fixed a00_x03;
	fixed a00_x12;
	fixed a01_y01;
	fixed a01_y23;
	fixed a10_x03;
	fixed a10_x12;
	fixed a11_y01;
	fixed a11_y23;
	VERTEX v[4];

	/* 高速化のため、render_save()を使わずにテクスチャだけ退避します。 */
	texture_save = render->context->texture;

	/* スプライトを取得します。 */
	if(sprno < 0 || driver->sprite_count - 1 < sprno) DIE();
	sprite = &driver->sprites[sprno];

	/* テクスチャを設定します。 */
	if(sprite->texno > driver->texture_count - 1) DIE();
	render->context->texture = &driver->textures[sprite->texno];

	/* スプライトを描きます。 */
	param ^= sprite->param;
	if(!(param & DRW_REVX)) {
		x03 = fiadd(fld(-0.5),         0 - sprite->cx);
		x12 = fiadd(fld(-0.5), sprite->w - sprite->cx);
	} else {
		x03 = fisub(fld( 0.5),         0 - sprite->cx);
		x12 = fisub(fld( 0.5), sprite->w - sprite->cx);
	}
	if(!(param & DRW_REVY)) {
		y01 = fiadd(fld(-0.5),         0 - sprite->cy);
		y23 = fiadd(fld(-0.5), sprite->h - sprite->cy);
	} else {
		y01 = fisub(fld( 0.5),         0 - sprite->cy);
		y23 = fisub(fld( 0.5), sprite->h - sprite->cy);
	}
	cos_rot = fcos(rot);
	sin_rot = fsin(rot);
	a00 = fmul(cos_rot, scale_x);
	a01 = fmul(sin_rot, scale_y);
	a10 = fmul(sin_rot, scale_x);
	a11 = fmul(cos_rot, scale_y);
	a00_x03 = fmul(a00, x03);
	a00_x12 = fmul(a00, x12);
	a01_y01 = fmul(a01, y01);
	a01_y23 = fmul(a01, y23);
	a10_x03 = fmul(a10, x03);
	a10_x12 = fmul(a10, x12);
	a11_y01 = fmul(a11, y01);
	a11_y23 = fmul(a11, y23);
	v[0].x = x + fist(fsub(a00_x03, a01_y01));
	v[0].y = y + fist(fadd(a10_x03, a11_y01));
	v[1].x = x + fist(fsub(a00_x12, a01_y01));
	v[1].y = y + fist(fadd(a10_x12, a11_y01));
	v[2].x = x + fist(fsub(a00_x12, a01_y23));
	v[2].y = y + fist(fadd(a10_x12, a11_y23));
	v[3].x = x + fist(fsub(a00_x03, a01_y23));
	v[3].y = y + fist(fadd(a10_x03, a11_y23));
	v[0].s = v[3].s = sprite->x;
	v[1].s = v[2].s = sprite->x + sprite->w - 1;
	v[0].t = v[1].t = sprite->y;
	v[2].t = v[3].t = sprite->y + sprite->h - 1;
//{{2008/01/01:変更
//	render_polygon(render, v, 4, 0);
//↓ * Tue Jan 01 22:30:05 JST 2008 Naoyuki Sawa
//↓ - sprite_draw2()で1bit/1bitmaskテクスチャを描くときに、DRW_CLR()パラメータ指定が正しく反映されるよう修正しました。
//↓   これまでは、1bit/1bitmaskテクスチャはカラー=0固定で描いてしまい、DRW_CLR()パラメータが反映されていませんでした。
//↓ - sprite_draw2()へのDRW_CLR()のパラメータ指定に、COLOR_MASK(透明色)は対応していません。
//↓   DRW_CLR()のパラメータは、C1(前景色)、C2(背景色)共に、0〜3のカラーで指定してください。
	render_polygon(render, v, 4, (param&0x03)/*C1=前景色*/|((param&0x18)<<1)/*C2=背景色*/);
//}}2008/01/01:変更

	/* 高速化のため、render_restore()を使わずにテクスチャだけ復元します。 */
	render->context->texture = texture_save;
}

