Code archives/3D Graphics - Misc/3d movie playback

This code has been declared by its author to be Public Domain code.

Download source code

3d movie playback by Rob2003
I recommend you use animstrips instead of avi files due to the limitations playing movies brings.

This example is suited to the beginner wanting to try cool 3D effects. The 168k zip file includes a movie to test with.

Grab it from here: http://www.redsoft.pwp.blueyonder.co.uk/files/movie3d.zip
.

Comments

Panno2005
broken link


jfk EO-111102007
since it's pubic domain, is there anybody who's got movie3d.zip on their hardrive? Please repost, even if it's only the source without media. thanks.

Meanwhile, use this:

; playing a movie in a texture
Graphics3D 640,480,32,2
SetBuffer BackBuffer()

camera=CreateCamera()
TranslateEntity camera,0,0,-4

light=CreateLight()
RotateEntity light, 45,45,0

cube=CreateCube()

tex=CreateTexture(256,256,256)
EntityTexture cube,tex


movie_file$="test.avi"
movie=OpenMovie(movie_file$)


While KeyDown(1)=0
 dummy=DrawMovie(movie,0,0,256,256) ; here you can scale the movie to the texture size most efficiently
 CopyRect 0,0,256,256,0,0,BackBuffer(),TextureBuffer(tex)
 If MoviePlaying(movie)=0 Then
  CloseMovie movie
  movie=OpenMovie(movie_file$) ; reload when finished = loop
 EndIf
 TurnEntity cube,.2,.4,.6
 RenderWorld()
 Flip
Wend

CloseMovie movie
End



puki2007
; Simple movie on 3D Object example (rob@...)
; sample avi was a simple quicktime trailer preview converted.

; for best results and efficient memory usage please use power of two sizes.
; ie. 256x256


Graphics3D 640,480,16,2
camera=CreateCamera()
light=CreateLight()

;create texture for the movie & 3d entity
movietex = CreateTexture(256,256,256+48)
cube = CreateCube()
EntityTexture cube,movietex
MoveEntity cube,0,0,6
EntityFX cube,16
EntityBlend cube,3
For i=0 To 3
	temp=CopyEntity(cube,cube)
	PositionEntity temp,Rnd(-10,10),Rnd(-10,10),Rnd(-10,10)
Next

;load movie
movie = OpenMovie("sample.avi")

While Not KeyHit(1)
	; this is just a delay before updating movie

	If t>2
		t=0
		If MoviePlaying(movie)=0 Then movie = OpenMovie("sample.avi")
		DrawMovie(movie)
		CopyRect 0,0,256,128,0,0,BackBuffer(),TextureBuffer(movietex)
	EndIf
	t=t+1
	
	TurnEntity cube,-.4,.4,0
	RenderWorld

	Flip
Wend
End



jfk EO-111102007
Thanks Puki. Note:
If MoviePlaying(movie)=0 Then movie = OpenMovie("sample.avi")

is likely to cause a memory leak, so it should be:
If MoviePlaying(movie)=0 Then 
 closemovie movie
 movie = OpenMovie("sample.avi")
endif

I even recall when you end the program with an opened movie then this may result in some kind of error - at least on some OSes.
In the first version of the directShow implementation this didn't happen, but after the compiler bugfix for a general movie memory leak, closing all movies became mandatory.


John Blackledge2007
I still prefer this method:

Set up the texture on the model:-
 movietex = CreateTexture(256, 256 * Float(MovieHeight(hmovie)) / Float(hmovie)) )
 EntityTexture_(Model,movietex)


Play directly on to that texture:-
SetBuffer TextureBuffer(movietex)
DrawMovie(hmovie,0,0,MovieWidth(hmovie),MovieHeight(hmovie))
SetBuffer BackBuffer()



John Blackledge2007
Hah - I knew I had it somewhere.
Playing a movie onto an object without CopyRect().

Isn't that strange - other than that, Puki's code looks very like mine.

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

font=LoadFont("arial",20) : SetFont font
camera=CreateCamera() : light=CreateLight()
cube = CreateCube() : MoveEntity cube,0,0,3 : ScaleEntity cube,1,0.5,1
movietex = CreateTexture(256,128) : EntityTexture cube,movietex
movie$ = "sample.avi" ; <- your movie here ; any AVI or MPG
hmovie = OpenMovie(movie$)
framePeriod = 1000/30 : frametimer = CreateTimer(framePeriod)

While Not KeyHit(1)
	WaitTimer frametimer
	If t>5
		t=0
		If Not MoviePlaying(hmovie)
			CloseMovie(hmovie)
			hmovie = OpenMovie(movie$)
			frame = 0
		Else
			SetBuffer	TextureBuffer(movietex)
			DrawMovie(hmovie)
			frame = frame + 1 : Color 255,255,255	:	Text 0,0,"Frame "+frame
			SetBuffer BackBuffer()
		EndIf
	EndIf
	t=t+1
	TurnEntity cube,0,.4,0
	UpdateWorld() : RenderWorld()
	Text 0,0,"AvailVidMem() "+AvailVidMem()
	Flip()
Wend
End



_332008
The version from jfk EO-11110 seems like a solid flexible implementation. John Blackledge's example about playing direct on texture doesn't work on my system. Also, playing AVIs don't work at all on all these examples, neither does vob files from DVDs, only MPG, MPEG or WMVs play ok here.


Code Archives Forum