예제 #1
0
파일: main.go 프로젝트: rolfrm/boxworld
func testbox3(position Vec3) *GameObj {

	body := NewGameObj(position, Vec3{1, 1, 1}, Vec3{0, 0, 1}, 84, 0, nil)
	//body2 := NewGameObj(Vec3{0,2,0},Vec3{1,1,1},Vec3{1,0,0},1,0,body)
	//	body.Constraints = []Constraint{ObjectConstraint{body,body2,Vec3{0,4,0},100,40}}
	glfw.AddListener(func(keyev glfw.KeyEvent) {

	})
	return body
}
예제 #2
0
파일: main.go 프로젝트: rolfrm/boxworld
func main() {
	//ABSPTest()
	//return
	glfw.Init(800, 600)
	InitPhysics()

	world := new(World)
	world.Init()
	world.GameObjects = new(list.List)
	player := MakeMan(Vec3{10, 20, 10})

	world.Add(player)
	world.Add(ropetest(Vec3{0, 40, 0}, 4, 4))
	world.Add(treeThing(Vec3{20, 20, 20}, 3))
	world.Add(MakePlayer(Vec3{-20, 20, 0}).Body)
	world.Add(MakePlayer(Vec3{-20, 50, 0}).Body)

	world.Add(MakePlayer(Vec3{-20, 70, 0}).Body)
	world.Add(MakePlayer(Vec3{-20, 90, 0}).Body)
	world.Add(MakePlayer(Vec3{-20, 110, 0}).Body)
	/*for i := 0; i < 100; i++ {
		world.Add(SetPlayerAnimation(MakePlayer(Vec3{float32(int(i%10))*50,0,float32(i*2) - 200})).Body)
	}*/
	world.Add(NewGameObj(Vec3{0, -20, 0}, Vec3{10000, 10, 10000}, Vec3{0, 0.5, 0.1}, float32(math.Inf(1)), 10, nil))

	//world.Add(SetPlayerAnimation(MakePlayer(Vec3{-20,120,0})).Body)

	qtn := new(ABSPNode)
	qtn.Root = qtn
	//qtn.Position = Vec3{-10000,-10000,-10000}
	//qtn.Size = Vec3{20000,20000,20000}
	for i := world.GameObjects.Front(); i != nil; i = i.Next() {
		gobj := i.Value.(*GameObj)
		all := gobj.GetSubs()
		for i := 0; i < len(all); i++ {
			qtn.Insert(all[i])
		}
	}
	world.GameObjectTree = qtn
	fmt.Println("Total:", len(qtn.Data))
	qtn.Divide()
	cols := 0
	qtn.cd(func(obj1, obj2 SPData) {
		cols += 1
	})
	fmt.Println(cols)
	//qtn.Traverse(0)
	//return
	gl.Init()
	vs := gl.CreateShader(gl.VERTEX_SHADER)
	vs.Source(
		LoadFileToString("s1.vert"))
	vs.Compile()

	fs := gl.CreateShader(gl.FRAGMENT_SHADER)
	fs.Source(LoadFileToString("s1.frag"))
	fs.Compile()

	pg := gl.CreateProgram()
	pg.AttachShader(vs)
	pg.AttachShader(fs)
	pg.Link()
	pg.Validate()

	pg.Use()
	fmt.Println("**Shader log**")
	fmt.Println(fs.GetInfoLog())
	fmt.Println(vs.GetInfoLog())
	fmt.Println(pg.GetInfoLog())
	fmt.Println("******END*****")

	gl.ClearColor(0.5, 0.5, 1, 0)
	gl.Enable(gl.DEPTH_TEST)
	gl.Enable(gl.BLEND)
	gl.Enable(gl.POLYGON_SMOOTH)
	gl.Hint(gl.POLYGON_SMOOTH_HINT, gl.NICEST)

	var t float64
	t = float64(time.Nanoseconds()) / 1000000000
	cam1 := Camera{player, 100, Vec3{0, 0, 0}}
	glfw.AddListener(func(m glfw.MouseMoveEvent) {
		cam1.Angle.X = float32(m.X-400) / 400 * 3.14 * 2
		cam1.Angle.Y = float32(m.Y-300) / 300 * 3.14 * 2
		//player.Rotation = Vec3{cam1.Angle.X,cam1.Angle.Y,0}
	})
	glfw.AddListener(func(mw glfw.MouseWheelEvent) {
		cam1.Distance = 100 + float32(mw.Pos*mw.Pos*mw.Pos)
	})

	world.CompilePhysicsObjects()
	for it := 0; it < 10000; it += 1 {
		cam1.Setup()
		dt := float32(0.005)
		t = float64(float64(time.Nanoseconds()) / 1000000000)
		UpdatePositions(world.PhysicsObjects, dt)

		UpdateModelStates(world.PhysicsObjects)

		UpdateCollisions(world.GameObjectTree, dt)
		UpdateModelStates(world.PhysicsObjects)
		gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
		DrawWorld(world.GameObjects, dt, pg)
		glfw.SwapBuffers()
		pt := float64(float64(time.Nanoseconds()) / 1000000000)
		sleeptime := (float64(dt) - (pt - t)) * 10e8
		fmt.Println("Sleep for:", sleeptime)
		time.Sleep(int64(sleeptime))
	}

}
예제 #3
0
파일: main.go 프로젝트: rolfrm/boxworld
func MakeMan(position Vec3) *GameObj {
	body := NewGameObj(position, Vec3{1, 2, 1}, Vec3{0.5, 0.5, 0.5}, 50, 0, nil)

	rleg := NewGameObj(position.Add(Vec3{2, 0, 0}), Vec3{0.5, 0.5, 0.5}, Vec3{0.1, 0.2, 0.3}, 1.1, 5, body)
	rlegc := ObjectConstraint{body, rleg, Vec3{2, -6, 0}, 3000, 200}

	lleg := NewGameObj(Vec3{-2, 0, 0}, Vec3{0.5, 0.5, 0.5}, Vec3{0.3, 0.2, 0.1}, 1.1, 5, body)
	llegc := ObjectConstraint{body, lleg, Vec3{-2, -6, 0}, 3000, 200}

	rarm := NewGameObj(Vec3{2, 10, 0}, Vec3{0.5, 0.5, 0.5}, Vec3{0.1, 0.2, 0.7}, 1, 0, body)
	rarmc := ObjectConstraint{body, rarm, Vec3{2, 4, 0}, 100, 10}

	larm := NewGameObj(Vec3{-2, 10, 0}, Vec3{0.5, 0.5, 0.5}, Vec3{0.3, 0.2, 0.1}, 1, 0, body)
	larmc := ObjectConstraint{body, larm, Vec3{-2, 4, 0}, 100, 10}

	head := NewGameObj(Vec3{0, 5, 0}, Vec3{1, 1, 1}, Vec3{0.5, 0.2, 0.2}, 5, 0, body)
	headc := ObjectConstraint{body, head, Vec3{0, 4, 0}, 1000, 40}

	body.Constraints = []Constraint{&rlegc, &llegc, &rarmc, &headc, &larmc}
	body.Anim = func(self *Box3D, t float32) {

	}
	var jumpBusy bool
	jumpBusy = false
	rleg_begin := rlegc.V
	lleg_begin := llegc.V
	/*larm_begin := larmc.V
		rarm_begin := rarmc.V
		var walkCycle float32 = 0
		var speed float32 = 1
		advAnim := func(self *Box3D,t float32){
			walkCycle += 0.01*speed


			rlegc.V = (rleg_begin.Add(Vec3{0,3,0}.Rotate(walkCycle + math.Pi,0))).Rotate(0, -body.Rotation.X)
			llegc.V = (lleg_begin.Add(Vec3{0,3,0}.Rotate(walkCycle, 0))).Rotate(0, -body.Rotation.X)
			rarmc.V = rarm_begin.Add(Vec3{0,-2,0}.Rotate(walkCycle,0)).Rotate(0,-body.Rotation.X)
			larmc.V = larm_begin.Rotate(0,-body.Rotation.X)


	}
		body.Anim = advAnim
	*/

	StartJump := func(self *Box3D, t float32) {
		jumpStart := t * 3
		if rlegc.V.Y < llegc.V.Y {
			rlegc.V = (rleg_begin.Sub(Vec3{0, 5, -7})).Rotate(0, -body.Rotation.X)
		} else {
			llegc.V = (lleg_begin.Sub(Vec3{0, 5, -7})).Rotate(0, -body.Rotation.X)
		}
		body.Anim = func(self *Box3D, t float32) {
			if t-jumpStart > 0.5 {
				rlegc.V = rleg_begin
				llegc.V = lleg_begin

			}
		}
	}
	var direction float32 = 1

	Walk := func(self *Box3D, t float32) {
		var tc float32 = 0

		body.Anim = func(self *Box3D, t float32) {

			tc = t * 3
			rlegc.V = (rleg_begin.Add(Vec3{0, 3, 0}.Rotate(direction*(tc+math.Pi), 0))).Rotate(0, -body.Rotation.X)
			llegc.V = (lleg_begin.Add(Vec3{0, 3, 0}.Rotate(direction*tc, 0))).Rotate(0, -body.Rotation.X)

		}

	}

	glfw.AddListener(
		func(keyev glfw.KeyEvent) {
			fmt.Println(keyev)
			switch keyev.Key {

			case glfw.KEY_RIGHT, glfw.KEY_D:
				{

				}
			case glfw.KEY_LEFT:
				{

				}
			case glfw.KEY_UP:
				{
					direction = 1
					body.Anim = Walk

				}
			case glfw.KEY_DOWN:
				{
					direction = -1
					body.Anim = Walk
				}
			case glfw.KEY_SPACE:
				{
					if !jumpBusy {
						body.Anim = StartJump
					}
				}
			}
		})

	return body

}