|

楼主 |
发表于 2016-12-17 17:30:14
|
显示全部楼层
又整了个3D版的:
// Test03.cpp : メイン プロジェクト ファイルです。
#include "stdafx.h"
namespace Test03 {
using namespace std;
using namespace takaku;
R dTimeLogic = 0;
R dTimeShell = 0;
R TimeZoom = 10000.0;
R t = 0;
R dt;
vector<SmartPtr<CObject>> AllObjects;
R3 DirXY(R angle) { return R3(cos(angle), sin(angle), 0.0); }
void InitLogic()
{
SmartPtr<CObjectX> pSun = new CObjectX(
L"sun",
R3(0, 0, 0),
R3(0, 0, 0),
m_sun,
15,
0xFFFFFF);
AllObjects.push_back(pSun.GetPtr());
SmartPtr<CObjectX> pMercury = new CObjectX(
L"mercury",
pSun->s + d_mercury * DirXY(0),
pSun->v + v_mercury * DirXY(-PI/2),
m_mercury,
5,
0x00FFFF);
AllObjects.push_back(pMercury.GetPtr());
SmartPtr<CObjectX> pVenus = new CObjectX(
L"venus",
pSun->s + d_venus * DirXY(0),
pSun->v + v_venus * DirXY(-PI/2),
m_venus,
8,
0xFFBB00);
AllObjects.push_back(pVenus.GetPtr());
SmartPtr<CObjectX> pEarth = new CObjectX(
L"earth",
pSun->s + d_earth * DirXY(0),
pSun->v + v_earth * DirXY(-PI/2),
m_earth,
8,
0x0000FF);
AllObjects.push_back(pEarth.GetPtr());
SmartPtr<CObjectX> pMoon = new CObjectX(
L"moon",
pEarth->s + d_moon * DirXY(0),
pEarth->v + v_moon * DirXY(-PI/2),
m_moon,
2,
0xFFFF00);
AllObjects.push_back(pMoon.GetPtr());
AllObjects.push_back(TAKAKU_NEW(CObjectX,
L"tmp",
pEarth->s + 8000 * DirXY(0),
pEarth->v + 9.91 * DirXY(-PI/2),
10.0,
1,
0x00FF00).GetPtr());
SmartPtr<CObjectX> pMars = new CObjectX(
L"mars",
pSun->s + d_mars * DirXY(0),
pSun->v + v_mars * DirXY(-PI/2),
m_mars,
5,
0xFF0000);
AllObjects.push_back(pMars.GetPtr());
return;
const int N = 4;
for (int i=-N; i<=N; i++)
for (int j=-N; j<=N; j++)
for (int k=-N; k<N; k++)
AllObjects.push_back(new /*CElecObjectX*/CObjectX(
L"",
R3(j * KmPerAU / 1, i * KmPerAU / 1, k * KmPerAU / 1),
R3(),
m_sun,
/*1e28 * (rand()%2 == 0 ? -1 : 1),*/
1,
0xFFFFFF));
/*
R tmp = atan(2.0) - PI / 4;
AllObjects.push_back(new CObjectX(
L"A",
R3(0.0, d_earth),
sqrt(2.0 / sqrt(5.0/2.0)) * v_earth * R3(cos(PI+tmp), sin(PI+tmp)),
m_sun,
5,
0xFFFFFF));
AllObjects.push_back(new CObjectX(
L"B",
R3(d_earth, 0.0),
R3(0.0, sqrt(2.0) * v_earth),
m_sun,
5,
0xFFFFFF));
AllObjects.push_back(new CObjectX(
L"C",
R3(0.0, - d_earth),
sqrt(2.0 / sqrt(5.0/2.0)) * v_earth * R3(cos(-tmp), sin(-tmp)),
m_sun,
5,
0xFFFFFF));
*/
//::GetPrivateProfileIntW();
//::GetPrivateProfileStringW();
//::GetPrivateProfileSectionW();
//::GetPrivateProfileSectionNamesW();
}
void UpdateLogic()
{
dt = dTimeLogic * TimeZoom;
for (int i=0; i<AllObjects.size(); i++)
AllObjects->Update();
}
void FlushLogic()
{
t += dt;
//for (int i=0; i<AllObjects.size(); i++)
// AllObjects->Flush();
}
R FovDeg = 75.0;
int Stands = -1, Looks = -1;
R3 ChildCamPos = ChildCamPos0, ChildCamFront = ChildCamFront0, ChildCamUp = ChildCamUp0;
void Init()
{
G::Form1 = gcnew Form1();
G::Form1->Show();
PresentParameters ^pp = gcnew PresentParameters();
pp->Windowed = true;
pp->SwapEffect = SwapEffect::Copy;
pp->BackBufferCount = 1;
pp->BackBufferWidth = 800;
pp->BackBufferHeight = 600;
pp->AutoDepthStencilFormat = DepthFormat::D32;
pp->DeviceWindow = G::Form1->pictureBox1;
G::Dev = gcnew Device(0, DeviceType::Hardware, G::Form1->pictureBox1, CreateFlags::HardwareVertexProcessing,
gcnew array<PresentParameters^> { pp });
G::RT = gcnew Texture(G::Dev, 800, 600, 0, Usage::RenderTarget, Format::X8R8G8B8, Pool::Default);
G::VBRT = gcnew VertexBuffer(VertRT::typeid, 4, G::Dev, Usage::None,
VertexFormats::PositionW | VertexFormats::Texture1,
Pool::Managed);
G::VBRT->SetData(
gcnew array<VertRT>(4) {
VertRT(Vector2(0, 0), 0, Vector2(0, 0)),
VertRT(Vector2(800.0f, 0), 0, Vector2(1.0f, 0)),
VertRT(Vector2(0, 600.0f), 0, Vector2(0, 1.0f)),
VertRT(Vector2(800.0f, 600.0f), 0, Vector2(1.0f, 1.0f)), },
0,
LockFlags::Discard);
G::VBLocus = gcnew VertexBuffer(VertLocus::typeid, 1, G::Dev, Usage::None,
VertexFormats::Position | VertexFormats::Diffuse | VertexFormats::PointSize,
Pool::Managed);
G::VBLocus->SetData(gcnew VertObject(Vector3()/*, 1.0f, 0xFF000000*/), 0, LockFlags::Discard);
G::VBAxises = gcnew VertexBuffer(VertAxis::typeid, 6, G::Dev, Usage::None,
VertexFormats::Position | VertexFormats::Diffuse,
Pool::Managed);
G::VBAxises->SetData(
gcnew array<VertAxis>(6) {
VertAxis(Vector3(-100 * KmPerAU, 0, 0), 0xFFFF0000),
VertAxis(Vector3(100 * KmPerAU, 0, 0), 0xFFFF0000),
VertAxis(Vector3(0, -100 * KmPerAU, 0), 0xFF00FF00),
VertAxis(Vector3(0, 100 * KmPerAU, 0), 0xFF00FF00),
VertAxis(Vector3(0, 0, -100 * KmPerAU), 0xFF0000FF),
VertAxis(Vector3(0, 0, 100 * KmPerAU), 0xFF0000FF), },
0,
LockFlags::Discard);
InitLogic();
G::VBObject = gcnew VertexBuffer(VertObject::typeid, 1, G::Dev, Usage::None, VertexFormats::Position, Pool::Managed);
G::VBObject->SetData(
gcnew array<VertObject>(6) {
VertObject(Vector3(0, 1, 0)),
VertObject(Vector3(1, 0, 0)),
VertObject(Vector3(0, 0, 1)),
VertObject(Vector3(-1, 0, 0)),
VertObject(Vector3(0, 0, -1)),
VertObject(Vector3(0, -1, 0)),},
0,
LockFlags::Discard);
G::IBObject = gcnew IndexBuffer(Int16::typeid, 24, G::Dev, Usage::None, Pool::Managed);
/*G::IBRT->SetData(
gcnew array<Int16>(24){
0,1,2, 5,2,1,
0,2,3, 5,3,2,
0,3,4, 5,4,3,
0,4,1, 5,1,4
},
0, LockFlags::Discard);*/
}
void RenderObjects(bool bLocus)
{
for (int i = 0; i < AllObjects.size(); i++)
{
G::Dev->Transform->World = DXMatrix::Translation(Vector3(DE_R3(AllObjects->s)));
if (bLocus)
{
G::Dev->Material.Diffuse = Color::FromArgb(0xFF | dynamic_cast<CObjectX *>(AllObjects.GetPtr())->color);
G::Dev->RenderState->DiffuseMaterialSource = ColorSource::Material;
}
if (bLocus)
{
G::Dev->SetStreamSource(0, G::VBLocus, 0);
G::Dev->VertexFormat = G::VBLocus->Description.VertexFormat;
G::Dev->DrawPrimitives(PrimitiveType::PointList, 0, 1);
}
else
{
G::Dev->SetStreamSource(0, G::VBObject, 0);
G::Dev->Indices = G::IBObject;
G::Dev->VertexFormat = G::VBObject->Description.VertexFormat;
G::Dev->DrawIndexedPrimitives(PrimitiveType::TriangleList, 0, 0, 24, 0, 8);
}
if (bLocus)
{
G::Dev->RenderState->DiffuseMaterialSource = ColorSource::Color1;
}
}
}
void UpdateShell()
{
G::Dev->RenderState->CullMode = Cull::None;
G::Dev->RenderState->Lighting = false;
G::Dev->RenderState->DiffuseMaterialSource = ColorSource::Color1;
G::Dev->Clear(ClearFlags::Target, 0, 0, 0);
G::Dev->BeginScene();
G::Dev->Transform->View = DXMatrix::LookAtLH(ToDXVec(CamPos()), ToDXVec(CamPos() + CamFront()), ToDXVec(CamUp()));
G::Dev->Transform->Projection = DXMatrix::PerspectiveFovLH(Fov(), 4.0f / 3, KmPerAU / 50, KmPerAU * 200);
G::Dev->SetRenderTarget(0, G::RT->GetSurfaceLevel(0));
RenderObjects(true);
G::Dev->SetRenderTarget(0, G::Dev->GetBackBuffer(0, 0, BackBufferType::Mono));
//G::Dev->TextureState[0]
G::Dev->SetStreamSource(0, G::VBRT, 0);
G::Dev->VertexFormat = G::VBRT->Description.VertexFormat;
G::Dev->DrawPrimitives(PrimitiveType::TriangleFan, 0, 2);
RenderObjects(false);
G::Dev->Transform->World = DXMatrix::Identity;
G::Dev->SetStreamSource(0, G::VBAxises, 0);
G::Dev->VertexFormat = G::VBAxises->Description.VertexFormat;
G::Dev->DrawPrimitives(PrimitiveType::LineList, 0, 3);
G::Dev->EndScene();
G::Dev->Present();
G::Form1->uiLooks->Text = Looks.ToString();
G::Form1->uiStands->Text = Stands.ToString();
G::Form1->uiFov->Text = FovDeg.ToString();
G::Form1->uiTimeZoom->Text = TimeZoom.ToString();
G::Form1->uiInfo->Text = "Kernel FPS: " + FpsLogic() + "\r\n"
+ "Shell FPS: " + FpsShell();
}
void Destroy()
{
}
}
using namespace Test03;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// メイン ウィンドウを作成して、実行します
//Application::Run(gcnew Form1());
Init();
while (G::Form1->Visible)
{
Application::DoEvents();
const int N = 1;
static int t1 = timeGetTime();
int t2 = timeGetTime();
if (t2 - t1 < 1)
{
while (t2 - t1 < 1)
{
::Sleep(1);
t2 = timeGetTime();
}
}
dTimeShell = MIN(t2-t1, 100) / 1000.0;
dTimeLogic = dTimeShell / N;
t1 = t2;
for (int i=0; i<N; i++)
{
UpdateLogic();
}
UpdateShell();
}
Destroy();
return 0;
}
|
|