Merge branch 'develop' into modnark

This commit is contained in:
Modnark
2022-10-07 17:15:13 -04:00
24 changed files with 1027700 additions and 87 deletions

View File

@@ -117,10 +117,8 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti
quit=false;
rightButtonHolding=false;
mouseOnScreen=false;
// GApp replacement
renderDevice = new RenderDevice();
if (window != NULL) {
renderDevice->init(window, NULL);
}
@@ -196,7 +194,6 @@ void Application::onInit() {
_dataModel->setName("undefined");
_dataModel->font = g_fntdominant;
g_dataModel = _dataModel;
_hideSky = false;
#ifdef LEGACY_LOAD_G3DFUN_LEVEL
// Anchored this baseplate for XplicitNgine tests
@@ -334,7 +331,7 @@ void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) {
for(size_t i = 0; i < _dataModel->getWorkspace()->partObjects.size(); i++)
{
PartInstance* partInstance = _dataModel->getWorkspace()->partObjects[i];
if(partInstance->getPosition().y < -500)
if(partInstance->getPosition().y < -255)
{
toDelete.push_back(partInstance);
}
@@ -345,7 +342,8 @@ void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) {
{
PartInstance * p = toDelete.back();
toDelete.pop_back();
g_dataModel->getSelectionService()->removeSelected(p);
if(g_dataModel->getSelectionService()->isSelected(p))
g_dataModel->getSelectionService()->removeSelected(p);
p->setParent(NULL);
delete p;
}
@@ -506,6 +504,9 @@ void Application::exitApplication()
//endProgram = true;
}
void Application::onGraphics(RenderDevice* rd) {
G3D::uint8 num = 0;
@@ -514,17 +515,27 @@ void Application::onGraphics(RenderDevice* rd) {
if (GetCursorPos(&mousepos))
{
POINT pointm = mousepos;
if (ScreenToClient(_hWndMain, &mousepos))
if (ScreenToClient(_hWndMain, &mousepos))
{
//mouseOnScreen = true;
//POINT pointm;
///GetCursorPos(&pointm);
if(_hwndRenderer != WindowFromPoint(pointm)) //OLD: mousepos.x < 1 || mousepos.y < 1 || mousepos.x >= rd->getViewport().width()-1 || mousepos.y >= rd->getViewport().height()-1
{
if(_hwndRenderer != WindowFromPoint(pointm))
{
mouseOnScreen = false;
}
else
{
mouseOnScreen = true;
}
mouseOnScreen = false;
//ShowCursor(true);
//_window->setMouseVisible(true);
//rd->window()->setInputCaptureCount(0);
}
else
{
mouseOnScreen = true;
//SetCursor(NULL);
//_window->setMouseVisible(false);
//rd->window()->setInputCaptureCount(1);
}
}
}
if(Globals::useMousePoint)
@@ -537,18 +548,14 @@ void Application::onGraphics(RenderDevice* rd) {
lighting.ambient = Color3(0.6F,0.6F,0.6F);
renderDevice->setProjectionAndCameraMatrix(*cameraController.getCamera());
// TODO: stick this into its own rendering thing
if(!_hideSky) {
renderDevice->clear(sky.isNull(), true, true);
if (sky.notNull()) sky->render(renderDevice, lighting);
} else {
printf("ThumbnailGenerator::click\n");
rd->setColorClearValue(Color4(0.0f, 0.0f, 0.0f, 0.0f));
renderDevice->clear(true, true, true);
toggleSky();
}
// Cyan background
//renderDevice->setColorClearValue(Color3(0.0f, 0.5f, 1.0f));
renderDevice->clear(sky.isNull(), true, true);
if (sky.notNull()) {
sky->render(renderDevice, lighting);
}
// Setup lighting
renderDevice->enableLighting();
@@ -558,47 +565,115 @@ void Application::onGraphics(RenderDevice* rd) {
renderDevice->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor, true, true));
renderDevice->setAmbientLightColor(lighting.ambient);
renderDevice->setShininess(70);
renderDevice->setSpecularCoefficient(Color3(0.1F, 0.1F, 0.1F));
//renderDevice->setBlendFunc(RenderDevice::BLEND_ONE, RenderDevice::BLEND_ONE);
//renderDevice->setShininess(70);
//renderDevice->setSpecularCoefficient(Color3(0.1F, 0.1F, 0.1F));
//float lightAmbient[] = { 0.5F, 0.5F, 0.5F, 1.0F };
//float lightDiffuse[] = { 0.6F, 0.6F, 0.6F, 1.0F };
//float lightSpecular[] = { 0.8F, 0.8F, 0.8F, 1.0F };
//glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, lightAmbient);
//glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, lightDiffuse);
//glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, lightSpecular);
//glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 70);
rd->beforePrimitive();
CoordinateFrame forDraw = rd->getObjectToWorldMatrix();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
//if(_dataModel->getWorkspace() != NULL)
_dataModel->getWorkspace()->render(rd);
//else throw std::exception("Workspace not found");
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
rd->setObjectToWorldMatrix(forDraw);
rd->afterPrimitive();
//Draw::box(G3D::Box(mouse.getPosition()-Vector3(2,0.5F,1),mouse.getPosition()+Vector3(2,0.5F,1)), rd, Color3::cyan(), Color4::clear());
for(size_t i = 0; i < _dataModel->getSelectionService()->getSelection().size(); i++)
{
if(PartInstance* part = dynamic_cast<PartInstance*>(g_dataModel->getSelectionService()->getSelection()[i]))
{
Vector3 size = part->getSize();
Vector3 pos = part->getPosition();
drawOutline(
Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2),
Vector3(0-size.x/2,0-size.y/2,0-size.z/2),
rd,
lighting,
Vector3(size.x/2, size.y/2, size.z/2),
Vector3(pos.x, pos.y, pos.z), part->getCFrame()
);
Vector3 size = part->getSize();
Vector3 pos = part->getPosition();
drawOutline(Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2) ,Vector3(0-size.x/2,0-size.y/2,0-size.z/2), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x, pos.y, pos.z), part->getCFrame());
}
}
//Vector3 gamepoint = Vector3(0, 5, 0);
//Vector3 camerapoint = rd->getCameraToWorldMatrix().translation;
//float distance = pow(pow((double)gamepoint.x - (double)camerapoint.x, 2) + pow((double)gamepoint.y - (double)camerapoint.y, 2) + pow((double)gamepoint.z - (double)camerapoint.z, 2), 0.5);
//if(distance < 50 && distance > -50)
//{
// if(distance < 0)
// distance = distance*-1;
// fntdominant->draw3D(rd, "Testing", CoordinateFrame(rd->getCameraToWorldMatrix().rotation, gamepoint), 0.04*distance, Color3::yellow(), Color3::black(), G3D::GFont::XALIGN_CENTER, G3D::GFont::YALIGN_CENTER);
//}
renderDevice->disableLighting();
if (sky.notNull()) {
sky->renderLensFlare(renderDevice, lighting);
}
renderDevice->push2D();
_dataModel->getGuiRoot()->renderGUI(renderDevice, m_graphicsWatch.FPS());
/*rd->pushState();
rd->beforePrimitive();
if(Globals::showMouse && mouseOnScreen)
{
glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);// you enable blending function
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/*
std::vector<Instance*> instances = _dataModel->getWorkspace()->getAllChildren();
currentcursorid = cursorid;
for(size_t i = 0; i < instances.size(); i++)
{
if(PartInstance* test = dynamic_cast<PartInstance*>(instances.at(i)))
{
float time = cameraController.getCamera()->worldRay(_dataModel->mousex, _dataModel->mousey, renderDevice->getViewport()).intersectionTime(test->getBox());
//float time = testRay.intersectionTime(test->getBox());
if (time != inf())
{
currentcursorid = cursorOvrid;
break;
}
}
}
*/
/*glBindTexture( GL_TEXTURE_2D, tool->getCursorId());
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0);
glVertex2f(mousepos.x-64, mousepos.y-64);
glTexCoord2d( 1.0,0.0 );
glVertex2f(mousepos.x+64, mousepos.y-64);
glTexCoord2d(1.0,1.0 );
glVertex2f(mousepos.x+64, mousepos.y+64 );
glTexCoord2d( 0.0,1.0 );
glVertex2f( mousepos.x-64, mousepos.y+64 );
glEnd();
glDisable( GL_TEXTURE_2D );*/
//}
/*rd->afterPrimitive();
rd->popState();*/
renderDevice->pop2D();
}
@@ -635,16 +710,6 @@ G3D::RenderDevice* Application::getRenderDevice()
return renderDevice;
}
G3D::SkyRef Application::getSky()
{
return sky;
}
void Application::toggleSky()
{
_hideSky = !_hideSky;
}
void Application::onMouseLeftUp(G3D::RenderDevice* renderDevice, int x, int y)
{
_dataModel->getGuiRoot()->onMouseLeftUp(renderDevice, x, y);
@@ -667,6 +732,7 @@ void Application::onMouseMoved(int x,int y)
mouse.oldy = mouse.y;
mouse.x = x;
mouse.y = y;
//tool->onMouseMoved(mouse);
mouseMoveState = true;
}
@@ -746,6 +812,8 @@ void Application::run() {
RealTime rdt = timeStep;
SimTime sdt = timeStep * rate;
SimTime idt = desiredFrameDuration * rate;
onSimulation(rdt,sdt,idt);
m_simulationWatch.tock();

View File

@@ -218,7 +218,7 @@ void LevelInstance::Step(SimTime sdt)
score -= 1;
break;
}
if (timer >= 0.1f){ //Due to timing used this could cause the number go into negatives for one step
if (timer >= sdt){
timer -= sdt;
}
else{

View File

@@ -14,6 +14,7 @@ PartInstance::PartInstance(void)
className = "Part";
canCollide = true;
anchored = false;
dragging = false;
size = Vector3(2,1,4);
setCFrame(CoordinateFrame(Vector3(0,0,0)));
color = Color3::gray();
@@ -28,6 +29,20 @@ PartInstance::PartInstance(void)
shape = Enum::Shape::Block;
}
bool PartInstance::isDragging()
{
return dragging;
}
void PartInstance::setDragging(bool value)
{
if (dragging != value)
{
dragging = value;
g_dataModel->getEngine()->resetBody(this);
}
}
float PartInstance::getMass()
{
if(shape == Enum::Shape::Block)
@@ -117,7 +132,10 @@ void PartInstance::setSurface(int face, Enum::SurfaceType::Value surface)
void PartInstance::setParent(Instance* prnt)
{
g_dataModel->getEngine()->deleteBody(this);
if(this->physBody != NULL)
{
g_dataModel->getEngine()->deleteBody(this);
}
Instance * cparent = getParent();
while(cparent != NULL)
{
@@ -202,8 +220,8 @@ void PartInstance::setSize(Vector3 newSize)
size = Vector3(sizex, sizey, sizez);
g_dataModel->getEngine()->deleteBody(this);
g_dataModel->getEngine()->createBody(this);
if(this->physBody != NULL)
g_dataModel->getEngine()->resetBody(this);
}
Vector3 PartInstance::getSize()
{
@@ -224,8 +242,9 @@ void PartInstance::setShape(Enum::Shape::Value shape)
this->shape = shape;
this->setSize(this->getSize());
}
g_dataModel->getEngine()->deleteBody(this);
g_dataModel->getEngine()->createBody(this);
if(this->physBody != NULL)
g_dataModel->getEngine()->resetBody(this);
changed = true;
}
@@ -235,17 +254,14 @@ void PartInstance::setPosition(Vector3 pos)
setCFrame(CoordinateFrame(cFrame.rotation, pos));
if (anchored)
{
g_dataModel->getEngine()->deleteBody(this);
g_dataModel->getEngine()->createBody(this);
}
g_dataModel->getEngine()->resetBody(this);
}
void PartInstance::setAnchored(bool anchored)
{
this->anchored = anchored;
g_dataModel->getEngine()->deleteBody(this);
g_dataModel->getEngine()->createBody(this);
if(this->physBody != NULL)
g_dataModel->getEngine()->resetBody(this);
}
bool PartInstance::isAnchored()
@@ -260,8 +276,8 @@ CoordinateFrame PartInstance::getCFrame()
}
void PartInstance::setCFrame(CoordinateFrame coordinateFrame)
{
g_dataModel->getEngine()->updateBody(this, &coordinateFrame);
setCFrameNoSync(coordinateFrame);
g_dataModel->getEngine()->updateBody(this);
}
void PartInstance::setCFrameNoSync(CoordinateFrame coordinateFrame)

View File

@@ -39,6 +39,14 @@ void ArrowTool::onButton1MouseUp(Mouse mouse)
{
mouseDown = false;
dragging = false;
for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) //This will later decide primary and move all parts according to primary
{
if(PartInstance * part = dynamic_cast<PartInstance *>(g_dataModel->getSelectionService()->getSelection()[i]))
{
part->setDragging(false);
}
}
}
void ArrowTool::onMouseMoved(Mouse mouse)
@@ -88,7 +96,8 @@ void ArrowTool::onMouseMoved(Mouse mouse)
roundDeg(rotEulerAngles.z);
rot = rot.fromEulerAnglesXYZ( rotEulerAngles.x * (M_PI / 180), rotEulerAngles.y * (M_PI / 180), rotEulerAngles.z * (M_PI / 180) );
part->setDragging(true);
part->setPosition(vec);
part->setCFrame(CoordinateFrame(rot, vec));
}

View File

@@ -1,17 +1,26 @@
#include "XplicitNgine/XplicitNgine.h"
#include "Globals.h"
//#define SIDE (0.5f)
//#define MASS (1.0)
// constraints
//#define MAX_BODIES 65535
//#define OBJ_DENSITY (5.0)
//#define MAX_CONTACT_PER_BODY 4
XplicitNgine::XplicitNgine()
{
physWorld = dWorldCreate();
physSpace = dHashSpaceCreate(0);
contactgroup = dJointGroupCreate(0);
dWorldSetGravity(physWorld, 0, -9.8, 0);
dWorldSetGravity(physWorld, 0, -9.8F, 0);
dWorldSetAutoDisableFlag(physWorld, 1);
dWorldSetAutoDisableLinearThreshold(physWorld, 0.05F);
dWorldSetAutoDisableAngularThreshold(physWorld, 0.05F);
dWorldSetAutoDisableSteps(physWorld, 400);
dWorldSetAutoDisableLinearThreshold(physWorld, 0.5F);
dWorldSetAutoDisableAngularThreshold(physWorld, 0.5F);
dWorldSetAutoDisableSteps(physWorld, 20);
this->name = "PhysicsService";
//dGeomID ground_geom = dCreatePlane(physSpace, 0, 1, 0, 0);
@@ -25,12 +34,19 @@ XplicitNgine::~XplicitNgine()
dCloseODE();
}
void XplicitNgine::resetBody(PartInstance* partInstance)
{
deleteBody(partInstance);
createBody(partInstance);
}
void collisionCallback(void *data, dGeomID o1, dGeomID o2)
{
int i,n;
dBodyID b1 = dGeomGetBody(o1);
dBodyID b2 = dGeomGetBody(o2);
if (b1 && b2 && dAreConnected(b1, b2))
return;
@@ -44,7 +60,7 @@ void collisionCallback(void *data, dGeomID o1, dGeomID o2)
// Define contact surface properties
contact[i].surface.bounce = 0.5; //Elasticity
contact[i].surface.mu = 0.3F; //Friction
contact[i].surface.mu = 0.4F; //Friction
contact[i].surface.slip1 = 0.0;
contact[i].surface.slip2 = 0.0;
contact[i].surface.soft_erp = 0.8F;
@@ -68,8 +84,14 @@ void XplicitNgine::deleteBody(PartInstance* partInstance)
{
dBodyEnable(partInstance->physBody);
dGeomEnable(partInstance->physGeom[0]);
//createBody(partInstance);
//step(0.5F);
if(partInstance->isAnchored() || partInstance->isDragging())
{
dGeomSetBody(partInstance->physGeom[0], partInstance->physBody);
dGeomEnable(partInstance->physGeom[0]);
updateBody(partInstance);
step(0.03F);
}
for(int i = 0; i < dBodyGetNumJoints(partInstance->physBody); i++) {
dBodyID b1 = dJointGetBody(dBodyGetJoint(partInstance->physBody, i), 0);
dBodyID b2 = dJointGetBody(dBodyGetJoint(partInstance->physBody, i), 1);
@@ -102,10 +124,13 @@ void XplicitNgine::createBody(PartInstance* partInstance)
// calculate collisions
//dSpaceCollide (physSpace,0,&collisionCallback);
Vector3 partSize = partInstance->getSize();
Vector3 partPosition = partInstance->getPosition();
if(partInstance->physBody == NULL)
{
Vector3 partSize = partInstance->getSize();
Vector3 partPosition = partInstance->getPosition();
Vector3 velocity = partInstance->getVelocity();
Vector3 rotVelocity = partInstance->getRotVelocity();
// init body
partInstance->physBody = dBodyCreate(physWorld);
dBodySetData(partInstance->physBody, partInstance);
@@ -152,22 +177,30 @@ void XplicitNgine::createBody(PartInstance* partInstance)
partPosition.y,
partPosition.z);
dBodySetLinearVel(partInstance->physBody, velocity.x, velocity.y, velocity.z);
dBodySetAngularVel(partInstance->physBody, rotVelocity.x, rotVelocity.y, rotVelocity.z);
Matrix3 g3dRot = partInstance->getCFrame().rotation;
float rotation [12] = { g3dRot[0][0], g3dRot[0][1], g3dRot[0][2], 0,
g3dRot[1][0], g3dRot[1][1], g3dRot[1][2], 0,
g3dRot[2][0], g3dRot[2][1], g3dRot[2][2], 0};
dGeomSetRotation(partInstance->physGeom[0], rotation);
dBodySetRotation(partInstance->physBody, rotation);
//printf("[XplicitNgine] Created Body for PartInstance\n");
if(!partInstance->isAnchored())
if(!partInstance->isAnchored() && !partInstance->isDragging())
dGeomSetBody(partInstance->physGeom[0], partInstance->physBody);
} else {
if(!partInstance->isAnchored())
if(!partInstance->isAnchored() && !partInstance->isDragging())
{
const dReal* velocity = dBodyGetLinearVel(partInstance->physBody);
const dReal* rotVelocity = dBodyGetAngularVel(partInstance->physBody);
partInstance->setVelocity(Vector3(velocity[0],velocity[1],velocity[2]));
partInstance->setRotVelocity(Vector3(rotVelocity[0],rotVelocity[1],rotVelocity[2]));
const dReal* physPosition = dBodyGetPosition(partInstance->physBody);
// TODO: Rotation code
@@ -195,11 +228,11 @@ void XplicitNgine::step(float stepSize)
//dWorldStep(physWorld, stepSize);
}
void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFrame)
void XplicitNgine::updateBody(PartInstance *partInstance)
{
if(partInstance->physBody != NULL)
{
Vector3 position = cFrame->translation;
Vector3 position = partInstance->getCFrame().translation;
dBodySetPosition(partInstance->physBody,
position[0],
@@ -209,7 +242,7 @@ void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFra
dBodyEnable(partInstance->physBody);
dGeomEnable(partInstance->physGeom[0]);
Matrix3 g3dRot = cFrame->rotation;
Matrix3 g3dRot = partInstance->getCFrame().rotation;
float rotation [12] = { g3dRot[0][0], g3dRot[0][1], g3dRot[0][2], 0,
g3dRot[1][0], g3dRot[1][1], g3dRot[1][2], 0,
g3dRot[2][0], g3dRot[2][1], g3dRot[2][2], 0};

View File

@@ -3917,7 +3917,7 @@ static BOOL Grid_OnGetSel(INT iItem)
static VOID Grid_OnResetContent(VOID)
{
ListBox_ResetContent(g_lpInst->hwndListMap);
g_lpInst->lpCurrent = NULL;
if (NULL != g_lpInst->hwndCtl1)
{
DestroyWindow(g_lpInst->hwndCtl1);