#define D3D_OVERLOADS #include "StdAfx.h" #include "D3DApp.h" #include "D3DTextr.h" #include "D3DUtil.h" #include "D3DMath.h" #include "D3DFile.h" #include "resource.h" /* **----------------------------------------------------------------------------- ** File: fish.cpp ** Purpose: fish demo ** Notes: ** and SetTransform ** ** Copyright (c) 1995 - 1997 by Microsoft, all rights reserved **----------------------------------------------------------------------------- */ //#define FREQUENCY ((rnd()<0.01)||(abs(loc.x-goal.x)< 5.0f)||(abs(loc.y-goal.y)< 5.0f)||(abs(loc.z-goal.z)< 5.0f)) //#define FREQUENCY ((abs(loc.x-goal.x)< 5.0f)||(abs(loc.y-goal.y)< 5.0f)||(abs(loc.z-goal.z)< 5.0f)) #define FREQUENCY 0 #define SPEED 0.001f /* **----------------------------------------------------------------------------- ** Include files **----------------------------------------------------------------------------- */ typedef struct xxx_FISH { D3DVECTOR loc, // current location goal, // current goal delta; // current direction float yaw, pitch, roll; float dyaw; } AFISH; /* **----------------------------------------------------------------------------- ** Local variables **----------------------------------------------------------------------------- */ const float pi = (float)3.1415; //#define POINT_LINE_TEST #define GROUND_GRID //#define NUM_FISH 42 AFISH FISH[NUM_FISH]; #define FISH_VERTICES 36 #define FISH_INDICES 60 D3DVERTEX vFISH[FISH_VERTICES]; WORD iFISH[FISH_INDICES]; #ifdef GROUND_GRID #define NUM_GRID 22 #define GRID_WIDTH 800.0f D3DVERTEX grid[NUM_GRID*NUM_GRID]; #endif #ifdef POINT_LINE_TEST #define LOTS_OF_POINTS (222) D3DVERTEX points[LOTS_OF_POINTS]; #endif D3DMATRIX g_proj, g_view, g_world; // Matrices D3DLIGHT7 g_light; // Structure defining the light D3DMATRIX MatrixMult(D3DMATRIX a, D3DMATRIX b) { D3DMATRIX result; D3DXMatrixMultiply((D3DXMATRIX*)&result,(D3DXMATRIX*)&a,(D3DXMATRIX*)&b); return result; } D3DMATRIX RotateXMatrix(float rot) { D3DMATRIX result; D3DXMatrixRotationX((D3DXMATRIX*)&result,rot); return result; } D3DMATRIX RotateYMatrix(float rot) { D3DMATRIX result; D3DXMatrixRotationY((D3DXMATRIX*)&result,rot); return result; } D3DMATRIX RotateZMatrix(float rot) { D3DMATRIX result; D3DXMatrixRotationZ((D3DXMATRIX*)&result,rot); return result; } D3DMATRIX TranslateMatrix(D3DVECTOR v) { D3DMATRIX result; D3DXMatrixTranslation((D3DXMATRIX*)&result,v.x,v.y,v.z); return result; } D3DMATRIX TranslateMatrix(float x, float y , float z) { D3DMATRIX result; D3DXMatrixTranslation((D3DXMATRIX*)&result,x,y,z); return result; } /* float rnd(void) { return float(rand())/RAND_MAX; } */ /* **----------------------------------------------------------------------------- ** Name: DrawFISH ** Purpose: Draws a single Paper FISH **----------------------------------------------------------------------------- */ HRESULT DrawFISH (LPDIRECT3DDEVICE7 lpDev) { HRESULT hResult; lpDev->SetTexture(0,NULL); hResult =lpDev->DrawIndexedPrimitive (D3DPT_TRIANGLELIST, D3DVT_VERTEX, (LPVOID)vFISH, FISH_VERTICES, iFISH, FISH_INDICES, D3DDP_WAIT); return hResult; } /* **----------------------------------------------------------------------------- ** Name: D3DWindow::Init ** Purpose: Initialize scene objects **----------------------------------------------------------------------------- */ HRESULT InitGeometry() { // // generate the paper FISH data // // right wing top vFISH[ 0] = D3DVERTEX(D3DVECTOR(0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(-0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[ 1] = D3DVERTEX(D3DVECTOR(0.75f, 0.1875f, 3.25f), Normalize(D3DVECTOR(-0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[ 2] = D3DVERTEX(D3DVECTOR(2.75f, 0.6875f, -2.0f), Normalize(D3DVECTOR(-0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[ 3] = D3DVERTEX(D3DVECTOR(2.0f, 0.5f, -4.25f), Normalize(D3DVECTOR(-0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[ 4] = D3DVERTEX(D3DVECTOR(0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(-0.25f, 1.0f, 0.0f)), rnd(), rnd()); // right wing bottom vFISH[ 5] = D3DVERTEX(D3DVECTOR(0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[ 6] = D3DVERTEX(D3DVECTOR(0.75f, 0.1875f, 3.25f), Normalize(D3DVECTOR(0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[ 7] = D3DVERTEX(D3DVECTOR(2.75f, 0.6875f, -2.0f), Normalize(D3DVECTOR(0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[ 8] = D3DVERTEX(D3DVECTOR(2.0f, 0.5f, -4.25f), Normalize(D3DVECTOR(0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[ 9] = D3DVERTEX(D3DVECTOR(0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(0.25f, -1.0f, 0.0f)), rnd(), rnd()); // left wing bottom vFISH[10] = D3DVERTEX(D3DVECTOR(-0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(-0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[11] = D3DVERTEX(D3DVECTOR(-0.75f, 0.1875f, 3.25f), Normalize(D3DVECTOR(-0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[12] = D3DVERTEX(D3DVECTOR(-2.75f, 0.6875f, -2.0f), Normalize(D3DVECTOR(-0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[13] = D3DVERTEX(D3DVECTOR(-2.0f, 0.5f, -4.25f), Normalize(D3DVECTOR(-0.25f, -1.0f, 0.0f)), rnd(), rnd()); vFISH[14] = D3DVERTEX(D3DVECTOR(-0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(-0.25f, -1.0f, 0.0f)), rnd(), rnd()); // left wing top vFISH[15] = D3DVERTEX(D3DVECTOR(-0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[16] = D3DVERTEX(D3DVECTOR(-0.75f, 0.1875f, 3.25f), Normalize(D3DVECTOR(0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[17] = D3DVERTEX(D3DVECTOR(-2.75f, 0.6875f, -2.0f), Normalize(D3DVECTOR(0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[18] = D3DVERTEX(D3DVECTOR(-2.0f, 0.5f, -4.25f), Normalize(D3DVECTOR(0.25f, 1.0f, 0.0f)), rnd(), rnd()); vFISH[19] = D3DVERTEX(D3DVECTOR(-0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(0.25f, 1.0f, 0.0f)), rnd(), rnd()); // right body outside vFISH[20] = D3DVERTEX(D3DVECTOR(0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(1.0f, -0.1f, 0.0f)), rnd(), rnd()); vFISH[21] = D3DVERTEX(D3DVECTOR(0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(1.0f, -0.1f, 0.0f)), rnd(), rnd()); vFISH[22] = D3DVERTEX(D3DVECTOR(0.0f, -2.25f, -2.75f), Normalize(D3DVECTOR(1.0f, -0.1f, 0.0f)), rnd(), rnd()); vFISH[23] = D3DVERTEX(D3DVECTOR(0.0f, -0.5f, 3.625f), Normalize(D3DVECTOR(1.0f, -0.1f, 0.0f)), rnd(), rnd()); // right body inside vFISH[24] = D3DVERTEX(D3DVECTOR(0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(-1.0f, 0.1f, 0.0f)), rnd(), rnd()); vFISH[25] = D3DVERTEX(D3DVECTOR(0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(-1.0f, 0.1f, 0.0f)), rnd(), rnd()); vFISH[26] = D3DVERTEX(D3DVECTOR(0.0f, -2.25f, -2.75f), Normalize(D3DVECTOR(-1.0f, 0.1f, 0.0f)), rnd(), rnd()); vFISH[27] = D3DVERTEX(D3DVECTOR(0.0f, -0.5f, 3.625f), Normalize(D3DVECTOR(-1.0f, 0.1f, 0.0f)), rnd(), rnd()); // left body outside vFISH[28] = D3DVERTEX(D3DVECTOR(-0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(-1.0f, -0.1f, 0.0f)), rnd(), rnd()); vFISH[29] = D3DVERTEX(D3DVECTOR(-0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(-1.0f, -0.1f, 0.0f)), rnd(), rnd()); vFISH[30] = D3DVERTEX(D3DVECTOR(0.0f, -2.25f, -2.75f), Normalize(D3DVECTOR(-1.0f, -0.1f, 0.0f)), rnd(), rnd()); vFISH[31] = D3DVERTEX(D3DVECTOR(0.0f, -0.5f, 3.625f), Normalize(D3DVECTOR(-1.0f, -0.1f, 0.0f)), rnd(), rnd()); // left body inside vFISH[32] = D3DVERTEX(D3DVECTOR(-0.125f, 0.03125f, 3.5f), Normalize(D3DVECTOR(1.0f, 0.1f, 0.0f)), rnd(), rnd()); vFISH[33] = D3DVERTEX(D3DVECTOR(-0.5f, 0.125f, -3.5f), Normalize(D3DVECTOR(1.0f, 0.1f, 0.0f)), rnd(), rnd()); vFISH[34] = D3DVERTEX(D3DVECTOR(0.0f, -2.25f, -2.75f), Normalize(D3DVECTOR(1.0f, 0.1f, 0.0f)), rnd(), rnd()); vFISH[35] = D3DVERTEX(D3DVECTOR(0.0f, -0.5f, 3.625f), Normalize(D3DVECTOR(1.0f, 0.1f, 0.0f)), rnd(), rnd()); // right wing top iFISH[ 0] = 0; iFISH[ 1] = 1; iFISH[ 2] = 4; iFISH[ 3] = 1; iFISH[ 4] = 2; iFISH[ 5] = 4; iFISH[ 6] = 4; iFISH[ 7] = 2; iFISH[ 8] = 3; // right wing bottom iFISH[ 9] = 5; iFISH[10] = 9; iFISH[11] = 6; iFISH[12] = 6; iFISH[13] = 9; iFISH[14] = 7; iFISH[15] = 7; iFISH[16] = 9; iFISH[17] = 8; // left wing top iFISH[18] = 10; iFISH[19] = 11; iFISH[20] = 14; iFISH[21] = 11; iFISH[22] = 12; iFISH[23] = 14; iFISH[24] = 14; iFISH[25] = 12; iFISH[26] = 13; // left wing bottom iFISH[27] = 15; iFISH[28] = 19; iFISH[29] = 16; iFISH[30] = 16; iFISH[31] = 19; iFISH[32] = 17; iFISH[33] = 17; iFISH[34] = 19; iFISH[35] = 18; // right body outside iFISH[36] = 20; iFISH[37] = 23; iFISH[38] = 21; iFISH[39] = 21; iFISH[40] = 23; iFISH[41] = 22; // right body inside iFISH[42] = 24; iFISH[43] = 25; iFISH[44] = 27; iFISH[45] = 25; iFISH[46] = 26; iFISH[47] = 27; // left body outside iFISH[48] = 28; iFISH[49] = 29; iFISH[50] = 31; iFISH[51] = 29; iFISH[52] = 30; iFISH[53] = 31; // left body inside iFISH[54] = 32; iFISH[55] = 35; iFISH[56] = 33; iFISH[57] = 33; iFISH[58] = 35; iFISH[59] = 34; // seed the random number generator srand (time (0)); for (int i=0; i 1.0) { // we're too low FISH[i].pitch += angle_tweak; if (FISH[i].pitch > 0.8f) FISH[i].pitch = 0.8f; } else if (offset.y < -1.0) { // we're too high FISH[i].pitch -= angle_tweak; if (FISH[i].pitch < -0.8f) FISH[i].pitch = -0.8f; } else { // add damping FISH[i].pitch *= 0.95f; } // now figure out yaw changes offset.y = 0.0f; FISH[i].delta.y = 0.0f; FISH[i].delta = Normalize (FISH[i].delta); offset = Normalize (offset); float dot = DotProduct (offset, FISH[i].delta); offset = CrossProduct (offset, FISH[i].delta); dot = (1.0f-dot)/2.0f * angle_tweak * 10.0f; if (offset.y > 0.01) { FISH[i].dyaw = (FISH[i].dyaw*9.0f + dot) * 0.1f; } else if (offset.y < 0.01) { FISH[i].dyaw = (FISH[i].dyaw*9.0f - dot) * 0.1f; } FISH[i].yaw += FISH[i].dyaw; FISH[i].roll = -FISH[i].dyaw * 9.0f; D3DVECTOR loc=FISH[i].loc; D3DVECTOR goal=FISH[i].goal; if (FREQUENCY) { FISH[i].goal = D3DVECTOR(XEXTENT,YEXTENT,ZEXTENT); } g_world = MatrixMult( MatrixMult ( RotateYMatrix (FISH[i].yaw), RotateXMatrix (FISH[i].pitch) ), RotateZMatrix (FISH[i].roll) ); // get delta buy grabbing the z axis out of the transform FISH[i].delta[0] = g_world(2, 0); FISH[i].delta[1] = g_world(2, 1); FISH[i].delta[2] = g_world(2, 2); // update position FISH[i].loc += speed * FISH[i].delta; D3DMATRIX scaleMatrix; D3DXMatrixScaling((D3DXMATRIX*)&scaleMatrix,0.1f,0.1f,0.1f); // first scale then translate into place, then set orientation, then scale g_world = MatrixMult(scaleMatrix,TranslateMatrix (FISH[i].loc)); g_world = MatrixMult (g_world, MatrixMult (MatrixMult (RotateYMatrix (FISH[i].yaw), RotateXMatrix (FISH[i].pitch)), RotateZMatrix (FISH[i].roll))); // apply the world matrix hResult = lpDev->SetTransform (D3DTRANSFORMSTATE_WORLD, &g_world); if (FAILED (hResult)) return hResult; // display the vFISH DrawFISH (lpDev); } // end of loop for each vFISH tic += 0.01f; return DD_OK; } HRESULT PlayWithGeometry(LPDIRECT3DDEVICE7 lpDev,CD3DFile* pFileObject) { HRESULT hResult; // play with FISH static float tic = 0.0f; static float speed=2.0f; static float angle_tweak = 0.02f; static D3DVECTOR z_ward(0.0f, 0.0f, 1.0f); for (int i=0; i 1.0) { // we're too low FISH[i].pitch += angle_tweak; if (FISH[i].pitch > 0.8f) FISH[i].pitch = 0.8f; } else if (offset.y < -1.0) { // we're too high FISH[i].pitch -= angle_tweak; if (FISH[i].pitch < -0.8f) FISH[i].pitch = -0.8f; } else { // add damping FISH[i].pitch *= 0.95f; } // now figure out yaw changes offset.y = 0.0f; FISH[i].delta.y = 0.0f; FISH[i].delta = Normalize (FISH[i].delta); offset = Normalize (offset); float dot = DotProduct (offset, FISH[i].delta); offset = CrossProduct (offset, FISH[i].delta); dot = (1.0f-dot)/2.0f * angle_tweak * 10.0f; if (offset.y > 0.01) { FISH[i].dyaw = (FISH[i].dyaw*9.0f + dot) * 0.1f; } else if (offset.y < 0.01) { FISH[i].dyaw = (FISH[i].dyaw*9.0f - dot) * 0.1f; } FISH[i].yaw += FISH[i].dyaw; FISH[i].roll = -FISH[i].dyaw * 9.0f; if (rnd() < 0.03) { FISH[i].goal = D3DVECTOR(10.0f*(rnd()-rnd()), 10.0f*(rnd()-rnd()), rnd()*20.0f - 10.0f); } D3DMATRIX scaleMatrix; D3DXMatrixScaling((D3DXMATRIX*)&scaleMatrix,0.1f,0.1f,0.1f); // build the world matrix for the vFISH g_world = MatrixMult( MatrixMult (RotateYMatrix (FISH[i].yaw), RotateXMatrix (FISH[i].pitch)), RotateZMatrix (FISH[i].roll) ); // get delta buy grabbing the z axis out of the transform FISH[i].delta[0] = g_world(2, 0); FISH[i].delta[1] = g_world(2, 1); FISH[i].delta[2] = g_world(2, 2); // update position FISH[i].loc += speed * FISH[i].delta; // first translate into place, then set orientation, then scale g_world = MatrixMult (g_world, MatrixMult (MatrixMult (RotateYMatrix (FISH[i].yaw), RotateXMatrix (FISH[i].pitch)), RotateZMatrix (FISH[i].roll))); g_world = MatrixMult(scaleMatrix,g_world); //g_world = MatrixMult (g_world, MatrixMult (MatrixMult (RotateYMatrix (FISH[i].yaw), RotateXMatrix (FISH[i].pitch)), RotateZMatrix (FISH[i].roll))); //g_world = MatrixMult (g_world, Scale(5.0f)); // apply the world matrix hResult = lpDev->SetTransform (D3DTRANSFORMSTATE_WORLD, &g_world); if (FAILED (hResult)) return hResult; pFileObject->Render(lpDev); // display the vFISH //DrawFISH (lpDev); } // end of loop for each vFISH /* g_world = TranslateMatrix (0.0f, -60.0f, 0.0f); hResult = lpDev->SetTransform (D3DTRANSFORMSTATE_WORLD, &g_world); if (FAILED (hResult)) return hResult; hResult = lpDev->DrawPrimitive (D3DPT_LINELIST, D3DVT_VERTEX, (LPVOID)grid, NUM_GRID*NUM_GRID, D3DDP_WAIT); if (FAILED (hResult)) return hResult; g_world = MatrixMult (g_world, RotateYMatrix (pi/2.0f)); hResult = lpDev->SetTransform (D3DTRANSFORMSTATE_WORLD, &g_world); if (FAILED (hResult)) return hResult; hResult = lpDev->DrawPrimitive (D3DPT_LINELIST, D3DVT_VERTEX, (LPVOID)grid, NUM_GRID*NUM_GRID, D3DDP_WAIT); if (FAILED (hResult)) return hResult; */ tic += 0.01f; return DD_OK; }