mirror of https://github.com/buggins/dlangui.git
bump mapping
This commit is contained in:
parent
a8dec6c632
commit
f5db3da85f
|
@ -148,7 +148,7 @@ class UiWidget : VerticalLayout, CellVisitor {
|
||||||
Node3d cubeNode = new Node3d("cubes", cubeDrawable);
|
Node3d cubeNode = new Node3d("cubes", cubeDrawable);
|
||||||
_scene.addChild(cubeNode);
|
_scene.addChild(cubeNode);
|
||||||
|
|
||||||
{
|
debug(fbximport) {
|
||||||
// test FBX import
|
// test FBX import
|
||||||
FbxModelImport importer;
|
FbxModelImport importer;
|
||||||
string src = loadTextResource("suzanne.fbx");
|
string src = loadTextResource("suzanne.fbx");
|
||||||
|
@ -166,10 +166,17 @@ class UiWidget : VerticalLayout, CellVisitor {
|
||||||
//suzanneMaterial.specular = true;
|
//suzanneMaterial.specular = true;
|
||||||
Model suzanneDrawable = new Model(suzanneMaterial, importer.mesh);
|
Model suzanneDrawable = new Model(suzanneMaterial, importer.mesh);
|
||||||
suzanneNode = new Node3d("suzanne", suzanneDrawable);
|
suzanneNode = new Node3d("suzanne", suzanneDrawable);
|
||||||
//suzanneNode.translate(vec3(3, 4, 5));
|
suzanneNode.translate(vec3(2, 3, -5));
|
||||||
_scene.addChild(suzanneNode);
|
_scene.addChild(suzanneNode);
|
||||||
|
|
||||||
|
|
||||||
|
brickNode = new Node3d("brick");
|
||||||
|
brickNode.translate(vec3(-2, 3, -3));
|
||||||
|
Mesh brickMesh = Mesh.createCubeMesh(vec3(0, 0, 0), 0.8, vec4(0.8, 0.8, 0.8, 1));
|
||||||
|
Material brickMaterial = new Material(EffectId("textured.vert", "textured.frag", null), "brick", "brickn"); // with bump mapping
|
||||||
|
brickNode.drawable = new Model(brickMaterial, brickMesh);
|
||||||
|
_scene.addChild(brickNode);
|
||||||
|
|
||||||
_minerMesh = new Mesh(VertexFormat(VertexElementType.POSITION, VertexElementType.NORMAL, VertexElementType.COLOR, VertexElementType.TEXCOORD0));
|
_minerMesh = new Mesh(VertexFormat(VertexElementType.POSITION, VertexElementType.NORMAL, VertexElementType.COLOR, VertexElementType.TEXCOORD0));
|
||||||
_world = new World();
|
_world = new World();
|
||||||
_world.setCell(0, 11, 10, 2);
|
_world.setCell(0, 11, 10, 2);
|
||||||
|
@ -210,6 +217,7 @@ class UiWidget : VerticalLayout, CellVisitor {
|
||||||
|
|
||||||
Node3d dirLightNode;
|
Node3d dirLightNode;
|
||||||
Node3d suzanneNode;
|
Node3d suzanneNode;
|
||||||
|
Node3d brickNode;
|
||||||
|
|
||||||
float rotationX;
|
float rotationX;
|
||||||
float rotationY;
|
float rotationY;
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 475 KiB |
Binary file not shown.
After Width: | Height: | Size: 530 KiB |
|
@ -4,6 +4,8 @@ res/mdpi/cr3_logo.png
|
||||||
res/mdpi/tx_fabric.jpg
|
res/mdpi/tx_fabric.jpg
|
||||||
res/mdpi/crate.png
|
res/mdpi/crate.png
|
||||||
res/mdpi/blocks.png
|
res/mdpi/blocks.png
|
||||||
|
res/mdpi/brick.png
|
||||||
|
res/mdpi/brickn.png
|
||||||
res/models/suzanne.obj
|
res/models/suzanne.obj
|
||||||
res/models/suzanne.fbx
|
res/models/suzanne.fbx
|
||||||
res/shaders/colored.vert
|
res/shaders/colored.vert
|
||||||
|
|
|
@ -25,24 +25,29 @@ class Material : RefCountedObject {
|
||||||
protected TextureRef _texture;
|
protected TextureRef _texture;
|
||||||
protected string _textureId;
|
protected string _textureId;
|
||||||
|
|
||||||
|
protected TextureRef _bumpTexture;
|
||||||
|
protected string _bumpTextureId;
|
||||||
|
|
||||||
// colors
|
// colors
|
||||||
protected vec4 _diffuseColor = vec4(1, 1, 1, 1);
|
protected vec4 _diffuseColor = vec4(1, 1, 1, 1);
|
||||||
protected vec3 _ambientColor = vec3(0.2, 0.2, 0.2);
|
protected vec3 _ambientColor = vec3(0.2, 0.2, 0.2);
|
||||||
protected vec4 _modulateColor = vec4(1, 1, 1, 1);
|
protected vec4 _modulateColor = vec4(1, 1, 1, 1);
|
||||||
protected float _modulateAlpha = 1;
|
protected float _modulateAlpha = 1;
|
||||||
|
|
||||||
protected bool _specular = false;
|
/// 0 - specular is disabled, 1 .. 256 - specular exponent
|
||||||
|
protected float _specular = 0;
|
||||||
|
|
||||||
// TODO: more material properties
|
// TODO: more material properties
|
||||||
|
|
||||||
this() {
|
this() {
|
||||||
}
|
}
|
||||||
|
|
||||||
this(EffectId effectId, string textureId) {
|
this(EffectId effectId, string textureId, string bumpTextureId = null) {
|
||||||
_effectId = effectId;
|
_effectId = effectId;
|
||||||
_autoEffectParams = null;
|
_autoEffectParams = null;
|
||||||
_autoEffectId = effectId;
|
_autoEffectId = effectId;
|
||||||
_textureId = textureId;
|
_textureId = textureId;
|
||||||
|
_bumpTextureId = bumpTextureId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@property vec4 diffuseColor() { return _diffuseColor; }
|
@property vec4 diffuseColor() { return _diffuseColor; }
|
||||||
|
@ -53,8 +58,8 @@ class Material : RefCountedObject {
|
||||||
@property Material modulateColor(vec4 color) { _modulateColor = color; return this; }
|
@property Material modulateColor(vec4 color) { _modulateColor = color; return this; }
|
||||||
@property float modulateAlpha() { return _modulateAlpha; }
|
@property float modulateAlpha() { return _modulateAlpha; }
|
||||||
@property Material modulateColor(float a) { _modulateAlpha = a; return this; }
|
@property Material modulateColor(float a) { _modulateAlpha = a; return this; }
|
||||||
@property bool specular() { return _specular; }
|
@property float specular() { return _specular; }
|
||||||
@property Material specular(bool a) { _specular = a; return this; }
|
@property Material specular(float a) { _specular = a; return this; }
|
||||||
|
|
||||||
@property EffectRef effect() {
|
@property EffectRef effect() {
|
||||||
if (_effect.isNull && !_autoEffectId.empty)
|
if (_effect.isNull && !_autoEffectId.empty)
|
||||||
|
@ -105,10 +110,33 @@ class Material : RefCountedObject {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@property TextureRef bumpTexture() {
|
||||||
|
if (_bumpTexture.isNull && _bumpTextureId.length) {
|
||||||
|
_bumpTexture = GLTextureCache.instance.get(_bumpTextureId);
|
||||||
|
}
|
||||||
|
return _bumpTexture;
|
||||||
|
}
|
||||||
|
/// set texture
|
||||||
|
@property Material bumpTexture(TextureRef e) {
|
||||||
|
_bumpTexture = e;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/// set texture from resourceId
|
||||||
|
@property Material bumpTexture(string resourceId) {
|
||||||
|
if (_bumpTextureId == resourceId)
|
||||||
|
return this; // no change
|
||||||
|
_bumpTexture.clear();
|
||||||
|
_bumpTextureId = resourceId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private AutoParams _lastParams;
|
private AutoParams _lastParams;
|
||||||
private string _lastDefs;
|
private string _lastDefs;
|
||||||
string calcAutoEffectParams(Mesh mesh, LightParams * lights) {
|
string calcAutoEffectParams(Mesh mesh, LightParams * lights) {
|
||||||
AutoParams newParams = AutoParams(mesh, lights, _specular);
|
AutoParams newParams = AutoParams(mesh, lights, _specular, !bumpTexture.isNull);
|
||||||
if (newParams != _lastParams) {
|
if (newParams != _lastParams) {
|
||||||
_lastParams = newParams;
|
_lastParams = newParams;
|
||||||
_lastDefs = _lastParams.defs;
|
_lastDefs = _lastParams.defs;
|
||||||
|
@ -124,6 +152,10 @@ class Material : RefCountedObject {
|
||||||
texture.texture.setup();
|
texture.texture.setup();
|
||||||
texture.texture.setSamplerParams(true);
|
texture.texture.setSamplerParams(true);
|
||||||
}
|
}
|
||||||
|
if (!bumpTexture.isNull) {
|
||||||
|
bumpTexture.texture.setup(1);
|
||||||
|
bumpTexture.texture.setSamplerParams(true);
|
||||||
|
}
|
||||||
// matrixes, positions uniforms
|
// matrixes, positions uniforms
|
||||||
if (_effect.hasUniform(DefaultUniform.u_worldViewProjectionMatrix))
|
if (_effect.hasUniform(DefaultUniform.u_worldViewProjectionMatrix))
|
||||||
_effect.setUniform(DefaultUniform.u_worldViewProjectionMatrix, node.projectionViewModelMatrix);
|
_effect.setUniform(DefaultUniform.u_worldViewProjectionMatrix, node.projectionViewModelMatrix);
|
||||||
|
@ -143,6 +175,8 @@ class Material : RefCountedObject {
|
||||||
_effect.setUniform(DefaultUniform.u_modulateColor, _modulateColor);
|
_effect.setUniform(DefaultUniform.u_modulateColor, _modulateColor);
|
||||||
if (_effect.hasUniform(DefaultUniform.u_modulateAlpha))
|
if (_effect.hasUniform(DefaultUniform.u_modulateAlpha))
|
||||||
_effect.setUniform(DefaultUniform.u_modulateAlpha, _modulateAlpha);
|
_effect.setUniform(DefaultUniform.u_modulateAlpha, _modulateAlpha);
|
||||||
|
if (_effect.hasUniform(DefaultUniform.u_specularExponent))
|
||||||
|
_effect.setUniform(DefaultUniform.u_specularExponent, _specular);
|
||||||
|
|
||||||
// lighting uniforms
|
// lighting uniforms
|
||||||
if (lights && !lights.empty) {
|
if (lights && !lights.empty) {
|
||||||
|
@ -197,7 +231,8 @@ struct AutoParams {
|
||||||
ubyte spotLightCount = 0;
|
ubyte spotLightCount = 0;
|
||||||
bool vertexColor = false;
|
bool vertexColor = false;
|
||||||
bool specular = false;
|
bool specular = false;
|
||||||
this(Mesh mesh, LightParams * lights, bool specular) {
|
bool bumpMapping = false;
|
||||||
|
this(Mesh mesh, LightParams * lights, float specular, bool bumpMapping) {
|
||||||
if (mesh)
|
if (mesh)
|
||||||
vertexColor = mesh.hasElement(VertexElementType.COLOR);
|
vertexColor = mesh.hasElement(VertexElementType.COLOR);
|
||||||
if (lights) {
|
if (lights) {
|
||||||
|
@ -205,7 +240,8 @@ struct AutoParams {
|
||||||
pointLightCount = cast(ubyte)lights.u_pointLightPosition.length;
|
pointLightCount = cast(ubyte)lights.u_pointLightPosition.length;
|
||||||
spotLightCount = cast(ubyte)lights.u_spotLightPosition.length;
|
spotLightCount = cast(ubyte)lights.u_spotLightPosition.length;
|
||||||
}
|
}
|
||||||
this.specular = specular;
|
this.specular = specular > 0.01;
|
||||||
|
this.bumpMapping = bumpMapping;
|
||||||
}
|
}
|
||||||
string defs() {
|
string defs() {
|
||||||
char[] buf;
|
char[] buf;
|
||||||
|
@ -235,6 +271,11 @@ struct AutoParams {
|
||||||
buf ~= ";";
|
buf ~= ";";
|
||||||
buf ~= "SPECULAR";
|
buf ~= "SPECULAR";
|
||||||
}
|
}
|
||||||
|
if (bumpMapping) {
|
||||||
|
if (buf.length)
|
||||||
|
buf ~= ";";
|
||||||
|
buf ~= "BUMPED";
|
||||||
|
}
|
||||||
return buf.dup;
|
return buf.dup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue