Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Andrey Kiselev
Astronaut
Commits
53541c14
Commit
53541c14
authored
Jul 04, 2016
by
Andrey Kiselev
Browse files
Initial commit. Workign code, used for demo.
parents
Changes
186
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
3795 additions
and
0 deletions
+3795
-0
js/MTLLoader.js
js/MTLLoader.js
+466
-0
js/OBJMTLLoader.js
js/OBJMTLLoader.js
+374
-0
js/OrbitControls.js
js/OrbitControls.js
+1115
-0
js/TGALoader.js
js/TGALoader.js
+483
-0
js/jquery-2.1.4.min.js
js/jquery-2.1.4.min.js
+4
-0
js/postprocessing/AdaptiveToneMappingPass.js
js/postprocessing/AdaptiveToneMappingPass.js
+315
-0
js/postprocessing/BloomPass.js
js/postprocessing/BloomPass.js
+115
-0
js/postprocessing/BokehPass.js
js/postprocessing/BokehPass.js
+102
-0
js/postprocessing/DotScreenPass.js
js/postprocessing/DotScreenPass.js
+60
-0
js/postprocessing/EffectComposer.js
js/postprocessing/EffectComposer.js
+137
-0
js/postprocessing/FilmPass.js
js/postprocessing/FilmPass.js
+61
-0
js/postprocessing/GlitchPass.js
js/postprocessing/GlitchPass.js
+112
-0
js/postprocessing/MaskPass.js
js/postprocessing/MaskPass.js
+86
-0
js/postprocessing/RenderPass.js
js/postprocessing/RenderPass.js
+51
-0
js/postprocessing/SavePass.js
js/postprocessing/SavePass.js
+62
-0
js/postprocessing/ShaderPass.js
js/postprocessing/ShaderPass.js
+59
-0
js/postprocessing/TexturePass.js
js/postprocessing/TexturePass.js
+47
-0
js/shaders/BasicShader.js
js/shaders/BasicShader.js
+31
-0
js/shaders/BleachBypassShader.js
js/shaders/BleachBypassShader.js
+64
-0
js/shaders/BlendShader.js
js/shaders/BlendShader.js
+51
-0
No files found.
js/MTLLoader.js
0 → 100644
View file @
53541c14
/**
* Loads a Wavefront .mtl file specifying materials
*
* @author angelxuanchang
*/
THREE
.
MTLLoader
=
function
(
manager
)
{
this
.
manager
=
(
manager
!==
undefined
)
?
manager
:
THREE
.
DefaultLoadingManager
;
};
THREE
.
MTLLoader
.
prototype
=
{
constructor
:
THREE
.
MTLLoader
,
load
:
function
(
url
,
onLoad
,
onProgress
,
onError
)
{
var
scope
=
this
;
var
loader
=
new
THREE
.
XHRLoader
(
this
.
manager
);
loader
.
setCrossOrigin
(
this
.
crossOrigin
);
loader
.
load
(
url
,
function
(
text
)
{
onLoad
(
scope
.
parse
(
text
)
);
},
onProgress
,
onError
);
},
setBaseUrl
:
function
(
value
)
{
this
.
baseUrl
=
value
;
},
setCrossOrigin
:
function
(
value
)
{
this
.
crossOrigin
=
value
;
},
setMaterialOptions
:
function
(
value
)
{
this
.
materialOptions
=
value
;
},
/**
* Parses loaded MTL file
* @param text - Content of MTL file
* @return {THREE.MTLLoader.MaterialCreator}
*/
parse
:
function
(
text
)
{
var
lines
=
text
.
split
(
"
\n
"
);
var
info
=
{};
var
delimiter_pattern
=
/
\s
+/
;
var
materialsInfo
=
{};
for
(
var
i
=
0
;
i
<
lines
.
length
;
i
++
)
{
var
line
=
lines
[
i
];
line
=
line
.
trim
();
if
(
line
.
length
===
0
||
line
.
charAt
(
0
)
===
'
#
'
)
{
// Blank line or comment ignore
continue
;
}
var
pos
=
line
.
indexOf
(
'
'
);
var
key
=
(
pos
>=
0
)
?
line
.
substring
(
0
,
pos
)
:
line
;
key
=
key
.
toLowerCase
();
var
value
=
(
pos
>=
0
)
?
line
.
substring
(
pos
+
1
)
:
""
;
value
=
value
.
trim
();
if
(
key
===
"
newmtl
"
)
{
// New material
info
=
{
name
:
value
};
materialsInfo
[
value
]
=
info
;
}
else
if
(
info
)
{
if
(
key
===
"
ka
"
||
key
===
"
kd
"
||
key
===
"
ks
"
)
{
var
ss
=
value
.
split
(
delimiter_pattern
,
3
);
info
[
key
]
=
[
parseFloat
(
ss
[
0
]
),
parseFloat
(
ss
[
1
]
),
parseFloat
(
ss
[
2
]
)
];
}
else
{
info
[
key
]
=
value
;
}
}
}
var
materialCreator
=
new
THREE
.
MTLLoader
.
MaterialCreator
(
this
.
baseUrl
,
this
.
materialOptions
);
materialCreator
.
setCrossOrigin
(
this
.
crossOrigin
);
materialCreator
.
setManager
(
this
.
manager
);
materialCreator
.
setMaterials
(
materialsInfo
);
return
materialCreator
;
}
};
/**
* Create a new THREE-MTLLoader.MaterialCreator
* @param baseUrl - Url relative to which textures are loaded
* @param options - Set of options on how to construct the materials
* side: Which side to apply the material
* THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide
* wrap: What type of wrapping to apply for textures
* THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping
* normalizeRGB: RGBs need to be normalized to 0-1 from 0-255
* Default: false, assumed to be already normalized
* ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's
* Default: false
* invertTransparency: If transparency need to be inverted (inversion is needed if d = 0 is fully opaque)
* Default: false (d = 1 is fully opaque)
* @constructor
*/
THREE
.
MTLLoader
.
MaterialCreator
=
function
(
baseUrl
,
options
)
{
this
.
baseUrl
=
baseUrl
;
this
.
options
=
options
;
this
.
materialsInfo
=
{};
this
.
materials
=
{};
this
.
materialsArray
=
[];
this
.
nameLookup
=
{};
this
.
side
=
(
this
.
options
&&
this
.
options
.
side
)
?
this
.
options
.
side
:
THREE
.
FrontSide
;
this
.
wrap
=
(
this
.
options
&&
this
.
options
.
wrap
)
?
this
.
options
.
wrap
:
THREE
.
RepeatWrapping
;
};
THREE
.
MTLLoader
.
MaterialCreator
.
prototype
=
{
constructor
:
THREE
.
MTLLoader
.
MaterialCreator
,
setCrossOrigin
:
function
(
value
)
{
this
.
crossOrigin
=
value
;
},
setManager
:
function
(
value
)
{
this
.
manager
=
value
;
},
setMaterials
:
function
(
materialsInfo
)
{
this
.
materialsInfo
=
this
.
convert
(
materialsInfo
);
this
.
materials
=
{};
this
.
materialsArray
=
[];
this
.
nameLookup
=
{};
},
convert
:
function
(
materialsInfo
)
{
if
(
!
this
.
options
)
return
materialsInfo
;
var
converted
=
{};
for
(
var
mn
in
materialsInfo
)
{
// Convert materials info into normalized form based on options
var
mat
=
materialsInfo
[
mn
];
var
covmat
=
{};
converted
[
mn
]
=
covmat
;
for
(
var
prop
in
mat
)
{
var
save
=
true
;
var
value
=
mat
[
prop
];
var
lprop
=
prop
.
toLowerCase
();
switch
(
lprop
)
{
case
'
kd
'
:
case
'
ka
'
:
case
'
ks
'
:
// Diffuse color (color under white light) using RGB values
if
(
this
.
options
&&
this
.
options
.
normalizeRGB
)
{
value
=
[
value
[
0
]
/
255
,
value
[
1
]
/
255
,
value
[
2
]
/
255
];
}
if
(
this
.
options
&&
this
.
options
.
ignoreZeroRGBs
)
{
if
(
value
[
0
]
===
0
&&
value
[
1
]
===
0
&&
value
[
1
]
===
0
)
{
// ignore
save
=
false
;
}
}
break
;
case
'
d
'
:
// According to MTL format (http://paulbourke.net/dataformats/mtl/):
// d is dissolve for current material
// factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)
if
(
this
.
options
&&
this
.
options
.
invertTransparency
)
{
value
=
1
-
value
;
}
break
;
default
:
break
;
}
if
(
save
)
{
covmat
[
lprop
]
=
value
;
}
}
}
return
converted
;
},
preload
:
function
()
{
for
(
var
mn
in
this
.
materialsInfo
)
{
this
.
create
(
mn
);
}
},
getIndex
:
function
(
materialName
)
{
return
this
.
nameLookup
[
materialName
];
},
getAsArray
:
function
()
{
var
index
=
0
;
for
(
var
mn
in
this
.
materialsInfo
)
{
this
.
materialsArray
[
index
]
=
this
.
create
(
mn
);
this
.
nameLookup
[
mn
]
=
index
;
index
++
;
}
return
this
.
materialsArray
;
},
create
:
function
(
materialName
)
{
if
(
this
.
materials
[
materialName
]
===
undefined
)
{
this
.
createMaterial_
(
materialName
);
}
return
this
.
materials
[
materialName
];
},
createMaterial_
:
function
(
materialName
)
{
// Create material
var
mat
=
this
.
materialsInfo
[
materialName
];
var
params
=
{
name
:
materialName
,
side
:
this
.
side
};
for
(
var
prop
in
mat
)
{
var
value
=
mat
[
prop
];
switch
(
prop
.
toLowerCase
()
)
{
// Ns is material specular exponent
case
'
kd
'
:
// Diffuse color (color under white light) using RGB values
params
[
'
color
'
]
=
new
THREE
.
Color
().
fromArray
(
value
);
break
;
case
'
ka
'
:
// Ambient color (color under shadow) using RGB values
break
;
case
'
ks
'
:
// Specular color (color when light is reflected from shiny surface) using RGB values
params
[
'
specular
'
]
=
new
THREE
.
Color
().
fromArray
(
value
);
break
;
case
'
map_kd
'
:
// Diffuse texture map
params
[
'
map
'
]
=
this
.
loadTexture
(
this
.
baseUrl
+
value
);
params
[
'
map
'
].
wrapS
=
this
.
wrap
;
params
[
'
map
'
].
wrapT
=
this
.
wrap
;
break
;
case
'
ns
'
:
// The specular exponent (defines the focus of the specular highlight)
// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
params
[
'
shininess
'
]
=
parseFloat
(
value
);
break
;
case
'
d
'
:
// According to MTL format (http://paulbourke.net/dataformats/mtl/):
// d is dissolve for current material
// factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)
if
(
value
<
1
)
{
params
[
'
transparent
'
]
=
true
;
params
[
'
opacity
'
]
=
value
;
}
break
;
case
'
map_bump
'
:
case
'
bump
'
:
// Bump texture map
if
(
params
[
'
bumpMap
'
]
)
break
;
// Avoid loading twice.
params
[
'
bumpMap
'
]
=
this
.
loadTexture
(
this
.
baseUrl
+
value
);
params
[
'
bumpMap
'
].
wrapS
=
this
.
wrap
;
params
[
'
bumpMap
'
].
wrapT
=
this
.
wrap
;
break
;
default
:
break
;
}
}
this
.
materials
[
materialName
]
=
new
THREE
.
MeshPhongMaterial
(
params
);
return
this
.
materials
[
materialName
];
},
loadTexture
:
function
(
url
,
mapping
,
onLoad
,
onProgress
,
onError
)
{
var
texture
;
var
loader
=
THREE
.
Loader
.
Handlers
.
get
(
url
);
var
manager
=
(
this
.
manager
!==
undefined
)
?
this
.
manager
:
THREE
.
DefaultLoadingManager
;
if
(
loader
!==
null
)
{
texture
=
loader
.
load
(
url
,
onLoad
);
}
else
{
texture
=
new
THREE
.
Texture
();
loader
=
new
THREE
.
ImageLoader
(
manager
);
loader
.
setCrossOrigin
(
this
.
crossOrigin
);
loader
.
load
(
url
,
function
(
image
)
{
texture
.
image
=
THREE
.
MTLLoader
.
ensurePowerOfTwo_
(
image
);
texture
.
needsUpdate
=
true
;
if
(
onLoad
)
onLoad
(
texture
);
},
onProgress
,
onError
);
}
if
(
mapping
!==
undefined
)
texture
.
mapping
=
mapping
;
return
texture
;
}
};
THREE
.
MTLLoader
.
ensurePowerOfTwo_
=
function
(
image
)
{
if
(
!
THREE
.
Math
.
isPowerOfTwo
(
image
.
width
)
||
!
THREE
.
Math
.
isPowerOfTwo
(
image
.
height
)
)
{
var
canvas
=
document
.
createElement
(
"
canvas
"
);
canvas
.
width
=
THREE
.
MTLLoader
.
nextHighestPowerOfTwo_
(
image
.
width
);
canvas
.
height
=
THREE
.
MTLLoader
.
nextHighestPowerOfTwo_
(
image
.
height
);
var
ctx
=
canvas
.
getContext
(
"
2d
"
);
ctx
.
drawImage
(
image
,
0
,
0
,
image
.
width
,
image
.
height
,
0
,
0
,
canvas
.
width
,
canvas
.
height
);
return
canvas
;
}
return
image
;
};
THREE
.
MTLLoader
.
nextHighestPowerOfTwo_
=
function
(
x
)
{
--
x
;
for
(
var
i
=
1
;
i
<
32
;
i
<<=
1
)
{
x
=
x
|
x
>>
i
;
}
return
x
+
1
;
};
THREE
.
EventDispatcher
.
prototype
.
apply
(
THREE
.
MTLLoader
.
prototype
);
js/OBJMTLLoader.js
0 → 100644
View file @
53541c14
/**
* Loads a Wavefront .obj file with materials
*
* @author mrdoob / http://mrdoob.com/
* @author angelxuanchang
*/
THREE
.
OBJMTLLoader
=
function
(
manager
)
{
this
.
manager
=
(
manager
!==
undefined
)
?
manager
:
THREE
.
DefaultLoadingManager
;
};
THREE
.
OBJMTLLoader
.
prototype
=
{
constructor
:
THREE
.
OBJMTLLoader
,
load
:
function
(
url
,
mtlurl
,
onLoad
,
onProgress
,
onError
)
{
var
scope
=
this
;
var
mtlLoader
=
new
THREE
.
MTLLoader
(
this
.
manager
);
mtlLoader
.
setBaseUrl
(
url
.
substr
(
0
,
url
.
lastIndexOf
(
"
/
"
)
+
1
)
);
mtlLoader
.
setCrossOrigin
(
this
.
crossOrigin
);
mtlLoader
.
load
(
mtlurl
,
function
(
materials
)
{
var
materialsCreator
=
materials
;
materialsCreator
.
preload
();
var
loader
=
new
THREE
.
XHRLoader
(
scope
.
manager
);
loader
.
setCrossOrigin
(
scope
.
crossOrigin
);
loader
.
load
(
url
,
function
(
text
)
{
var
object
=
scope
.
parse
(
text
);
object
.
traverse
(
function
(
object
)
{
if
(
object
instanceof
THREE
.
Mesh
)
{
if
(
object
.
material
.
name
)
{
var
material
=
materialsCreator
.
create
(
object
.
material
.
name
);
if
(
material
)
object
.
material
=
material
;
}
}
}
);
onLoad
(
object
);
},
onProgress
,
onError
);
},
onProgress
,
onError
);
},
setCrossOrigin
:
function
(
value
)
{
this
.
crossOrigin
=
value
;
},
/**
* Parses loaded .obj file
* @param data - content of .obj file
* @param mtllibCallback - callback to handle mtllib declaration (optional)
* @return {THREE.Object3D} - Object3D (with default material)
*/
parse
:
function
(
data
,
mtllibCallback
)
{
function
vector
(
x
,
y
,
z
)
{
return
new
THREE
.
Vector3
(
x
,
y
,
z
);
}
function
uv
(
u
,
v
)
{
return
new
THREE
.
Vector2
(
u
,
v
);
}
function
face3
(
a
,
b
,
c
,
normals
)
{
return
new
THREE
.
Face3
(
a
,
b
,
c
,
normals
);
}
var
face_offset
=
0
;
function
meshN
(
meshName
,
materialName
)
{
if
(
vertices
.
length
>
0
)
{
geometry
.
vertices
=
vertices
;
geometry
.
mergeVertices
();
geometry
.
computeFaceNormals
();
geometry
.
computeBoundingSphere
();
object
.
add
(
mesh
);
geometry
=
new
THREE
.
Geometry
();
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
);
}
if
(
meshName
!==
undefined
)
mesh
.
name
=
meshName
;
if
(
materialName
!==
undefined
)
{
material
=
new
THREE
.
MeshLambertMaterial
();
material
.
name
=
materialName
;
mesh
.
material
=
material
;
}
}
var
group
=
new
THREE
.
Group
();
var
object
=
group
;
var
geometry
=
new
THREE
.
Geometry
();
var
material
=
new
THREE
.
MeshLambertMaterial
();
var
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
);
var
vertices
=
[];
var
normals
=
[];
var
uvs
=
[];
function
add_face
(
a
,
b
,
c
,
normals_inds
)
{
if
(
normals_inds
===
undefined
)
{
geometry
.
faces
.
push
(
face3
(
parseInt
(
a
)
-
(
face_offset
+
1
),
parseInt
(
b
)
-
(
face_offset
+
1
),
parseInt
(
c
)
-
(
face_offset
+
1
)
)
);
}
else
{
geometry
.
faces
.
push
(
face3
(
parseInt
(
a
)
-
(
face_offset
+
1
),
parseInt
(
b
)
-
(
face_offset
+
1
),
parseInt
(
c
)
-
(
face_offset
+
1
),
[
normals
[
parseInt
(
normals_inds
[
0
]
)
-
1
].
clone
(),
normals
[
parseInt
(
normals_inds
[
1
]
)
-
1
].
clone
(),
normals
[
parseInt
(
normals_inds
[
2
]
)
-
1
].
clone
()
]
)
);
}
}