Videos
Unity Video (2mb)
Unity Video - Newton (1mb)
Note: Since fraps is evil it reduced the FPS to around 20-30 fps. The Newton video was speeded up by 2x to compensate for fraps evilness.
Moderator: Alain
Procedure Newton_Object_Process(Self : PBSPEntity); cdecl;
begin
Self.HasMass := True;
CreateNewtonObjectEntity(Self,False,False,True,False);
end;
Procedure CreateNewtonObjectEntity(Self : PBSPEntity; Const NoGrav,NoCollision,Strip,CollisionTree : Boolean);
begin
Self.NewtonIndex := -1;
If not (copy(Self.model,1,1) = '*') then exit;
Self.mid := strtoint(copy(Self.model,2,length(Self.model)));
If (Self.mid < 0) or (Self.mid > Engine.Map.BSP.numOfModels-1) then exit;
Inc(Engine.Map.BSP.numOfNewtonObjects);
SetLength(Engine.Map.BSP.Data.NewtonObjects,Engine.Map.BSP.numOfNewtonObjects);
Self.NewtonIndex := Engine.Map.BSP.numOfNewtonObjects-1;
If not Self.HasMass then
Self.Mass := 0
else
If Self.Mass = 0 then
Self.Mass := 100;
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1] := TNewtonObject.Create;
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].EntityIndex := Self.EntityIndex;
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].Mass := Self.Mass;
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].ClassType := FindEntityTypeId(Self.Classname);
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].model := Self.mid;
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].Origin := Engine.Map.BSP.StripOriginFromModel(Self.mid,Strip);
If Self.OriginUsed then
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].Origin := AddVector(Self.Origin,Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].Origin);
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].NoGrav := NoGrav;
Engine.Map.BSP.Data.NewtonObjects[Engine.Map.BSP.numOfNewtonObjects-1].NoCollision := NoCollision;
If not CollisionTree then
CreateNewtonObject(Engine.Map.BSP,Self.mid,False,Engine.Map.BSP.numOfNewtonObjects-1,Self.Angles)
else
CreateNewtonObject2(Engine.Map.BSP,Self.mid,False,Engine.Map.BSP.numOfNewtonObjects-1,Self.Angles);
end;
Procedure CreateNewtonObject(var pSceneBSP : TBSPMap; const ModelId : Integer; IsDNDMesh : Boolean; NewtonObjectId : Integer; Angles : TVector3f);
var
Collider : PNewtonCollision;
Mass : Single;
Inertia,Size : TVector3f;
M : TMatrix4f;
begin
If IsDNDMesh then
// Collider := CreateConvexHullFromModel_DNDMesh(pSceneBSP,ModelId)
else
Collider := CreateConvexHullFromModel(pSceneBSP,ModelId);
pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body := NewtonCreateBody(Engine.Newton.NewtonWorld, Collider);
If IsDNDMesh then
//Size := SubtractVector(pSceneBSP.DNDMeshs[ModelId].Header.max,pSceneBSP.DNDMeshs[ModelId].Header.min)
else
Size := SubtractVector(pSceneBSP.Data.Models[ModelId].max,pSceneBSP.Data.Models[ModelId].min);
Size := DivVector2(Size,2);
// Calculate real moment of inertia
Mass := pSceneBSP.Data.NewtonObjects[NewtonObjectId].Mass;
Inertia := V3(Mass * (Size.X * Size.Y + Size.X * Size.Z) / 12,
Mass * (Size.Y * Size.X + Size.Y * Size.Z) / 12,
Mass * (Size.Z * Size.X + Size.Z * Size.Y) / 12);
pSceneBSP.Data.NewtonObjects[NewtonObjectId].Inertia := Inertia;
NewtonBodySetMassMatrix(pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body, Mass, Inertia.X, Inertia.Y, Inertia.Z);
Matrix_SetIdentity(M);
// Set spawn position
Matrix_SetTransform(M, pSceneBSP.Data.NewtonObjects[NewtonObjectId].Origin);
// Some orientation
Matrix_SetRotation(M, Angles);
NewtonBodySetMatrix(pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body, @M[0,0]);
pSceneBSP.Data.NewtonObjects[NewtonObjectId].Matrix := M;
// Set callbacks
NewtonBodySetMaterialGroupID(pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body, Engine.Newton.MatWater);
NewtonBodySetForceAndTorqueCallBack(pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body, PhysicsApplyGravityForce);
NewtonBodySetTransformCallBack(pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body, PhysicsSetTransformNewtonObject);
NewtonReleaseCollision(Engine.Newton.NewtonWorld, Collider);
NewtonBodySetUserData(pSceneBSP.Data.NewtonObjects[NewtonObjectId].Body, pSceneBSP.Data.NewtonObjects[NewtonObjectId]);
end;
// Create a Convex Hull for a model (not the world model)
Function CreateConvexHullFromModel(const pSceneBSP : TBSPMap; ModelID : Integer) : PNewtonCollision;
var
TmpFace : array [0..2] of TVector3f;
TmpFaceNo : Integer;
TmpM : TMatrix4f;
Min : TVector3f;
Max : TVector3f;
m,f,c : Integer;
begin
c := 0;
if pSceneBSP.numOfFaces > 0 then
for f := pSceneBSP.data.Models[ModelID].faceIndex to pSceneBSP.data.Models[ModelID].faceIndex+pSceneBSP.data.Models[ModelID].numOfFaces-1 do
If pSceneBSP.data.Faces[f].FaceType = 1 then
If pSceneBSP.data.Faces[f].numMeshVerts > 0 then
begin
for m := 0 to pSceneBSP.data.Faces[f].numMeshVerts-1 do
begin
inputBuffer[c] := pSceneBSP.data.Vertices[pSceneBSP.data.Faces[f].startVertIndex+pSceneBSP.data.MeshVertices[pSceneBSP.data.Faces[f].meshVertIndex+m]];
inc(c);
end;
end;
Result := NewtonCreateConvexHull(Engine.Newton.NewtonWorld,c,@inputBuffer[0].Position.x,SizeOf(TRBSPVertex),Nil);
end;
// Below is the force n torq thingy the Newton_Object uses
procedure Default_Newton_Process(NewtonObject : PNewtonObject; Matrix : TMatrix4f; Mass,Ixx,Iyy,Izz : Single); cdecl;
Var
Force : TVector3f;
begin
if Engine.Map.BSP.IsInWater(SetVector(Matrix[3,0],Matrix[3,1],Matrix[3,2])) then
begin
// Body is in fluid, so we add buoyancy forces
Force := SetVector(0, -0.17, 0);
NewtonBodyAddBuoyancyForce(NewtonObject.Body, 0.1, 0.9, 0.9, @Force, GetBuoyancyPlane, nil);
// When in a fluid, we don't want our body to get autofreezed
NewtonBodySetAutoFreeze(NewtonObject.Body, 0);
end
else
begin
// Body is not in fluid, so just apply normal gravity
Force := SetVector(0, Mass * -Engine.Newton.GravValue, 0);
NewtonBodySetForce(NewtonObject.Body, @Force);
// When outside the fluid, we can use the autofreezing feature of newton
NewtonBodySetAutoFreeze(NewtonObject.Body, 0);
end;
end;
//Gravity value
Engine.Newton.GravValue := 19.8;
I see lot of potencial in you engine.
Users browsing this forum: No registered users and 29 guests