示例#1
0
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	int grhandle, pshandle ;
	VERTEX2DSHADER Vert[ 6 ] ;

	// ウインドウモードで起動
	ChangeWindowMode( TRUE );

	// DXライブラリの初期化
	if( DxLib_Init() < 0 ) return -1;

	// 画像の読み込み
	grhandle = LoadGraph( "Test1.bmp" );

	// ピクセルシェーダーバイナリコードの読み込み
	pshandle = LoadPixelShader( "SamplePS.pso" ) ;

	// 頂点データの準備
	Vert[ 0 ].pos = VGet(   0.0f,   0.0f, 0.0f ) ;
	Vert[ 1 ].pos = VGet( 128.0f,   0.0f, 0.0f ) ;
	Vert[ 2 ].pos = VGet(   0.0f, 512.0f, 0.0f ) ;
	Vert[ 3 ].pos = VGet( 128.0f, 512.0f, 0.0f ) ;
	Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
	Vert[ 0 ].spc = GetColorU8( 0,0,0,0 ) ;
	Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ;
	Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ;
	Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ;
	Vert[ 3 ].u = 1.0f ; Vert[ 3 ].v = 1.0f ;
	Vert[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ;
	Vert[ 1 ].su = 1.0f ; Vert[ 1 ].sv = 0.0f ;
	Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 1.0f ;
	Vert[ 3 ].su = 1.0f ; Vert[ 3 ].sv = 1.0f ;
	Vert[ 0 ].rhw = 1.0f ;
	Vert[ 1 ].rhw = 1.0f ;
	Vert[ 2 ].rhw = 1.0f ;
	Vert[ 3 ].rhw = 1.0f ;
	Vert[ 4 ] = Vert[ 2 ] ;
	Vert[ 5 ] = Vert[ 1 ] ;

	// 使用するテクスチャをセット
	SetUseTextureToShader( 0, grhandle ) ;

	// 使用するピクセルシェーダーをセット
	SetUsePixelShader( pshandle ) ;

	// 描画
	DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ;

	// キー入力待ち
	WaitKey() ;

	// DXライブラリの後始末
	DxLib_End();

	// ソフトの終了
	return 0;
}
示例#2
0
int Dungeon::DrawSquare(float pos_x_lu, float pos_y_lu, float pos_z_lu, float pos_x_rd, float pos_y_rd, float pos_z_rd)
//左上の座標と右下の座標を入力
{

	VERTEX3D Vertex[4];
	WORD Index[6];
	for (int i = 0; i < 4; i++)
	{
		Vertex[i].norm = VGet(0.0f, 0.0f, -1.0f);
		Vertex[i].dif = GetColorU8(255, 255, 255, 255);
		Vertex[i].spc = GetColorU8(0, 0, 0, 0);
		Vertex[i].su = 0.0f;
		Vertex[i].sv = 0.0f;
	}
	double t_z1 = pos_z_lu;
	double t_z2 = pos_z_rd;
	if (pos_y_lu == pos_y_rd) //縦と横の書き分け。要考慮
	{
		double keep_z = t_z1;
		t_z1 = t_z2;
		t_z2 = keep_z;
	}

	// 2ポリゴン分の頂点のデータをセット
	Vertex[0].pos = VGet(pos_x_lu, pos_y_lu, pos_z_lu); //左上の点
	Vertex[0].u = 0.0f;
	Vertex[0].v = 0.0f;

	Vertex[1].pos = VGet(pos_x_lu, pos_y_rd, t_z1); //左下の点
	Vertex[1].u = 0.0f;
	Vertex[1].v = 1.0f;

	Vertex[2].pos = VGet(pos_x_rd, pos_y_lu, t_z2); //右上の点
	Vertex[2].u = 1.0f;
	Vertex[2].v = 0.0f;

	Vertex[3].pos = VGet(pos_x_rd, pos_y_rd, pos_z_rd); //右下の点
	Vertex[3].u = 1.0f;
	Vertex[3].v = 1.0f;

	Index[0] = 0;
	Index[1] = 1;
	Index[2] = 2;
	Index[3] = 3;
	Index[4] = 2;
	Index[5] = 1;

	return DrawPolygonIndexed3D(Vertex, 4, Index, 2, kabe_handle, FALSE);
}
示例#3
0
void BackGroundParts::init(){
	for (int i = 0; i < 6; i++){
		Vert[i].pos = VGet((i % 2 == 0) ? 0 : 1024.0, (i == 2 || i > 3) ? 1024.0 : 0, 0.0f);
		Vert[i].rhw = 1.0f;
		Vert[i].dif = GetColorU8(255, 255, 255, 255);
		Vert[i].u = (i % 2 == 0) ? 0.0f : 1.0f;
		Vert[i].v = (i == 2 || i>3) ? 1.0f : 0.0f;
	}
	for (int i = 0; i < 6; i++){
		Vert[i].u += basePos.x;
		Vert[i].v -= basePos.y;
	}
}
示例#4
0
// コンストラクタ
FloatingDungeon::FloatingDungeon( double CellSize, double CellThickness, char *FileName ) : 
	m_dCellSize( CellSize ), 
	m_dCellThickness( CellThickness )
{
	// ポリゴン情報(vectorで定義)
	// メモリはどのように確保するか?
	
	// マップ情報定義ビットマップを読み込む
	int BitMapHandle = LoadSoftImage( FileName );

	// マップ情報定義ビットマップのサイズを取得(縦横)
	int W, H;
	GetSoftImageSize( BitMapHandle, &W, &H ) ;

	int TotalHorizSidesNum = W*(H+1);  // タイルの辺で水平なものの総数
	int TotalSidesNum = TotalHorizSidesNum + H*(W+1); // タイルの辺の総数

	// タイルの重なる辺を除去するため辺のリストを生成
	// 面の向きを持たせる必要がある
	vector<int> SidesList( TotalSidesNum, 0 );

	// マップ情報定義ビットマップを解析。
	int  r, g, b, a ;
	for( int i=0; i<W; i++)
	{
		for( int j=0; j<H; j++)
		{
			GetPixelSoftImage( BitMapHandle, j, i, &r, &g, &b, &a ) ;

			// r==0 でなければ、cell有りと判断
			if( r==0 )
			{
				// 面のポリゴンを生成
				Vector3D TL, BL, TR, BR, Nrm;

				// 4頂点を定義
				TR= Vector3D( m_dCellSize*(i+1), 0, m_dCellSize*(j+1) );
				TL= Vector3D( m_dCellSize*(i  ), 0, m_dCellSize*(j+1) );
				BR= Vector3D( m_dCellSize*(i+1), 0, m_dCellSize*(j  ) );
				BL= Vector3D( m_dCellSize*(i  ), 0, m_dCellSize*(j  ) );

				// 法線ベクトルを定義
				Nrm = Vector3D( 0, 1, 0 );

				// ##### m_pRawVertexPos
				// 三角形1
				m_RawVertexPosList.push_back( TL );
				m_RawVertexPosList.push_back( TR );
				m_RawVertexPosList.push_back( BL );

				// 三角形2
				m_RawVertexPosList.push_back( TR );
				m_RawVertexPosList.push_back( BL );
				m_RawVertexPosList.push_back( BR );

				// ##### m_pRawVertexNrm
				// 三角形1
				m_RawVertexNrmList.push_back( Nrm );
				m_RawVertexNrmList.push_back( Nrm );
				m_RawVertexNrmList.push_back( Nrm );

				// 三角形2
				m_RawVertexNrmList.push_back( Nrm );
				m_RawVertexNrmList.push_back( Nrm );
				m_RawVertexNrmList.push_back( Nrm );

				// ##### SideList に辺の格納 & 重なる辺を除去

				// タイルの4辺のエンコード
				int T = W*j     + i;
				int B = W*(j+1) + i;
				int L = H*i     + j + TotalHorizSidesNum;
				int R = H*(i+1) + j + TotalHorizSidesNum;
				
				// 排他的論理和をとることで重複する辺を除去する。
				// 辺の向きも同時に格納する
				SidesList[T] =  1 * (int)(SidesList[T]==0);
				SidesList[B] = -1 * (int)(SidesList[B]==0);
				SidesList[L] =  1 * (int)(SidesList[L]==0);
				SidesList[R] = -1 * (int)(SidesList[R]==0);

			}
		}
	}

	// 辺のポリゴンを生成
	for( int i=0; i<TotalSidesNum; i++ )
	{
		if( SidesList[i] != 0 )
		{ // 辺が存在
			// インデックスから辺のパラメータをデコードする
			Vector3D BS, BG, ES, EG, Nrm;
			if( i < TotalHorizSidesNum )
			{ // 水平な辺
				int y = i/W;
				int x = i%W;

				// 位置 : (x,y) - (x+1,y)
				// 向き : (0,1) * SidesList[i]

				// 4頂点を定義
				BS = Vector3D( m_dCellSize* x   ,                 0, m_dCellSize*y );
				BG = Vector3D( m_dCellSize* x   , -m_dCellThickness, m_dCellSize*y );
				ES = Vector3D( m_dCellSize*(x+1),                 0, m_dCellSize*y );
				EG = Vector3D( m_dCellSize*(x+1), -m_dCellThickness, m_dCellSize*y );

				// 法線ベクトルを定義
				Nrm = Vector3D( 0, 0, 1 );
				Nrm *= SidesList[i];
			}
			else
			{ // 垂直な辺
				int k = i - TotalHorizSidesNum;
				int x = k/H;
				int y = k%H;

				// 位置 : (x,y) - (x,y+1)
				// 向き : (1,0) * SidesList[i]

				// 4頂点を定義
				BS = Vector3D( m_dCellSize* x   ,                 0, m_dCellSize* y    );
				BG = Vector3D( m_dCellSize* x   , -m_dCellThickness, m_dCellSize* y    );
				ES = Vector3D( m_dCellSize* x   ,                 0, m_dCellSize*(y+1) );
				EG = Vector3D( m_dCellSize* x   , -m_dCellThickness, m_dCellSize*(y+1) );

				// 法線ベクトルを定義
				Nrm = Vector3D( 1, 0, 0 );
				Nrm *= SidesList[i];

			}

			// 辺のポリゴンを生成

			// ##### m_pRawVertexPos
			// 三角形1
			m_RawVertexPosList.push_back( BS );
			m_RawVertexPosList.push_back( ES );
			m_RawVertexPosList.push_back( BG );

			// 三角形2
			m_RawVertexPosList.push_back( ES );
			m_RawVertexPosList.push_back( BG );
			m_RawVertexPosList.push_back( EG );

			// ##### m_pRawVertexNrm
			// 三角形1
			m_RawVertexNrmList.push_back( Nrm );
			m_RawVertexNrmList.push_back( Nrm );
			m_RawVertexNrmList.push_back( Nrm );

			// 三角形2
			m_RawVertexNrmList.push_back( Nrm );
			m_RawVertexNrmList.push_back( Nrm );
			m_RawVertexNrmList.push_back( Nrm );

		}
	}
	
	// マップ情報定義ビットマップの情報を破棄
	DeleteSoftImage( BitMapHandle );

	// m_pVertex の生成
	int VectexNum = m_RawVertexPosList.size();
	m_iPolygonNum = VectexNum/3;
	m_pVertex       = new VERTEX3D[VectexNum];

	// color と使わない要素を代入する
	COLOR_U8 DifColor = GetColorU8( 255, 255, 255, 0 );
	COLOR_U8 SpcColor = GetColorU8( 255, 255, 255, 0 );
	for( int i=0; i<VectexNum; i++ )
	{
		m_pVertex[i].dif = DifColor;
		m_pVertex[i].spc = SpcColor;
		m_pVertex[i].su  = 0.0f;
		m_pVertex[i].sv  = 0.0f;
	}

	resetVertex();


};