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; }
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); }
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; } }
// コンストラクタ 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(); };